本文介绍如何在 Raspberry Pi 5 上面安装 Arch Linux ARM

硬件

  • Raspberry Pi 5 8G
  • Mcuzone MPS2280P 的 NVME SSD 转接板
  • Samsung 980 NVME SSD
  • Raspberry Pi 5 官方电源

我也尝试过 ZhiTai Ti 600 NVME SSD ,只能使用而 PCIe Gen 3 并且还会出现掉盘问题

宿主机

准备分区

替换 sdXfdisk -l 显示的你需要格式化的

# fdisk /dev/sdX

创建两个分区,一个 boot(500 MB 即可) 一个 root (剩下的)

n 用于创建新的分区,d 删除老分区,p 展示现在的设置, q 不保存退出,w保存退出

# mkfs.vfat -F 32 -n bootfs /dev/sdX1
# mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 -L rootfs -F /dev/sdX2

格式化就好

挂载

替换 mnt 为你的挂载点,这里因为 archlinux 的打包习惯,设置 chroot 后的 /boot 为 boot 分区是合适的,而非 /boot/firmware

# mount /dev/sdX2 mnt --mkdir
# mount /dev/sdX1 mnt/boot --mkdir

准备 bootstrap 包

下载 bootstrap 包 ArchLinuxARM-rpi-aarch64-latest.tar.gz 或者可以选择镜像里的 rpi-aarcxh64-latest.tar.gz 包

$ curl -JLO http://os.archlinuxarm.org/os/ArchLinuxARM-rpi-aarch64-latest.tar.gz

解压到挂载点 mnt

# bsdtar -xpf ArchLinuxARM-rpi-aarch64-latest.tar.gz -C mnt

配置

根据 archwiki 配置下面的文件

# ln -sf mnt/usr/share/zoneinfo/Asia/Shanghai mnt/etc/localtime
# vim mnt/etc/locale.gen
# vim mnt/etc/locale.conf
# vim mnt/etc/hostname
# vim mnt/etc/hosts
# vim mnt/etc/pacman.d/mirrorlist

编辑分区

# vim mnt/etc/fstab

如果你的 p1 分区是 boot ,p2 是 root 并且是 NVME SSD 那么就可以这样写 fstab

# Static information about the filesystems.
# See fstab(5) for details.

# <file system> <dir> <type> <options> <dump> <pass>
/dev/nvme0n1p1  /boot   vfat    defaults        0       2
/dev/nvme0n1p2  /       ext4    defaults        0       1

准备 qemu chroot

# pacman -S --no-confirm qemu-user-static qemu-user-static-binfmt arch-install-scripts
# systemctl restart systemd-binfmt.service
# arch-chroot mnt

内部

宿主机配置后续

# locale-gen

keyring

初始化并且更新 keyring

# pacman-key --init
# pacman-key --populate archlinuxarm
# pacman -Sy archlinux-keyring archlinuxarm-keyring

安装必要的软件

启动所需要的内核 firmware 以及 bootloader 等

# pacman -S --no-confirm linux-rpi linux-rpi-headers firmware-raspberrypi raspberrypi-bootloader rpi5-eeprom

文本编辑软件,我更倾向于安装 vim 作为文件编辑

# pacman -S --no-confirm vim

网路管理工具

# pacman -S --no-confirm networkmanager iwd wireless-regdb

一般 boot

编辑 boot 命令

# vim /boot/cmdline.txt

内容是,如果 p2 是 root 并且是 NVME SSD

root=/dev/nvme0n1p2 rw rootwait console=serial0,115200 console=tty1 fsck.repair=yes

SSD boot

编辑 config.txt 可以选择启用或者不启用 PCIe gen 3,默认是 gen 2

# vim /boot/config.txt

文本最后写入 [all] 后面的内容

[all]
dtparam=pciex1
#dtparam=pciex1_gen=3

EEPROM

更新 eeprom

# rpi-eeprom-update -a

查看当前配置

# rpi-eeprom-config /boot/pieeprom.upd

修改当前配置

# EDITOR=vim rpi-eeprom-config -e

