前情提要

最近剁手了一个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有如下几种不同的方案。

  1. 使用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支持的开发板体验没啥差距了,能用这种当然是最好。

  2. 使用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中维护一个对应版本即可实现更新。

  3. 使用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支持的板子还是很多的。

  1. 从Armbian官方下载Orangepi 5的镜像,这里我的版本为Armbian_23.5.5_Orangepi5-plus_bookworm_legacy_5.10.160_minimal。注意目前Orangepi 5 plus的镜像放在了Orangepi 5的页面下的Additional Images的小字部分。而Orangepi 5的镜像是跑不起来的。

  2. 将镜像烧录到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分区初始化不会很大。

  3. 在Opi5+上启动SD卡,至登陆界面弹出来即可。

    Armbian在第一次启动的时候会自动扩容rootfs分区到SD卡的完整大小(在登陆之前即可完成)。当然这里也可以手动操作,注意如果手动调整了rootfs大小之后需要修改bootfs中的armbianEnv.txtrootdev的值为修改过后的rootfs分区的UUID(如果UUID发生了变化的话)。

  4. 将SD卡插回来,然后挂载rootfs分区,获取rootfs中的fstab并移除其余文件。

    mount /dev/sdX2 root
    cp root/etc/fstab . # 获取fstab到当前工作目录
    rm -rf root/* # 删除其余内容
    
  5. 烧录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/*
    
  6. 把rootfs中的fstab替换成我们之前保存的fstab。

    cp fstab root/etc/fstab
    

    注意这里默认之前并没有自行修改过分区,如果修改了分区需要保证UUID一致,如果UUID不一致的话需要手动修改fstab中的UUID。可以使用blkid命令查看分区的UUID。

  7. Unmount rootfs分区。

    umount root
    

请注意这里并没有结束,我们之后还需要删除Alarm的内核,切勿冲动进系统然后pacman -Syu

  1. 将SD卡插回Opi5+,启动,初始化pacman。

    pacman-key --init
    pacman-key --populate archlinuxarm
    
  2. 删除Alarm的内核。

    pacman -R linux-aarch64
    

    这里我们删除内核的时候大部分内容是不会删除的,因为Armbian的/boot和Alarm的/boot中启动模式不一样。这个操作只会会删除/boot/Image,具体需要按照版本分析。

  3. 重新链接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的工作原理。这个就以后再折腾吧。