作为一个拥有各类arm开发板(上至Rock5B、Rock5A、NanoPC-T6、Jetson Orin Nano、Jetson AGX Xavier、ZynqMP xczu5ev
,下至Radxa Zero 3W、Jetson Nano、ZynqMP xczu3eg、RaspberryPi Zero 2W
)的嵌入式玩家,各开发板提供的镜像通常各不相同,使用起来也总感觉有些不顺手。我始终致力于追求一个通用的系统镜像(不提设备树这些,但至少rootfs里装的系统得是一致的)。因此,Armbian作为一款支持若干开发板的通用镜像就进入了我的视野。到目前为止,上述的大部分开发板都被我刷上了Armbian。同时,为了更加方便的访问这些开发板,我在系统里都安装了Tailscale。Tailscale 是一个基于 WireGuard 的零配置虚拟专用网络工具,能够快速将不同地点的开发板接入同一虚拟局域网,让用户轻松远程访问和管理。
那么,在拿到由ICEasy赞助提供的VisionFive2开发板后,我第一时间就准备给板子刷上Armbian了。从Armbian官网下载的镜像并不能直接安装到开发板上,而是需要通过“魔改杂交”的方式先将Armbian的镜像与BSP镜像杂交合成一个新的镜像;该镜像拥有BSP镜像的新分区格式、BSP的内核,而rootfs则来自Armbian镜像。详细教程可参考https://forum.rvspace.org/t/vision-five-2-armbian-linux-2024-8-29/4539,这里不再赘述。
正确安装Armbian系统之后,就可以执行Tailscale官网脚本了:
curl -fsSL https://tailscale.com/install.sh | sh
但安装完成后,使用tailscale up
命令却无法登录。查看日志提示
tailscaled[46069]: is CONFIG_TUN enabled in your kernel? modprobe tun failed with: modprobe: FATAL: Module tun not found in directory /lib/modules/xxx
tailscaled[46069]: tun module not loaded nor found on disk
这是之前在arm开发板上从未遇到过的。搜索资料后得知,TUN 是一种网络虚拟接口,用于在用户空间和内核空间之间传输 IP 数据包。它在 Linux 中通过创建字符设备文件并使用 ip tuntap
命令配置接口来实现。Tailscale 需要 TUN 接口来拦截和处理网络流量,以便通过加密通道传输数据,实现设备间的安全连接。Armbian系统通常会为开发板编译一个开启了大部分功能的内核,而恰恰是因为我们在安装Armbian时采用了“魔改”安装,使得最终运行在开发板上的系统并未使用Armbian的内核,而是使用了BSP默认内核。而BSP默认内核中并未启用TUN支持,这才导致了Tailscale安装失败。
接下来,我探索了如何在Armbian下重新编译内核。阅读以下内容需要您对内核有一定的了解:
一阶段、在Armbian下重新编译内核,添加TUN和ZRAM支持
首先,从赛昉官方的git仓库获取内核源码:
git clone https://github.com/starfive-tech/linux.git
git checkout -b JH7110_VisionFive2_6.6.y_devel origin/JH7110_VisionFive2_6.6.y_devel
git pull
安装编译工具,生成内核配置文件:
sudo apt install gcc-riscv64-linux-gnu
make starfive_visionfive2_defconfig CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv
make menuconfig CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv
开启TUN支持(Tailscale必需)
开启ZRAM(需要将这个功能编译成模块<M>而不是编译进内核<*>)
如果选项里没有Compressed RAM Device Support,需要按照下面的操作为内核添加压缩算法API支持
据说LZ4压缩比较适合ZRAM,但需要注意的是这里同样要将压缩算法编译成模块<M>而不是编译进内核<*>
添加进去后,执行代码进行编译,同时测量编译时间:
time make -j16 deb-pkg CROSS_COMPILE=riscv64-linux-gnu- ARCH=riscv
编译完成后,将生成的linux-image-*,linux-headers-*,linux-libc-*三个deb文件传到开发板上
将/dev/mmcblk0p3(SD卡的话是blk1p3)挂载到/boot分区(因为按照Armbian魔改法,boot分区不会自动被挂载)
安装编译好的内核
sudo apt install ./linux-*
安装完成后,使用
sudo vim /boot/extlinux/extlinux.conf
对启动项进行修改,把刚刚编译出来的内核添加进去
重启,大功告成!
二阶段:Tailscale又出错
在开发板关机放置一段时间后,Tailscale突然不可用
这其实是一个很常见的问题:由于VisionFive2开发板并无板载RTC,而系统上又未配置NTP自动对时工具,导致关机一段时间后再开机,开发板上的时间仍停留在上次关机时的时间。又因为 SSL/TLS 协议依赖于证书的有效期来验证其有效性。如果系统时间不正确,可能导致证书被误判为过期或尚未生效,从而导致 SSL 连接失败。一劳永逸的方法是在板端配置NTP自动对时服务。该服务会定时将系统时间与NTP服务器时间进行同步,可以有效避免时钟失去同步的问题。
执行sudo apt install ntp
进行NTP对时服务的安装:
安装完成后,执行ntpq -p
检查当前可用的NTP服务器:
执行sudo systemctl status ntp
检查NTP服务状态:
可以观察到,系统时钟成功进行了同步。
三阶段:玩玩存储
VisionFive2开发板上有一个M.2 M-key 2280接口,查询wiki得知该接口速率为PCIE2.0 x1
这个速率。。。装正经的SSD硬盘上去感觉浪费了,但啥都不装的话也感觉浪费了
正好从闲鱼以10块左右/根的价格买了一把全新的傲腾M10 2代 16G,既然傲腾以4K性能闻名,那不如装一根在VisionFive2上,试试效果如何?
系统可以正确识别到傲腾
新建分区
格式化分区
fio测速脚本结果如下:
和我自己搓的EMMC模块对比一下:
可以观察到,工作在PCIE2.0 x1下的傲腾无论是读写速度还是读写延迟都比EMMC强了一个数量级。
有读者可能会问:你这EMMC速度不对啊,怎么这么慢?
首先,这不是EMMC的问题。我做的这个EMMC模块使用磨损度不超过10%的FEMDNN128G-A3A56江波龙片子,在其他平台(Radxa Zero 3W)都可以跑到150MB+的速度,唯独在VisionFive上速度降了不少:
查看其他平台(Radxa Zero 3W)的EMMC工作参数:
对比VisionFive2的:
可以观察到,两者在EMMC工作时钟频率上有明显差别(Radxa Zero 3W可以跑到200MHz,VisionFive2只有不到50MHz)。很有可能是该参数影响了EMMC读写速率。

