引言
拿到板子后,我首选了以简洁和滚动更新著称的 Arch Linux ARM 作为其操作系统。一是我还没使用过 Arch Linux 发行版,二是我对它的滚动更新和 aur 仓库比较感兴趣。安装过程本身相对顺利,Arch 的魅力让人无法抗拒。然而,在深入使用后,一个不大不小的问题浮出水面:官方源提供的内核版本相对较旧,并且最为关键的是,当前内核的音频驱动似乎无法正常工作。逼疯强迫症患者,我觉得我一定要把这个问题解决。
问题分析
官方提供的 Arch Linux 镜像的内核包名是 linux-opi
,Arch 仓库中提供了 linux-aarch64
内核包,这也是主线内核。但是如果使用主线内核,主线内核只保证板子能启动,测试下来别说音频,HDMI接口都无法工作,他甚至没有把接口写进设备树。
后来发现 linux-opi 内核包不存在于官方仓库中,但是 Aur 仓库里存在这个包,不过版本还是相当旧:https://aur.archlinux.org/packages/linux-opi
不知道有没有解决音频问题,没有尝试过。
最终我选择是使用 Armbian 的内核包进行移植,驱动都正常,并且内核版本较高(虽然依旧落后主线)
核心步骤
- 下载 Armbian 的核心包
- 解压内核镜像和内核模块到指定目录
- 重新生成initramfs
- 将新的内核写进启动项中
详细步骤
下载内核包
下载 Armbian 的仓库里适配设备的内核包,我是从清华大学镜像源里下载的:
这里存放所有的内核包和设备树:https://mirrors.tuna.tsinghua.edu.cn/armbian/pool/main/l/
截至本文,Orangepi Zero 3 可用的最新版本是6.12.35:https://mirrors.tuna.tsinghua.edu.cn/armbian/pool/main/l/linux-6.12.35/linux-image-current-sunxi64_25.5.2_arm64__6.12.35-S783c-Dbdda-Pfdaa-C0940H2313-HK01ba-Vc222-Ba566-R448a.deb
解压并释放文件
主要按照下图进行解压:

主要关注和解压如下的文件到系统中对应的目录:
该目录存放设备树:
/usr/lib/linux-image-6.12.35-current-sunxi64/allwinner
应该解压至:/boot/dtbs/allwinner
该目录存放内核镜像和内核必须的一些文件:
/boot
应该解压至:/boot
该目录存放内核模块:
/lib/modules
应该解压至:/usr/lib/modules(Arch中/lib是指向/usr/lib的链接)
内核镜像,内核模块,设备树的文件名都可以和原始内核错开,因此是可以共存的。
假设我们将内核镜像(vmlinuz-6.12.35-current-sunxi64)解压到 /boot/Image-armbian
,与内核放在一起的System.map和config文件也解压到 /boot
中(这两个文件不可删除/重命名),内核模块解压后应该位于 /usr/lib/modules/6.12.35-current-sunxi64
。设备树解压至 /boot/dtbs/allwinner/sun50i-h618-orangepi-zero3-armbian.dtb
。
生成新的initramfs
确保内核模块已经正确解压到 /usr/lib/modules/6.12.35-current-sunxi64
,生成新的initramfs需要内核模块。
生成initramfs.img:
sudo mkinitcpio -k 6.12.35-current-sunxi64 -g /boot/initramfs-armbian.img
配置启动项
检查如下位置:
/boot
中是否有新内核镜像 Image-armbian
,新内核依赖文件 System.map-6.12.35-current-sunxi64
和 config-6.12.35-current-sunxi64
。
/boot/dtbs/allwinner
中是否有新设备树 sun50i-h618-orangepi-zero3-armbian.dtb
。
/usr/lib/modules
中是否有新内核模块 6.12.35-current-sunxi64
。
编辑 /boot/extlinux/extlinux.conf
文件:
TIMEOUT 100 # 菜单显示超时,单位是1/10秒,因此这里是10秒
DEFAULT Arch Linux 6.12.35 Armbian # 默认启动项,填写默认启动项的LABEL
MENU TITLE Arch Linux OrangePi Boot Menu # 菜单标题
# 原始内核启动项
LABEL Arch Linux 6.1.31 OPI
KERNEL /Image
FDT /dtbs/allwinner/sun50i-h618-orangepi-zero3.dtb
APPEND initrd=/initramfs-linux.img console=ttyS0,115200 root=PARTUUID=12e4fc9c-02 rw rootwait audit=0 splash plymouth.ignore-serial-consoles
# 新内核启动项
LABEL Arch Linux 6.12.35 Armbian
KERNEL /Image-armbian # 指定新内核镜像
FDT /dtbs/allwinner/sun50i-h618-orangepi-zero3-armbian.dtb # 指定新设备树
APPEND initrd=/initramfs-linux-armbian.img console=ttyS0,115200 root=PARTUUID=12e4fc9c-02 rw rootwait audit=0 splash plymouth.ignore-serial-consoles # 指定新initramfs
随后正常重启板子,重启后最好能连接串口观察启动日志有无异常,如果能进入系统,使用 uname -a
查看内核信息:

结语
通过这一系列操作,我成功地将 Armbian 提供的、版本较新且驱动完善的 Linux 内核,移植到了 Arch Linux ARM 的环境中。这使得我在享受 Arch 滚动更新和简洁特性的同时,也拥有了完全正常工作的硬件(特别是音频)功能。
这个过程虽涉及一些系统底层的操作(如处理内核镜像、模块、设备树和引导配置),但每一步拆解开来都不算很难。最关键的是 路径匹配 和 版本一致性。如果出错,可以回滚文件(前提是你有),所以时常记得备份。
除非注明,否则均为天远日记原创文章,转载必须以链接形式标明本文链接
Comments NOTHING