如何在 Ubuntu 的 grub 中使用 initramfs 啟動到 Arch Linux?

如何在 Ubuntu 的 grub 中使用 initramfs 啟動到 Arch Linux?

我有兩個硬碟,有兩個對應的Grub。一個來自 Arch Linux,另一個來自 Ubuntu。使用 Arch 的 grub,我可以啟動到任一發行版。但是,使用 Ubuntu 的 grub,我可以同時看到 Arch 和 Ubuntu,但無法啟動到 Arch。我收到錯誤:

Kernel offset
End kernel panic. Not syncing: VFS.
Unable to mount root fs on unknown-block.

我比較grub.cfg了兩種發行版。在 Ubuntu 的 grub 中,我可以看到 Arch 的條目,其中包含以下行。

initrd /boot/intel-ucode.img

我將其更改為遵循 Arch 的grub.cfg

initrd /boot/intel-ucode.img /boot/initramfs-linux.img

現在我可以從 Ubuntu 的 grub 啟動到 Arch。 Ubuntu 似乎在預設情況下沒有附加此必要選項。如何讓Ubuntu自動建立正確的條目?

編輯

我正在用 更新 Arch 的 grub grub-mkconfig -o /boot/grub/grub.cfg。在 Ubuntu 中,我嘗試了update-grub上面的原始命令(它的別名)。

編輯2

未註解的行/etc/default/grub

GRUB_DEFAULT="saved"
GRUB_SAVEDEFAULT="true"
GRUB_HIDDEN_TIMEOUT_QUIET="true"
GRUB_TIMEOUT="3"
GRUB_DISTRIBUTOR="`lsb_release -i -s 2> /dev/null || echo Debian`"
GRUB_CMDLINE_LINUX_DEFAULT=""
GRUB_CMDLINE_LINUX=""

答案1

實際上,需要修改兩個檔案來解決這個問題。我已經在 Lubuntu 16.04.1 和 Manjaro Linux 上對此進行了測試。

在Ubuntu中:

1) 文件/usr/lib/linux-boot-probes/mounted/40grub2 有一個函數 parse_grub_menu 不處理所有 initrd 參數。您需要修改'案例“$1”在... initrd)':

a) 刪除分配

initrd="$(echo "$2" ...)"

b) 增加兩行代替刪除的一行:

shift 1
initrd="$(echo "$@" | sed 's/(.*)//')"

2) 文件/etc/grub.d/30_os-prober 在 for 迴圈中修正 LINITRD 的分配:

for LINUX in ${LINUXPROBED}; do
...
    LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"

第一個修復考慮了 Manjaro 的所有可用 initrd 資訊。第二個修復透過將一些「^」字元更改為空格來清理生成的 initrd 行。

答案2

我正在運行 Manjaro 和 Arch,但諷刺的是,Manjaro 會犯下與 Ubuntu 類似的錯誤。因此,也許 30_os_prober 中的以下補丁仍然可以幫助某人。

後:

LINITRD="`echo ${LINUX} | cut -d ':' -f 5 | tr '^' ' '`"

添加:

if [ "${OS}" = "Arch Linux" ] ; then
  LINITRD="/boot/intel-ucode.img ${LINITRD}"
fi

答案3

編輯grub.cfg文件並運行後它起作用了:

sudo update-grub
sudo grub.mkconfig

相關內容