本文最后更新于:2024年7月24日 晚上
概述
618 买了几个便宜的 Purple PI OH 开发板 (500 块多一点买了 3 个🤑), 这个开发板类似树莓派,是基于 Rockchip(瑞芯微) 的 rx3566 arm64 芯片。如下:
买来是用作家庭服务器或家庭实验室的。主要考虑就是:
便宜
可玩性高
功耗低
散热小,运行安静
Arm64 现在生态还凑活
其配置如下(选择部分说明):
SOC: RockChip RK3566
CPU: 四核 64 位 Cortex-A55 处理器,主频最高 1.8GHz
最高支持 8GB 高速 LPDDR4,速率高达 1066Mbps (我买的是 2G 版本的)
存储:eMMC 默认 8GB(可选 16GB/32GB/64GB)(我买的是 16G 版本的)
1 路 HDMI2.0 支持 4K@60Hz 或 1080P@120Hz
1 路自适应千兆以太网口
WIFI 蓝牙无线通信
板载 1 路 USB3.0,3 路 USB2.0
极小型 PCBA 尺寸,85mm*56mm
系统支持:
Android 11
Debian 10
Buildroot + QT
鸿蒙 OpenHarmony3.2
Ubuntu
麒麟 OS
刷入官方提供的 Debian 10 后,发现无法安装 Docker/Tailscale/K3s/Cilium 等,这是为什么?
原因解析
很多开发板的操作系统,都是没有 UEFI 的,也不能直接使用 Debian Linux 官网提供的 iso 等安装介质直接进行安装的。而是自编译的 Debian Linux.
编译后的 Debian 里,会带有 uboot 作为启动引导的工具,同时将开发板对应的芯片 / 接口驱动集成进去。
官方提供的自编译 Debian Linux 里,只开启了一小部分的 Kernel 内核参数。而 Docker/Tailscale/K3s/Cilium 等,是需要直接用到 Kernel 紧密相关的功能,但是这些功能在官方提供的 Debian Linux 中又没有,就需要我们按照官方提供的《Linux SDK 编译手册》自行编译。
需要哪些内核配置
Docker 需要哪些内核配置
Docker 需要的内核配置,可以通过 https://github.com/opencontainers/runc/blob/main/script/check-config.sh 这个检查脚本进行检验的。运行示例如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 info: reading kernel config from ./kernel/.config ... Generally Necessary: - cgroup hierarchy: properly mounted [/sys/fs/cgroup] - apparmor: enabled and tools installed - CONFIG_NAMESPACES: enabled - CONFIG_NET_NS: enabled - CONFIG_PID_NS: enabled - CONFIG_IPC_NS: enabled - CONFIG_UTS_NS: enabled - CONFIG_CGROUPS: enabled - CONFIG_CGROUP_CPUACCT: enabled - CONFIG_CGROUP_DEVICE: enabled - CONFIG_CGROUP_FREEZER: enabled - CONFIG_CGROUP_SCHED: enabled - CONFIG_CPUSETS: enabled - CONFIG_MEMCG: missing - CONFIG_KEYS: enabled - CONFIG_VETH: missing - CONFIG_BRIDGE: missing - CONFIG_BRIDGE_NETFILTER: missing - CONFIG_IP_NF_FILTER: missing - CONFIG_IP_NF_TARGET_MASQUERADE: missing - CONFIG_NETFILTER_XT_MATCH_ADDRTYPE: missing - CONFIG_NETFILTER_XT_MATCH_CONNTRACK: missing - CONFIG_NETFILTER_XT_MATCH_IPVS: missing - CONFIG_IP_NF_NAT: missing - CONFIG_NF_NAT: missing - CONFIG_POSIX_MQUEUE: missing Optional Features: - CONFIG_USER_NS: enabled - CONFIG_SECCOMP: enabled - CONFIG_SECCOMP_FILTER: enabled - CONFIG_CGROUP_PIDS: missing - CONFIG_MEMCG_SWAP: missing - CONFIG_MEMCG_SWAP_ENABLED: missing - CONFIG_BLK_CGROUP: missing - CONFIG_BLK_DEV_THROTTLING: missing - CONFIG_CGROUP_PERF: missing - CONFIG_CGROUP_HUGETLB: missing - CONFIG_NET_CLS_CGROUP: missing - CONFIG_CGROUP_NET_PRIO: missing - CONFIG_CFS_BANDWIDTH: enabled - CONFIG_FAIR_GROUP_SCHED: enabled - CONFIG_RT_GROUP_SCHED: missing - CONFIG_IP_NF_TARGET_REDIRECT: missing - CONFIG_IP_VS: missing - CONFIG_IP_VS_NFCT: missing - CONFIG_IP_VS_PROTO_TCP: missing - CONFIG_IP_VS_PROTO_UDP: missing - CONFIG_IP_VS_RR: missing - CONFIG_SECURITY_SELINUX: missing - CONFIG_SECURITY_APPARMOR: missing
所以其需要的 Kernel config 为:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 CONFIG_NAMESPACES =yCONFIG_NET_NS =yCONFIG_PID_NS =yCONFIG_IPC_NS =yCONFIG_UTS_NS =yCONFIG_CGROUPS =yCONFIG_CGROUP_CPUACCT =yCONFIG_CGROUP_DEVICE =yCONFIG_CGROUP_FREEZER =yCONFIG_CGROUP_SCHED =yCONFIG_CPUSETS =yCONFIG_MEMCG =yCONFIG_KEYS =yCONFIG_VETH =yCONFIG_BRIDGE =yCONFIG_BRIDGE_NETFILTER =yCONFIG_IP_NF_FILTER =yCONFIG_IP_NF_TARGET_MASQUERADE =yCONFIG_NETFILTER_XT_MATCH_ADDRTYPE =yCONFIG_NETFILTER_XT_MATCH_CONNTRACK =yCONFIG_NETFILTER_XT_MATCH_IPVS =yCONFIG_IP_NF_NAT =yCONFIG_NF_NAT =yCONFIG_POSIX_MQUEUE =yCONFIG_USER_NS =yCONFIG_SECCOMP =yCONFIG_SECCOMP_FILTER =yCONFIG_CGROUP_PIDS =yCONFIG_MEMCG_SWAP =yCONFIG_MEMCG_SWAP_ENABLED =yCONFIG_BLK_CGROUP =yCONFIG_BLK_DEV_THROTTLING =yCONFIG_CGROUP_PERF =yCONFIG_CGROUP_HUGETLB =yCONFIG_NET_CLS_CGROUP =yCONFIG_CGROUP_NET_PRIO =yCONFIG_CFS_BANDWIDTH =yCONFIG_FAIR_GROUP_SCHED =yCONFIG_RT_GROUP_SCHED =yCONFIG_IP_NF_TARGET_REDIRECT =yCONFIG_IP_VS =yCONFIG_IP_VS_NFCT =yCONFIG_IP_VS_PROTO_TCP =yCONFIG_IP_VS_PROTO_UDP =yCONFIG_IP_VS_RR =yCONFIG_SECURITY_SELINUX =yCONFIG_SECURITY_APPARMOR =y
Tailscale 需要哪些内核配置
Tailscale 出于广泛适用性的考虑,主要都是基于用户空间的实现,不加任何内核配置也可以基于 sock5 代理的方式运行。如果要正常状态运行,其只依赖于一个内核配置:
如果是 Wireguard 或其他对内核依赖较多的相关软件,请自行查找相关内核配置需求。
K3s 需要哪些内核配置
K3s 的 Cli 做的很完善,直接可以检查内核配置需求,在我编译好的 Debian 10 上运行具体如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 $ k3s check-config Verifying binaries in /var/lib/rancher/k3s/data/ef31d9f1b153134534c2b9664540479f3071940e08ee95dd2877e102a31d235e/bin: - sha256sum : good - aux/ip6tables: symlink to xtables-legacy-multi - aux/ip6tables-restore: symlink to xtables-legacy-multi - aux/ip6tables-save: symlink to xtables-legacy-multi - aux/iptables: symlink to xtables-legacy-multi - aux/iptables-restore: symlink to xtables-legacy-multi - aux/iptables-save: symlink to xtables-legacy-multi - links: good System: - /var/lib/rancher/k3s/data/ef31d9f1b153134534c2b9664540479f3071940e08ee95dd2877e102a31d235e/bin/aux iptables v1.8.8 (legacy): ok - swap: disabled - routes: ok Limits: - /proc/sys/kernel/keys/root_maxkeys: 1000000 modprobe: ERROR: ../libkmod/libkmod.c:586 kmod_search_moddep() could not open moddep file '/lib/modules/4.19.232/modules.dep.bin' modprobe: FATAL: Module configs not found in directory /lib/modules/4.19.232 info: reading kernel config from /proc/config.gz ... Generally Necessary: - cgroup hierarchy: cgroups Hybrid mounted, cpuset|memory controllers status: good - CONFIG_NAMESPACES: enabled - CONFIG_NET_NS: enabled - CONFIG_PID_NS: enabled - CONFIG_IPC_NS: enabled - CONFIG_UTS_NS: enabled - CONFIG_CGROUPS: enabled - CONFIG_CGROUP_PIDS: enabled - CONFIG_CGROUP_CPUACCT: enabled - CONFIG_CGROUP_DEVICE: enabled - CONFIG_CGROUP_FREEZER: enabled - CONFIG_CGROUP_SCHED: enabled - CONFIG_CPUSETS: enabled - CONFIG_MEMCG: enabled - CONFIG_KEYS: enabled - CONFIG_VETH: enabled - CONFIG_BRIDGE: enabled - CONFIG_BRIDGE_NETFILTER: enabled - CONFIG_IP_NF_FILTER: enabled - CONFIG_IP_NF_TARGET_MASQUERADE: enabled - CONFIG_NETFILTER_XT_MATCH_ADDRTYPE: enabled - CONFIG_NETFILTER_XT_MATCH_CONNTRACK: enabled - CONFIG_NETFILTER_XT_MATCH_IPVS: enabled - CONFIG_NETFILTER_XT_MATCH_COMMENT: enabled - CONFIG_NETFILTER_XT_MATCH_MULTIPORT: enabled - CONFIG_IP_NF_NAT: enabled - CONFIG_NF_NAT: enabled - CONFIG_POSIX_MQUEUE: enabled Optional Features: - CONFIG_USER_NS: enabled - CONFIG_SECCOMP: enabled - CONFIG_BLK_CGROUP: enabled - CONFIG_BLK_DEV_THROTTLING: enabled - CONFIG_CGROUP_PERF: enabled - CONFIG_CGROUP_HUGETLB: enabled - CONFIG_NET_CLS_CGROUP: enabled - CONFIG_CGROUP_NET_PRIO: enabled - CONFIG_CFS_BANDWIDTH: enabled - CONFIG_FAIR_GROUP_SCHED: enabled - CONFIG_RT_GROUP_SCHED: enabled - CONFIG_IP_NF_TARGET_REDIRECT: enabled - CONFIG_IP_SET: enabled - CONFIG_IP_VS: enabled - CONFIG_IP_VS_NFCT: enabled - CONFIG_IP_VS_PROTO_TCP: enabled - CONFIG_IP_VS_PROTO_UDP: enabled - CONFIG_IP_VS_RR: enabled - CONFIG_EXT4_FS: enabled - CONFIG_EXT4_FS_POSIX_ACL: enabled - CONFIG_EXT4_FS_SECURITY: enabled - Network Drivers: - "overlay" : - CONFIG_VXLAN: enabled Optional (for encrypted networks): - CONFIG_CRYPTO: enabled - CONFIG_CRYPTO_AEAD: enabled - CONFIG_CRYPTO_GCM: enabled - CONFIG_CRYPTO_SEQIV: enabled - CONFIG_CRYPTO_GHASH: enabled - CONFIG_XFRM: enabled - CONFIG_XFRM_USER: enabled - CONFIG_XFRM_ALGO: enabled - CONFIG_INET_ESP: enabled - CONFIG_INET_XFRM_MODE_TRANSPORT: enabled - Storage Drivers: - "overlay" : - CONFIG_OVERLAY_FS: enabled STATUS: pass
根据上面输出,得出 K3s 需要的内核配置有:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 CONFIG_NAMESPACES =yCONFIG_NET_NS =yCONFIG_PID_NS =yCONFIG_IPC_NS =yCONFIG_UTS_NS =yCONFIG_CGROUPS =yCONFIG_CGROUP_PIDS =yCONFIG_CGROUP_CPUACCT =yCONFIG_CGROUP_DEVICE =yCONFIG_CGROUP_FREEZER =yCONFIG_CGROUP_SCHED =yCONFIG_CPUSETS =yCONFIG_MEMCG =yCONFIG_KEYS =yCONFIG_VETH =yCONFIG_BRIDGE =yCONFIG_BRIDGE_NETFILTER =yCONFIG_IP_NF_FILTER =yCONFIG_IP_NF_TARGET_MASQUERADE =yCONFIG_NETFILTER_XT_MATCH_ADDRTYPE =yCONFIG_NETFILTER_XT_MATCH_CONNTRACK =yCONFIG_NETFILTER_XT_MATCH_IPVS =yCONFIG_NETFILTER_XT_MATCH_COMMENT =yCONFIG_NETFILTER_XT_MATCH_MULTIPORT =yCONFIG_IP_NF_NAT =yCONFIG_NF_NAT =yCONFIG_POSIX_MQUEUE =yCONFIG_USER_NS =yCONFIG_SECCOMP =yCONFIG_BLK_CGROUP =yCONFIG_BLK_DEV_THROTTLING =yCONFIG_CGROUP_PERF =yCONFIG_CGROUP_HUGETLB =yCONFIG_NET_CLS_CGROUP =yCONFIG_CGROUP_NET_PRIO =yCONFIG_CFS_BANDWIDTH =yCONFIG_FAIR_GROUP_SCHED =yCONFIG_RT_GROUP_SCHED =yCONFIG_IP_NF_TARGET_REDIRECT =yCONFIG_IP_SET =yCONFIG_IP_VS =yCONFIG_IP_VS_NFCT =yCONFIG_IP_VS_PROTO_TCP =yCONFIG_IP_VS_PROTO_UDP =yCONFIG_IP_VS_RR =yCONFIG_EXT4_FS =yCONFIG_EXT4_FS_POSIX_ACL =yCONFIG_EXT4_FS_SECURITY =yCONFIG_VXLAN =yCONFIG_CRYPTO =yCONFIG_CRYPTO_AEAD =yCONFIG_CRYPTO_GCM =yCONFIG_CRYPTO_SEQIV =yCONFIG_CRYPTO_GHASH =yCONFIG_XFRM =yCONFIG_XFRM_USER =yCONFIG_XFRM_ALGO =yCONFIG_INET_ESP =yCONFIG_INET_XFRM_MODE_TRANSPORT =yCONFIG_OVERLAY_FS =y
相比 Docker, 主要多了以下内核需求:
Cilium 需要哪些内核配置
Cilium 需要的内核配置,可以在这里查看:System Requirements — Cilium 1.13.4 documentation
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 CONFIG_BPF =yCONFIG_BPF_SYSCALL =yCONFIG_NET_CLS_BPF =yCONFIG_BPF_JIT =yCONFIG_NET_CLS_ACT =yCONFIG_NET_SCH_INGRESS =yCONFIG_CRYPTO_SHA1 =yCONFIG_CRYPTO_USER_API_HASH =yCONFIG_CGROUPS =yCONFIG_CGROUP_BPF =yCONFIG_PERF_EVENTS =yCONFIG_NETFILTER_XT_SET =mCONFIG_IP_SET =mCONFIG_IP_SET_HASH_IP =mCONFIG_NETFILTER_XT_TARGET_TPROXY =mCONFIG_NETFILTER_XT_TARGET_CT =mCONFIG_NETFILTER_XT_MATCH_MARK =mCONFIG_NETFILTER_XT_MATCH_SOCKET =mCONFIG_XFRM =yCONFIG_XFRM_OFFLOAD =yCONFIG_XFRM_STATISTICS =yCONFIG_XFRM_ALGO =mCONFIG_XFRM_USER =m CONFIG_INET{,6}_ESP =m CONFIG_INET{,6}_IPCOMP =m CONFIG_INET{,6}_XFRM_TUNNEL =m CONFIG_INET{,6}_TUNNEL =mCONFIG_INET_XFRM_MODE_TUNNEL =mCONFIG_CRYPTO_AEAD =mCONFIG_CRYPTO_AEAD2 =mCONFIG_CRYPTO_GCM =mCONFIG_CRYPTO_SEQIV =mCONFIG_CRYPTO_CBC =mCONFIG_CRYPTO_HMAC =mCONFIG_CRYPTO_SHA256 =mCONFIG_CRYPTO_AES =mCONFIG_NET_SCH_FQ =m
另外 Cilium 对于 Kernel 版本也有严格要求,Cilium 的部分功能依赖于高版本的 Kernel. 请自行查阅。
修改内核配置并编译
Linux SDK 官方一般都会提供,基于 Rockchip 芯片系列的 Linux SDK 文件目录结构大差不差。我这里以 Purple Pi OH 为例,相信如果您也正好有相关需求,且是 Rockchip 的其他开发板,也能很快找到对应目录。
一般内核配置的目录为:xxxxxxx\kernel\arch\arm64\configs\xxxxx_linux_defconfig
将上方提供的 Kernel 配置添加到该文件末尾(注意去重)并保存。
然后直接编译即可:
编译后在 ./rockdev
目录生成 boot.img
镜像。
然后利用 Rockchip 提供的烧录工具:RKDevTool.exe, 单独将 boot.img
烧录即可。
编译是真的耗资源啊,耗时间,耗 CPU, 耗磁盘😂
可能出现的异常情况
分区超出
我在编译过程中碰到 recovery 分区超过的报错,报错如下:
1 2 rk356x_linux_sdk/buildroot/output/rockchip_rk356x_recovery/images/recovery.img's size exceed parameter.txt's limit!ERROR: Running build_firmware failed!
解决办法是要修改分区大小,具体就是修改对应的 parameter.txt 文件。修改后再重新 完整 编译:
并重新烧录整个固件。
Docker 安装后启动失败
根据官方文档:Install Docker Engine on Debian | Docker Documentation , Docker 安装后启动失败。
官方明确提到目前最新版本需要的 Debian 版本为:
Debian Bookworm 12 (stable)
Debian Bullseye 11 (oldstable)
可能是 Deibian 10 兼容性有问题导致的。但是有 workaround.
具体的报错为 nftables 相关的报错。
解决方案为:
1 2 3 4 update-alternatives --set iptables /usr/sbin/iptables-legacy update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy update-alternatives --set arptables /usr/sbin/arptables-legacy update-alternatives --set ebtables /usr/sbin/ebtables-legacy
重启后 Docker 可以正常运行。
总结
玩了一周末的 Rockchip arm64 开发板,现在 2G 内存的板子上终于可以跑 docker,k3s,tailscale,cilium 了。🎉🎉🎉
Arm 开发板如我之前所说,有这些优势:
便宜
可玩性高
功耗低
散热小,运行安静
Arm64 现在生态还凑活
但是相比 x86, 这类 arm 开发板生态还是太差了,没有 bios/uefi,装前面几个软件都要调 kernel 参数然后编译,刷机烧录。玩起来太累了。…
x86 也有这些优势:
便宜
可玩性高
但是 x86 的生态太好了,玩起来省心多了。
Arm 与 x86 相比,其实也就强在 功耗低,散热小。但是现在 Intel 的一些芯片,如 n100 等,TDP 为 6W 也是非常低了,通过被动散热也能压住也就静音。Arm 的优势所剩无几了。…
所以我的建议,想省心 / 静音 / 功率低,首推 x86 迷你主机;想折腾 / 静音 / 功率低,首推各类 arm pi 开发板或盒子;不在乎功耗 / 不在乎声音 / 高配,可以玩玩二手 x86 服务器。😂😂😂
以上。
📚️参考文档