我在 EFI 系統上安裝了兩台 Archlinux,並使用 Gummiboot 設定。一個根目錄位於 /dev/sda2,另一個根目錄位於 /dev/sdb1。兩者都使用 /dev/sda1(EFI 系統分割區)作為其 /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.
...
我重新啟動進入,重新安裝核心 4.8.13,發現我可以再次sdb
啟動。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 映像,但兩者都覆蓋相同的核心。這作業系統儲存庫中包含的軟體包始終將映像放置在 /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
.