前情提要
最近剁手了一个Rockchip 3588的开发板Orangepi 5 plus(后称Opi5+),主要是有点馋Rk3588的性能。谁能拒绝一个比骁龙845还强的开发板呢。现在开发板都卷到8nm工艺了。当然第一件事还是随便烧录一个官方的镜像看看板子有没有问题,然后就是折腾一下Arch Linux Arm(后称Alarm)。当然官方镜像肯定不会翻车,隔壁Armbian也刷了试试。目前唯一的问题就是Rk3588本身的Linux内核mainline支持还没到位,不像上次的Rk3328已经被Linux内核官方支持了。目前看来无论是Orangepi OS(Arch版),还是Armbian的Release对于Rk3588的内核支持都只能到5.10。不过这都不是事,毕竟内核替换一下还是有可能装上Alarm的。
调研
有了上次的经验,这次强刷Alarm就打算先做个多方案调研。大概能列出来强刷Alarm有如下几种不同的方案。
-
使用Alarm官方的Genetic镜像的rootfs和bootfs,然后把编译好(或者从其他发行版,如Armbian,中扣的)的U-Boot刷到主分区或boot分区前,然后放入对应的boot.scr,见Arch Linux on Orangepi R1 Plus LTS。
- 前提
- Alarm的U-Boot支持
- Alarm的Kernel支持
- 优势
- 通过Alarm更新Kernel
- 通过Aur更新U-Boot(需要有人制作PKGBUILD或者自行制作)
这种方法只要有Aur版本的U-Boot就基本和普通的Alarm支持的开发板体验没啥差距了,能用这种当然是最好。
- 前提
-
使用Alarm官方的rootfs和bootfs,然后替换其Kernel文件和U-Boot文件。参考Aur package linux-rockchip-rk3588-bin。
- 前提
- Alarm的U-Boot支持
- Alarm的Kernel支持
- 优势
- 通过Aur更新Kernel(需要有人制作PKGBUILD或者自行制作)
- 通过Aur更新U-Boot(需要有人制作PKGBUILD或者自行制作)
这种方法基本上是一套通用的方法,毕竟替换了Kernel和U-Boot之后基本上啥都能跑起来。然后因为启动方式和Alarm相同,所以只需要在Aur中维护一个对应版本即可实现更新。
- 前提
-
使用Alarm官方的rootfs,但替换bootfs和U-Boot成其他发行版的。参考Installing Arch Linux AArch64 on the NanoPi R2S。
- 前提
- Alarm的U-Boot支持
- Alarm的Kernel支持
- 优势
- 简单快速
这种方法非常简单,基本只需要将其他发行版rootfs换成Alarm就行。当然劣势就很明显了,因为bootfs完全与Alarm不同,自然通过Aur更新就不合理了,所以更新Kernel和U-Boot就可能稍微麻烦一点。
- 前提
本文本来是想通过第二种方法安装Alarm的,但可惜遇到了一点问题,所以最后还是选择了第三种方法。下面直接讲第三种方法的安装过程,第二种遇到的问题在后续补充。
安装过程
本次安装不包含编译U-Boot和Kernel的过程,毕竟总不能每次更新都编译一次,自然是用其他发行版的U-Boot和Kernel才能可持续发展。这里就选择了Armbian作为本次NTR对象。不得不说Armbian支持的板子还是很多的。
-
从Armbian官方下载Orangepi 5的镜像,这里我的版本为
Armbian_23.5.5_Orangepi5-plus_bookworm_legacy_5.10.160_minimal
。注意目前Orangepi 5 plus的镜像放在了Orangepi 5的页面下的Additional Images的小字部分。而Orangepi 5的镜像是跑不起来的。 -
将镜像烧录到SD卡上。
注意这里我并没有用Installing Arch Linux AArch64 on the NanoPi R2S这篇文章说的方法:先自己分区然后只烧录分区表到bootfs之间的部分。具体细节下文可能会展开,这里先全部烧录上sd卡。将
/dev/sdX
替换成你的设备。dd bs=4M if=Armbian_23.5.5_Orangepi5-plus_bookworm_legacy_5.10.160_minimal.img of=/dev/sdX status=progress conv=fsync
此时会发现sd卡中有两个分区,一个是bootfs分区,一个是rootfs分区,格式为GPT。其中bootfs的分区Start Sector为
32768
。因为我烧录的是minimal镜像,所以rootfs分区初始化不会很大。 -
在Opi5+上启动SD卡,至登陆界面弹出来即可。
Armbian在第一次启动的时候会自动扩容rootfs分区到SD卡的完整大小(在登陆之前即可完成)。当然这里也可以手动操作,注意如果手动调整了rootfs大小之后需要修改bootfs中的
armbianEnv.txt
中rootdev
的值为修改过后的rootfs分区的UUID(如果UUID发生了变化的话)。 -
将SD卡插回来,然后挂载rootfs分区,获取rootfs中的fstab并移除其余文件。
mount /dev/sdX2 root cp root/etc/fstab . # 获取fstab到当前工作目录 rm -rf root/* # 删除其余内容
-
烧录Alarm的rootfs,并移除root内部的boot。
这里使用root用户操作,请勿使用sudo操作。否则会破坏文件权限。注意这里使用bsdtar也是因为它不会破坏文件权限,如果文件权限错误的话之后系统alarm用户的使用会出现问题。具体可以查阅Alarm社区相关讨论。
因为打算用Armbian的全套启动流程,这里就不需要Alarm的boot启动方式。所以直接移除掉。
wget http://os.archlinuxarm.org/os/ArchLinuxARM-aarch64-latest.tar.gz bsdtar -xpf ArchLinuxARM-aarch64-latest.tar.gz -C root rm -rf root/boot/*
-
把rootfs中的fstab替换成我们之前保存的fstab。
cp fstab root/etc/fstab
注意这里默认之前并没有自行修改过分区,如果修改了分区需要保证UUID一致,如果UUID不一致的话需要手动修改fstab中的UUID。可以使用
blkid
命令查看分区的UUID。 -
Unmount rootfs分区。
umount root
请注意这里并没有结束,我们之后还需要删除Alarm的内核,切勿冲动进系统然后pacman -Syu
。
-
将SD卡插回Opi5+,启动,初始化pacman。
pacman-key --init pacman-key --populate archlinuxarm
-
删除Alarm的内核。
pacman -R linux-aarch64
这里我们删除内核的时候大部分内容是不会删除的,因为Armbian的
/boot
和Alarm的/boot
中启动模式不一样。这个操作只会会删除/boot/Image
,具体需要按照版本分析。 -
重新链接linux内核
/boot/Image
。ln -s /boot/vmlinuz-5.10.160-rk35xx /boot/Image
如此便完成了Alarm的移花接木,剩下就是
Arch启动!
-` leachim@alarm
.o+` -------------
`ooo/ OS: Arch Linux ARM aarch64
`+oooo: Host: Orange Pi 5 Plus
`+oooooo: Kernel: 5.10.160-rk35xx
-+oooooo+: Uptime: 1 hour, 57 mins
`/:-:++oooo+: Packages: 175 (pacman)
`/++++/+++++++: Shell: zsh 5.9
`/++++++++++++++: Terminal: /dev/pts/1
`/+++ooooooooooooo/` CPU: (8) @ 1.800GHz
./ooosssso++osssssso+` Memory: 159MiB / 7688MiB
.oossssso-````/ossssss+`
-osssssso. :ssssssso.
:osssssss/ osssso+++.
/ossssssss/ +ssssooo/-
`/ossssso+/:- -:/+osssso+-
`+sso+:-` `.-/+oso:
`++:. `-/+/
.` `/
写在最后
关于内核
Armbian维护了一个Rk3588的内核,并被人制作到了Aur中Aur package linux-rockchip-rk3588-bin。但这个内核似乎并不支持Orangepi 5 plus,所以Armbian开发者在Orangepi 5 plus的Release版本中使用的是他们自己编译的一个5.10.160-rk35xx
内核。这个内核并没有被Armbian打包成deb发布,所以目前来看并不值得使用第二种方法。也许等之后Orangepi 5 plus的内核支持更好之后再折腾,目前而言第三种还是最为方便的。
关于bootfs
Armbian的bootfs和Alarm的bootfs是不同的。Alarm的boot方式是基于mkinitcpio,内核文件不直接安装在/boot
目录下。而Armbian的boot方式是直接安装在/boot
目录下。所以如果想要完美移植内核的话,还需要研究mkinitcpio的工作原理。这个就以后再折腾吧。