
我有兩個硬碟,有兩個對應的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