..

CM3588 升级 kernel 和 u-boot 踩坑

一直在用 CM3588 跑“散装” NAS,但一直有一个小问题困扰着我。就是这个系统在 reboot 或者 poweroff 的时候有一定几率会卡住死机。虽然作为 NAS 重启或者关机的时间不多。但是这个问题却如梗在喉让我不太舒服。也一直没有时间去深入看一下怎么回事。隐约感觉应该是 kernel 或者是 u-boot 有问题。

这两天刚好发现友善官方的 kernel 和 u-boot 有一些代码提交记录。于是就打算升级一下看看能不能解决这个问题。简单记录一下升级过程。

编译

参考官方的 wiki
https://wiki.friendlyelec.com/wiki/index.php/CM3588

编译 u-boot
https://wiki.friendlyelec.com/wiki/index.php/CM3588#Build_u-boot_v2017.09

编译 kernel
https://wiki.friendlyelec.com/wiki/index.php/CM3588#Build_kernel_linux-v6.1.y

安装

因为我们是在现有的系统上进行升级,所以将手动安装 u-boot 和 kernel。

u-boot

参考 rk 官方的分区表 https://opensource.rock-chips.com/wiki_Partitions

u-boot 的位置位于 loader2,起始扇区数是 16384。我们可以将上面编译好的 uboot.img 直接写入磁盘上。

这是 CM3588 内置存储设备的分区表情况。预留了前面 16M 给 u-boot 使用。第一个分区给了 /boot 目录存放内核文件。剩下的容量其实也并没有使用,系统和文件都放在 nvme 和 sata 设备上面。

nas:/boot$ sudo fdisk -l /dev/mmcblk2
Found valid GPT with protective MBR; using GPT

Disk /dev/mmcblk2: 120832000 sectors, 1656M
Logical sector size: 512
Disk identifier (GUID): 8158f5c7-a3da-4615-b9b9-4886c5101a61
Partition table holds up to 128 entries
First usable sector is 34, last usable sector is 120831966

Number  Start (sector)    End (sector)  Size Name
     1           32768         1953791  938M
     2         1953792       120829951 56.6G

直接通过 dd 命令写入 u-boot。

dd if=uboot.img of=/dev/mmcblk2 seek=16384 bs=512 conv=notrunc

kernel

  • 将编译好的内核 ./arch/arm64/boot/Image,直接覆盖 /boot/Image
  • ./out-modules/lib/modules 内的文件复制到 /lib/modules
  • mkinitfs 6.1.57 生成 initramfs。后面的参数是 kernel 版本名称,根据实际情况调整。mkinitfs 是 alpine 的命令,其它 linux 都有对应命令,替换即可。
  • 转换 initramfs 到 u-boot 能识别的格式。mkimage -A arm64 -O linux -T ramdisk -C gzip -n uInitrd -d initramfs-vanilla uInitrd
  • 复制 ./arch/arm64/boot/dts/rockchip/rk3588-nanopi6-rev09.dtb/boot/dtb/rockchip/rk3588-nanopi6-rev09.dtb

踩坑

至此 kenrel 和 u-boot 升级都结束了。理论上来说重启一下就可以生效了。此前其实也修改了内核的一些配置,这个流程已经走了几遍了,都是没有问题的。但实际情况就是重启之后等了10分钟系统都没有再上线。我还以为是又触发了那个卡死的bug,于是强行断电重启问题依旧。

那只能把我的散装 NAS 拿出来,插上调试线,看看到底是 u-boot 的问题还是 kernel 的问题。这里忘记拍照截图了。但是看了一下启动日志,发现 u-boot 已经是新版的了。并且引导成功,开始加载内核了。然后内核卡住了。打开内核的日志信息。发现它尝试从 /dev/mmcblk2p8 分区引导。但是我的系统中并没有这个分区,然后引导就失败了。我的启动磁盘信息都是写在 /boot/boot.cmd 里面的,这个文件没有改动过。于是看了一下官方内核的提交记录,里面发现一条信息 https://github.com/friendlyarm/kernel-rockchip/commit/e7c28e5cc40aebf9eb955dd49ca706a6a4424a7a,不懂为什么要写死这个设备信息。解决的方法也很简单,删掉这行代码重新编译,从新替换一下 dtb 文件即可。