分类
Linux

在 RPI3 UEFI 上安装 Arch Linux ARM

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

既然都有 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。

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

<s>注意!</s>

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

安装后配置

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

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

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

参考