Debian 和 CentOS UEFI 雙啟動 - 無法載入 Debian
我正在嘗試使用 UEFI 引導在一個磁碟上安裝 Debian 和 CentOS。當 Debian 啟動時,我得到下圖中的錯誤:
為了解釋我是如何嘗試設置的,我將展示我對分區所做的工作。下面是我最初的 Debian 分區的圖片(注意我在最後留下了一些空閒空間來放置 CentOS “/” 掛載點)。
之後執行並安裝它工作正常。然後我插入一個 USB 驅動器來啟動和安裝 CentOS。當我進入分區螢幕時,它看起來是這樣的(在進行任何修改之前):
然後我為 CentOS 的 / 做了一個 20GiB 的分區。此外,在 Debian 分區部分下,我修改了 /boot/efi 分區,使其具有 /boot/efi 的“掛載點(見圖像的最右側)”。然後這似乎複製到 CentOS 分區部分。結果如下所示:
啟動時,我看到兩個選項,一個用於 CentOS,一個用於 Debian。如果我選擇 CentOS,它工作正常。如果我選擇 Debian,我會收到本文第一個連結中顯示的錯誤。我的問題是為什麼?
我的 EFI 目錄如下。
[root@localhost EFI]# cd /boot/efi/EFI [root@localhost EFI]# ls BOOT centos debian [root@localhost EFI]# ls centos debian centos: BOOT.CSV fonts fwupia32.efi grub.cfg grubx64.efi MokManager.efi shimx64-centos.efi BOOTX64.CSV fw fwupx64.efi grubenv mmx64.efi shim.efi shimx64.efi debian: grubx64.efi
我的 /boot/efi/EFI/centos/grub.cfg 如下:
# # DO NOT EDIT THIS FILE # # It is automatically generated by grub2-mkconfig using templates # from /etc/grub.d and settings from /etc/default/grub # ### BEGIN /etc/grub.d/00_header ### set pager=1 if [ -s $prefix/grubenv ]; then load_env fi if [ "${next_entry}" ] ; then set default="${next_entry}" set next_entry= save_env next_entry set boot_once=true else set default="${saved_entry}" fi if [ x"${feature_menuentry_id}" = xy ]; then menuentry_id_option="--id" else menuentry_id_option="" fi export menuentry_id_option if [ "${prev_saved_entry}" ]; then set saved_entry="${prev_saved_entry}" save_env saved_entry set prev_saved_entry= save_env prev_saved_entry set boot_once=true fi function savedefault { if [ -z "${boot_once}" ]; then saved_entry="${chosen}" save_env saved_entry fi } function load_video { if [ x$feature_all_video_module = xy ]; then insmod all_video else insmod efi_gop insmod efi_uga insmod ieee1275_fb insmod vbe insmod vga insmod video_bochs insmod video_cirrus fi } terminal_output console if [ x$feature_timeout_style = xy ] ; then set timeout_style=menu set timeout=5 # Fallback normal timeout code in case the timeout_style feature is # unavailable. else set timeout=5 fi ### END /etc/grub.d/00_header ### ### BEGIN /etc/grub.d/00_tuned ### set tuned_params="" set tuned_initrd="" ### END /etc/grub.d/00_tuned ### ### BEGIN /etc/grub.d/01_users ### if [ -f ${prefix}/user.cfg ]; then source ${prefix}/user.cfg if [ -n "${GRUB2_PASSWORD}" ]; then set superusers="root" export superusers password_pbkdf2 root ${GRUB2_PASSWORD} fi fi ### END /etc/grub.d/01_users ### ### BEGIN /etc/grub.d/10_linux ### menuentry 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-957.el7.x86_64-advanced-4b9ca680-8e47-494f-8a98-991aab9d51e6' { load_video set gfxpayload=keep insmod gzio insmod part_gpt insmod xfs set root='hd0,gpt3' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3 4b9ca680-8e47-494f-8a98-991aab9d51e6 else search --no-floppy --fs-uuid --set=root 4b9ca680-8e47-494f-8a98-991aab9d51e6 fi linuxefi /boot/vmlinuz-3.10.0-957.el7.x86_64 root=UUID=4b9ca680-8e47-494f-8a98-991aab9d51e6 ro crashkernel=auto rhgb quiet initrdefi /boot/initramfs-3.10.0-957.el7.x86_64.img } menuentry 'CentOS Linux (0-rescue-6afd59629baf4fd295f2313dd51b9e9e) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-6afd59629baf4fd295f2313dd51b9e9e-advanced-4b9ca680-8e47-494f-8a98-991aab9d51e6' { load_video insmod gzio insmod part_gpt insmod xfs set root='hd0,gpt3' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt3 --hint-efi=hd0,gpt3 --hint-baremetal=ahci0,gpt3 4b9ca680-8e47-494f-8a98-991aab9d51e6 else search --no-floppy --fs-uuid --set=root 4b9ca680-8e47-494f-8a98-991aab9d51e6 fi linuxefi /boot/vmlinuz-0-rescue-6afd59629baf4fd295f2313dd51b9e9e root=UUID=4b9ca680-8e47-494f-8a98-991aab9d51e6 ro crashkernel=auto rhgb quiet initrdefi /boot/initramfs-0-rescue-6afd59629baf4fd295f2313dd51b9e9e.img } if [ "x$default" = 'CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)' ]; then default='Advanced options for CentOS Linux>CentOS Linux (3.10.0-957.el7.x86_64) 7 (Core)'; fi; ### END /etc/grub.d/10_linux ### ### BEGIN /etc/grub.d/20_linux_xen ### ### END /etc/grub.d/20_linux_xen ### ### BEGIN /etc/grub.d/20_ppc_terminfo ### ### END /etc/grub.d/20_ppc_terminfo ### ### BEGIN /etc/grub.d/30_os-prober ### menuentry 'Debian GNU/Linux (9.8) (on /dev/sda2)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-simple-9a0b0533-9320-45f1-9b3d-0860da8822be' { insmod part_gpt insmod ext2 set root='hd0,gpt2' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 9a0b0533-9320-45f1-9b3d-0860da8822be else search --no-floppy --fs-uuid --set=root 9a0b0533-9320-45f1-9b3d-0860da8822be fi linux /boot/vmlinuz-4.9.0-8-amd64 root=UUID=9a0b0533-9320-45f1-9b3d-0860da8822be ro quiet initrd /boot/initrd.img-4.9.0-8-amd64 } submenu 'Advanced options for Debian GNU/Linux (9.8) (on /dev/sda2)' $menuentry_id_option 'osprober-gnulinux-advanced-9a0b0533-9320-45f1-9b3d-0860da8822be' { menuentry 'Debian GNU/Linux (on /dev/sda2)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.9.0-8-amd64--9a0b0533-9320-45f1-9b3d-0860da8822be' { insmod part_gpt insmod ext2 set root='hd0,gpt2' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 9a0b0533-9320-45f1-9b3d-0860da8822be else search --no-floppy --fs-uuid --set=root 9a0b0533-9320-45f1-9b3d-0860da8822be fi linux /boot/vmlinuz-4.9.0-8-amd64 root=UUID=9a0b0533-9320-45f1-9b3d-0860da8822be ro quiet initrd /boot/initrd.img-4.9.0-8-amd64 } menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64 (on /dev/sda2)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.9.0-8-amd64--9a0b0533-9320-45f1-9b3d-0860da8822be' { insmod part_gpt insmod ext2 set root='hd0,gpt2' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 9a0b0533-9320-45f1-9b3d-0860da8822be else search --no-floppy --fs-uuid --set=root 9a0b0533-9320-45f1-9b3d-0860da8822be fi linux /boot/vmlinuz-4.9.0-8-amd64 root=UUID=9a0b0533-9320-45f1-9b3d-0860da8822be ro quiet initrd /boot/initrd.img-4.9.0-8-amd64 } menuentry 'Debian GNU/Linux, with Linux 4.9.0-8-amd64 (recovery mode) (on /dev/sda2)' --class gnu-linux --class gnu --class os $menuentry_id_option 'osprober-gnulinux-/boot/vmlinuz-4.9.0-8-amd64-root=UUID=9a0b0533-9320-45f1-9b3d-0860da8822be ro single-9a0b0533-9320-45f1-9b3d-0860da8822be' { insmod part_gpt insmod ext2 set root='hd0,gpt2' if [ x$feature_platform_search_hint = xy ]; then search --no-floppy --fs-uuid --set=root --hint-bios=hd0,gpt2 --hint-efi=hd0,gpt2 --hint-baremetal=ahci0,gpt2 9a0b0533-9320-45f1-9b3d-0860da8822be else search --no-floppy --fs-uuid --set=root 9a0b0533-9320-45f1-9b3d-0860da8822be fi linux /boot/vmlinuz-4.9.0-8-amd64 root=UUID=9a0b0533-9320-45f1-9b3d-0860da8822be ro single initrd /boot/initrd.img-4.9.0-8-amd64 } } ### END /etc/grub.d/30_os-prober ### ### BEGIN /etc/grub.d/40_custom ### # This file provides an easy way to add custom menu entries. Simply type the # menu entries you want to add after this comment. Be careful not to change # the 'exec tail' line above. ### END /etc/grub.d/40_custom ### ### BEGIN /etc/grub.d/41_custom ### if [ -f ${config_directory}/custom.cfg ]; then source ${config_directory}/custom.cfg elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then source $prefix/custom.cfg; fi ### END /etc/grub.d/41_custom ###
更新- 有一個可行的解決方案,但不高興我是如何到達那裡的(我想告訴我為什麼我的系統以這種方式結束):在我手動編輯的 /boot/efi/EFI/centos/grub.cfg 文件中Debian 菜單項(或子菜單項)下的行分別以單詞“linux”或 initrd 到單詞“linuxefi”和“initrdefi”開頭。我不明白為什麼我必須手動編輯這個grub 文件以使我的 debian 系統啟動。我必須在作業系統的安裝/設置階段做一些非常錯誤的事情才能遇到這個問題。發生了什麼?
看起來 CentOS 的
/etc/grub.d/30_os-prober
腳本沒有考慮到 CentOS GRUB 使用與安全啟動兼容的linuxefi
/initrdefi
關鍵字並省略了對傳統linux
/initrd
的支持。(或者也許支持將作為 GRUB 模組提供,但安全引導需要載入所有可執行程式碼以使用 UEFI 標準可執行/庫格式,而 GRUB 模組不是。)另一方面,Debian 使用傳統的
linux
/initrd
關鍵字,因為它們具有強烈的支持自由軟體(以及因此反安全啟動)的立場。CentOS
os-prober
顯然只是按原樣複製了 Debian 的 GRUB 配置文件中的配置行,而沒有進行必要的更改。os-prober
如果有人尚未報告,您可以在 CentOS 上送出有關此的錯誤報告。