在 Raspberry Pi 4B 上安装 ArchLinux
很久之前就买了一个树莓派,不过一直在吃灰,正好最近有空就再拿出来折腾一下。原装系统是 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.elf
和fixup4.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 | enable_uart=1 # 启用 MiniUART |
start4.elf
、fixup4.dat
和 cmdline.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 的需求,相关的配置就留到下次再折腾了。