我的配置

[all]
BOOT_UART=1
POWER_OFF_ON_HALT=0
BOOT_ORDER=0xf416

如果 POWER_OFF_ON_HALT=1 则会降低功耗,但是也可能会导致问题

Kernel 修复

删除 HOOKS 里的 kms 能修复 ==> WARNING: errors were encountered during the build. The image may not be complete. 报错

# vim /etc/mkinitcpio.conf

修改后如下

HOOKS=(base udev autodetect modconf keyboard keymap consolefont block filesystems fsck)

然后运行

# mkinitcpio -P

网络

创建 /etc/NetworkManager/system-connections/<wifi_name>.nmconnection 可以参考你宿主机器的配置,下面不一定标准

[connection]
id=<wifi_name>
type=wifi
interface-name=wlan0

[wifi]
mode=infrastructure
ssid=<ssid>

[wifi-security]
key-mgmt=wpa-psk
psk=<password>

[ipv4]
method=auto

[ipv6]
addr-gen-mode=default
method=auto

[proxy]

编辑/etc/networkmanager/conf.d/powersave.conf启用省电模式,避免 nvme 掉盘报错

[connection]
wifi.powersave = 2

取消掉所在国家的注释,避免brcmfmac: brcmf_set_channel: set chanspec fail

# vim /etc/conf.d/wireless-regdom
# set-wireless-regdom

准备自启动

# systemctl enable NetworkManager

省电/休眠配置

# systemctl mask sleep.target suspend.target hibernate.target hybrid-sleep.target

用户配置

删除 alarm 用户

# userdel alarm
# rm -rf /home/alarm

创建新用户

# useradd -m -G wheel <your_user>
# passwd <your_user>
# EDITOR=vim visudo

修改密码

# passwd root
# passwd <your_user>

SSH

对于每个用户都要有这个文件才能自动登陆

$ mkdir -p ~/.ssh
$ vim ~/.ssh/authorized_keys

写入宿主机器的 ~/.ssh/<ssh_key>.pub 的内容

使用

连接

同一个网路下

$ ssh <user>@<hostname>.local

GPIO

可以安装 python-gpiozeropython-rpi-gpio 来使用 pinout

测速

# hdparm -t /dev/nvme0n1

已知问题

nvme

如果硬盘不兼容,很有可能出现

nvme nvme0: controller is down; will reset: CSTS=0xffffffff, PCI_STATUS=0x10
nvme nvme0: Does your device have a faulty power saving mode enabled?
nvme nvme0: Try "nvme_core.default_ps_max_latency_us=0 pcie_aspm=off" and report a bug
nvme0n1: I/O Cmd(0x2) @ LBA 34489736, 512 blocks, I/O Error (sct 0x3 / sc 0x71) 
I/O error, dev nvme0n1, sector 34489736 op 0x0:(READ) flags 0x80700 phys_seg 59 prio class 2
nvme 0000:01:00.0: enabling device (0000 -> 0002)
nvme nvme0: Shutdown timeout set to 8 seconds
nvme nvme0: 4/0/0 default/read/poll queues

然后出现

brcmfmac: brcmf_set_channel: set chanspec 0xd0<两个字符> fail, reason -52

当然,这可能出现任何硬盘上面,并且一般是是和 NetworkManager / iwd / netcl 一类的网路管理器启动与否相关,可能二次启动网路管理器就会出现这种问题

错误教程

一些错误的教程,比如 kiljanikuyo 或许是已经过时,其中的删除 ArchLinuxARM-rpi-aarch64-latest.tar.gz 解压出来后的 boot 文件夹内的所有文件是完全错误的,因为正常的 树莓派5 的 boot 是由多个包掌握的,如果粗暴删除掉 bootstrap 压缩包的 boot 会导致 bootloader 也被删除,而不仅仅是删除内核。

# pacman -Qo /boot
/boot/ is owned by filesystem 2024.01.19-1
/boot/ is owned by linux-rpi 6.6.22-2
/boot/ is owned by raspberrypi-bootloader 20240320-1