在 RPI3 UEFI 上安装 Arch Linux ARM

· 354 words · 2 minute read

既然都有 UEFI 了,那么安装 Arch Linux ARM 自然也不是难事。好在 Arch Linux ARM 官方提供了通用镜像,而且支持 EFISTUB,这使得安装异常简单。

注意!

这不是任何产品的官方文档、帮助或使用说明,仅代表博主个人的经验总结,难免会有疏漏和错误之处。请务必结合官方文档进行阅读,以作补充。

安装 Arch Linux ARM 和普通电脑的 Arch Linux 安装类似,不过这个 / 是装好的。其他的分区表、分区等都大同小异。在读本文之前,建议阅读上一篇, RPI 3 上的 UEFI

根据上一篇所述,ESP 分区和系统分区可以无需在 SD 卡上,这为 USB 启动(使用 SD 卡作为 UEFI 固件)成为了可能。本文会探讨两种方式,均可以启动 Arch Linux ARM。

  1. 直接使用 SD 卡启动。这样做要求 SD 卡的分区表和引导分区类型。详情参考上一篇。
  2. 使用 SD 卡 + USB 启动。这样做 USB 的分区表可以使用 GPT,ESP 也可以使用 ESP 类型,不过有些麻烦和问题,这个后面会讲到。

已知问题 #

由于 Arch Linux ARM EFISTUB 中内核命令行是写死的,并且 Hard code 了 root 分区 (来源忘记),所以导致了 如果不修改内核参数,Root 必须位于 mmcblk0p2 ,也就是 SD 卡的第二个分区。 这使 USB 引导异常麻烦。具体的临时解决方案后面会讲到。 更新:已经找到了使用 Grub 的办法。可以轻松进行不依赖于固件的引导。请查看后文。

接下来,作为教程,我们直奔主题。如果你想用 SD 卡安装,请读下面。想用 USB 请跳过「使用 SD 卡安装」章节。

安装之前的准备工作 #

这里列举安装所需的内容:

使用 SD 卡安装 #

首先,根据上一篇的要求,分区、格式化并写入 UEFI 固件。

注意!

建议将 SD 卡引导分区设置为 200M 及以上,因为 Arch Linux ARM 的 /boot 有近 100M。

其次,创建一个主分区,作为 Root。格式化 ext4

挂载主分区到 /mnt,建立 /mnt/boot,挂载引导分区到 /mnt/boot

MOUNTPOINT=/mnt
mount /dev/xxx2 $MOUNTPOINT # 需要 Root
mkdir -v $MOUNTPOINT/boot # 需要 Root
mount /dev/xxx1 $MOUNTPOINT/boot # 需要 Root

之后解压缩镜像:

bsdtar -xpf /path/to/your/ArchLinuxARM-aarch64-latest.tar.gz -C $MOUNTPOINT # 需要 Root

然后卸载。注意,在较慢的设备上卸载可能会花费较长时间(我这里约 5 分钟),请坐和放宽。

提示

boot/Image 是 EFISTUB 内核。可以考虑把它复制到 boot/EFI/boot/bootaa64.efi,这样就无需手动设置引导项了,因为这是 UEFI Spec 中指定的缺省值。

最后,重启,进入 Setup 并添加引导项即可(EFI App 为 Image)。记得更改启动顺序(如果需要)。

使用 USB 安装 #

首先,如上一篇中所述,准备一个带有 UEFI 固件的 SD 卡。

其次,准备 U 盘:

创建 GPT 分区表(理论上均可) 创建一个 ESP 分区,200M(由于 Arch Linux ARM 的 /boot 比较大,几乎到 100M),类型 ESP。 格式化 ESP 分区为 vfat 创建一个 Root 分区并格式化 ext4,和其他分区(如果需要)。 挂载 Root 到 /mnt,并挂载 ESP 到 /mnt/boot(需要新建)。和日常安装 Arch 的步骤一致。

MOUNTPOINT=/mnt
mount /dev/xxx2 $MOUNTPOINT # 需要 Root
mkdir -v $MOUNTPOUNT/boot # 需要 Root
mount /dev/xxx1 $MOUNTPOINT/boot # 需要 Root

之后解压缩镜像:

bsdtar -xpf /path/to/your/ArchLinuxARM-aarch64-latest.tar.gz -C $MOUNTPOINT # 需要 Root

然后卸载。注意,在较慢的设备上卸载可能会花费较长时间(我这里约 5 分钟),请坐和放宽。

设置引导项,修复内核参数 #

刚才讲到,Arch Linux ARM 似乎写死了 mmcblk0p2(这里不太清楚),所以导致无法 USB 启动。我们可以修改内核参数来修改,可能的做法如下,不过均有弊端:

  • 自己安装 Bootloader。systemd-boot 无法使用,rEFINDClover 没有包。 Grub 没有测试。 更新:Grub 似乎是最好的解决方案。 请查看下一篇文章:在 Arch Linux ARM (UEFI) 上使用 Grub
  • 使用 cmdline.txt 没有查到太多信息,估计不可行。
  • 每次启动都用 EFI Shell 手写。emmmmmmmm
  • 让 UEFI 固件传递参数。可以使用,但有长度限制,Arch Linux ARM 官方的 RPI3 cmdline 很长,所以一些东西只能省略掉了。同时,尚不清楚还原配置或升级 UEFI 固件是否会丢失引导项。

为了方便起见,这里使用第三种方式。

打开 Setup,新建引导项,选择文件(Image),参数填:

root=/dev/sda2 rootwait

解释:root 参数设置 Root 分区。rootwait 是必须的,因为系统检测 USB 似乎会有延迟,所以如果不加 rootwait 则只能检测到 SD 卡,导致 Panic。

最后,记得修改启动顺序。

注意

这种做法仍有弊端,如无法加入很长的参数、可能的配置丢失等。如读者有更好的建议,请不吝赐教。

安装后配置 #

根据 官方文档,安装后需要执行:

pacman-key --init
pacman-key --populate archlinuxarm

其他配置可以自行探索。Fstab 默认是没有配置的,这里建议挂载启动分区(如果是 USB 启动则是 U 盘的而不是 SD 卡的)为 /boot,方便滚包更新内核。

参考 #