我在使用 gummiboot 设置的 EFI 系统上安装了两个 Archlinux。一个根目录为 /dev/sda2,另一个根目录为 /dev/sdb1。两者都使用 EFI 系统分区 /dev/sda1 作为其 /boot 分区,但将其内核映像放在不同的位置:
/boot/loader/entries/arch.conf:
title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options root=/dev/sda2 rw
/boot/loader/entries/arch-here.conf:
title HERE Arch Linux
linux /here-img/vmlinuz-linux
initrd /here-img/intel-ucode.img
initrd /here-img/initramfs-linux.img
options cryptdevice=/dev/sdb1:cryptroot root=/dev/mapper/cryptroot rw
一切都很好,直到我将内核从 4.8.13 更新到 4.9 sdb
。下次我启动时sda
,它失败了
Warning: /lib/modules/4.8.13-1-ARCH/modules.devname not found
...
ERROR: device '/dev/sda2 not found. Skipping fsck.
...
我重新启动sdb
,重新安装内核 4.8.13,发现我可以sda
再次启动。但是,现在我无法再启动sdb
,因为它无法加载打开 /dev/sdb1 所需的加密钩子。
我通过 chroot 到 /dev/sdb1sda
并再次安装 4.9 解决了这个问题。这允许我启动sdb
但不能sda
。
现在我陷入了一个循环,每次我想在安装之间切换时,我都需要重建内核映像。似乎两个内核在某种程度上互相干扰。
sda
每次我想要启动时,我都会执行以下步骤sdb
:
sudo cryptsetup open /dev/sdb1 cryptroot
sudo mount /dev/mapper/cryptroot /mnt/
sudo mount /dev/sda1 /mnt/boot/
chroot /mnt/
sudo pacman -U /var/cache/pacman/pkg/linux-4.8.13-1-x86_64.pkg.tar.xz /var/cache/pacman/pkg/nvidia-375.20-3-x86_64.pkg.tar.xz /var/cache/pacman/pkg/nvidia-utils-375.20-3-x86_64.pkg.tar.xz
sdb
我想移动到时所经历的步骤sda
类似,但失败了
/lib/modules/4.8.13-1-ARCH is not a valid kernel module directory
我通过将 /lib/modules/4.9-1-ARCH 符号链接到 /lib/modules/4.8.13-1-ARCH 来解决这个问题。
我确信我至少犯了一个错误,如果不是很多错误的话(那个符号链接看起来像是一个糟糕的黑客行为)。似乎我的内核以某种方式干扰了。我该如何解决这个问题?
答案1
我设法得到一些帮助在 Arch 论坛上并想在这里分享。
尽管每个系统都在写入不同的 initramfs 映像,但两者都在覆盖相同的内核。Linux的存储库中包含的软件包始终将映像放置在 /boot/vmlinuz-linux 中。讨论了几个选项:
- 在一个系统上安装不同的主流 Linux 包。
- 从 AUR 构建一个重命名内核的自定义 Linux 包。
- 为每个系统使用单独的 EFI 分区。
我选择了 1,因为它看起来最简单。在一个系统上安装linux-lts
而不是linux
在一个系统上安装可以防止内核干扰。启动项现在如下所示:
/boot/loader/entries/arch.conf
title Arch Linux
linux /vmlinuz-linux
initrd /intel-ucode.img
initrd /initramfs-linux.img
options root=/dev/sda2 rw
/boot/loader/entries/arch-here.conf
title HERE Arch Linux
linux /vmlinuz-linux-lts
initrd /initramfs-linux-lts.img
options cryptdevice=/dev/sdb1:cryptroot root=/dev/mapper/cryptroot rw
请注意,想要采用这种方法的 nvidia 用户需要安装nvidia-lts
而不是nvidia
。