如何在 Rockchip Arm 开发板上安装 Docker Tailscale K3s Cilium?

概述618 买了几个便宜的 purple pi oh 开发板[1] (500 块多一点买了 3 个), 这个开发板类似树莓派,是基于 rockchip(瑞芯微) 的 rx3566 arm64 芯片。如下:
purple pi oh
买来是用作家庭服务器或家庭实验室的。主要考虑就是:
1.便宜2.可玩性高3.功耗低4.散热小,运行安静5.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 需要的内核配置,可以通过检查脚本进行检验的。运行示例如下:
                                                       # ./check_config.shinfo: 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 为:
                                                  # docker generally necessaryconfig_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=y
# optional features:=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 代理的方式运行。如果要正常状态运行,其只依赖于一个内核配置:
  # tailscaleconfig_tun=y
如果是 wireguard 或其他对内核依赖较多的相关软件,请自行查找相关内核配置需求。
k3s 需要哪些内核配置k3s 的 cli 做的很完善,直接可以检查内核配置需求,在我编译好的 debian 10 上运行具体如下:
                                                                                               $ 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.232info: 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 需要的内核配置有:
                                                                  # k3s generally necessary: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=y
# optional features:config_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=y# network driversconfig_vxlan=y# optional (for encrypted networks):config_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=y# storage driversconfig_overlay_fs=y
相比 docker, 主要多了以下内核需求:
•overlay 网络•overlay 存储
cilium 需要哪些内核配置cilium 需要的内核配置,可以在这里查看:system requirements — cilium 1.13.4 documentation[2]
                                          # cilium base requirementsconfig_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=y# optional: iptables-based masqueradingconfig_netfilter_xt_set=mconfig_ip_set=mconfig_ip_set_hash_ip=m# optional: l7 and fqdn policiesconfig_netfilter_xt_target_tproxy=mconfig_netfilter_xt_target_ct=mconfig_netfilter_xt_match_mark=mconfig_netfilter_xt_match_socket=m# optional: ipsecconfig_xfrm=yconfig_xfrm_offload=yconfig_xfrm_statistics=yconfig_xfrm_algo=mconfig_xfrm_user=mconfig_inet{,6}_esp=mconfig_inet{,6}_ipcomp=mconfig_inet{,6}_xfrm_tunnel=mconfig_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=m# optional: bandwidth managerconfig_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 配置添加到该文件末尾(注意去重)并保存。
然后直接编译即可:
 ./build.sh kernel
编译后在./rockdev目录生成boot.img镜像。
然后利用 rockchip 提供的烧录工具:rkdevtool.exe, 单独将 boot.img 烧录即可。
编译是真的耗资源啊,耗时间,耗 cpu, 耗磁盘
可能出现的异常情况分区超出我在编译过程中碰到 recovery 分区超过的报错,报错如下:
  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 文件。修改后再重新完整编译:
 ./build.sh
并重新烧录整个固件。
docker 安装后启动失败根据官方文档:install docker engine on debian | docker documentation[3], docker 安装后启动失败。
官方明确提到目前最新版本需要的 debian 版本为:
debian bookworm 12 (stable) debian bullseye 11 (oldstable)
可能是 deibian 10 兼容性有问题导致的。但是有 workaround.
具体的报错为 nftables 相关的报错。
解决方案为:
    update-alternatives --set iptables /usr/sbin/iptables-legacyupdate-alternatives --set ip6tables /usr/sbin/ip6tables-legacyupdate-alternatives --set arptables /usr/sbin/arptables-legacyupdate-alternatives --set ebtables /usr/sbin/ebtables-legacy
重启后 docker 可以正常运行。
总结玩了一周末的 rockchip arm64 开发板,现在 2g 内存的板子上终于可以跑 docker,k3s,tailscale,cilium 了。
arm 开发板如我之前所说,有这些优势:
1.便宜2.可玩性高3.功耗低4.散热小,运行安静5.arm64 现在生态还凑活
但是相比 x86, 这类 arm 开发板生态还是太差了,没有 bios/uefi,装前面几个软件都要调 kernel 参数然后编译,刷机烧录。玩起来太累了。..
x86 也有这些优势:
1.便宜2.可玩性高
但是 x86 的生态太好了,玩起来省心多了。
arm 与 x86 相比,其实也就强在 功耗低,散热小。但是现在 intel 的一些芯片,如 n100 等,tdp 为 6w 也是非常低了,通过被动散热也能压住也就静音。arm 的优势所剩无几了。..
所以我的建议,想省心/静音/功率低,首推 x86 迷你主机;想折腾/静音/功率低,首推各类 arm pi 开发板或盒子;不在乎功耗/不在乎声音/高配,可以玩玩二手 x86 服务器。
以上。

最高44亿,阳光、三雄、星宇等5份“成绩单”藏着哪些秘密?
网络(服务器)线路的简单介绍
详解时序约束的基本方法
磷铜阳极介绍
浅谈模拟IC设计师眼中的BJT
如何在 Rockchip Arm 开发板上安装 Docker Tailscale K3s Cilium?
LIN总线工作原理介绍
基于云的芯片设计和验证的强大安全性
一图看懂骁龙888如何重新定义顶级AI体验
电动车转换器坏了的表现
谷歌为Chrome OS 87添加蓝牙电量显示等实用功能
设备远程监控物联网,助力打造无人值守海上升压站
您应该了解的柔性板制造工艺知识
荣耀V20全方位评测 到底怎么样
科技让视力残障人士的生活变得更加容易的例子
日企市场份额占比超9成,国内第四代半导体材料加速突破
电力变压器的状态维修-博众达科技
河南联通成功完成2009年汛期通信保障应急演练
直线电机立体式车库的应用
锂电池打开北京2008奥运会画卷向世人展示中华五千年文明