在 Raspberry Pi 4B 上安装 ArchLinux

Neofetch
很久之前就买了一个树莓派,不过一直在吃灰,正好最近有空就再拿出来折腾一下。原装系统是 32 位的,那么就必定要换一个 64 位的啦,不然对不起这 64 位的 CPU 呀。秉承“Arch大法好”的理念,我就决定用 Archlinux ARM 了。我非常建议先用原版系统更新 Bootloader 和 EEPROM到最新版本。这样可以避免各种奇怪的 bug 和使用一些新加入的功能,比如从网络启动什么的。

ArchLinux ARM 其实已经提供了树莓派的安装教程,基本上只要跟着做即可,我用的是 AArch64 镜像,并且把根文件系统从 ext4 换成了 f2fs,希望在 SD 卡上能有一点点加成效果。装完以后发现串口没有输出,自然不能忍,继续折腾。RPi 4B 一共有两个串口控制器,一个 PL011,另一个被称作 MiniUART。默认情况下,PL011 连接到蓝牙模块,并且 MiniUART 被禁用,但是我们可以通过 config.txt 加载 dtb overlay 来调整。一些常见的配置有:

  • 启用 MiniUART 串口,PL011 继续负责蓝牙
  • 禁用蓝牙,让 PL011 负责串口通信
  • 启用 MiniUART,让 MiniUART 负责蓝牙,PL011 负责串口

但是 ArchLinux ARM 使用 U-Boot 来启动内核,并不遵循 config.txt (╯°Д°)╯ ┻━┻

那么我们只能把 U-Boot 干掉了 (<ゝω・)☆

使用 MiniUART 作为串口

SD 卡的 \boot 目录里需要这么7个文件,RPi 4B 的 bootloader 才好启动 Linux 内核:

  • config.txt: 主要配置文件,uboot-raspberrypi 有提供,但是我们手写。
  • start4.elffixup4.dat: 第二阶段 Bootloader, 由 raspberrypi-bootloader 包提供。
  • rpi4.dtb: RPi 4B 的 Device Tree 文件, linux-aarch64 包中提供了一个基于上游代码的,位于 /boot/dtbs。但是我试了几次都不能正常启动,所以还是从 Raspberry Pi 官方的 Github 下载了一份。
  • Image: 内核可执行文件,由 linux-aarch64 包提供。
  • initramfs-linux.img:由 mkinitcpio 程序生成。
  • cmdline.txt: 内核参数文件,手写。

那么直接上配置:

1
2
3
4
5
enable_uart=1                               # 启用 MiniUART
kernel=Image # 指定内核文件的名称
arm_64bit=1 # 要求以 64 位模式启动,否则默认是 32 位
device_tree=rpi4.dtb # Github 上的 bcm2711-rpi-4-b.dtb 文件,我改了个名
initramfs initramfs-linux.img followkernel # 指定 initramfs 文件

start4.elffixup4.datcmdline.txt 都是原名,就无需写进 config.txt 里了。

1
console=serial0,115200 root=PARTUUID=e10d384f-02 rootfstype=f2fs rootflags=rw elevator=deadline audit=0 rootwait
  • PARTUUID 需要改成你自己的,可以用 sudo blkid 查看
  • rootflags f2fs 似乎默认以只读挂载,会导致没有办法登录。
  • audit=0 关掉 audit,否则内核信息撒得满地都是。

全部折腾完以后把 SD 卡塞进树莓派,应该就能在串口看到登录界面了。

使用 PL011 作为串口

我在安装的时候碰到一个 MiniUART 的 BUG,串口的 Baudrate 不对,内核输出一片乱码。可以尝试使用 PL011 作为串口,也可以升级内核解决。使用 PL011 需要在 boot 分区里加一个新的文件

  • overlays/disable-bt.dtbo: 需要从 Github 上下载,用来禁用蓝牙,并且让 PL011 负责串口通信。

同时需要修改 config.txt 加上 dtoverlay=disable-bt 以启用。此时 enable_uart=1 不再是必要的了。

登录之后

登录之后建议先把 uboot-raspberrypi 卸了,然后 dhcpcd 连上网 pacman -Syu 一下,再重启确认一下启动过程都正常。之后就是标准的 ArchLinux 服务器配置过程:时区, 网络, 防火墙, etc. 搞定以后我们就有一台 AArch64 服务器了。

暂时没有 GUI 的需求,相关的配置就留到下次再折腾了。