錯誤的 grub 前綴 (efi) grub-install
和 update-grub
不能修復它
問題:
引導時,grub 會進入提示符(
grub>
, notgrub rescue>
)。我需要輸入:set prefix=(hd0,gpt8)/boot/grub insmod normal normal
獲得正常的 grub 菜單。
到目前為止,我發現的每一篇文章都是通過執行
grub-install
和/或update-grub
一旦您設法啟動系統來解決的。我嘗試了這些,但問題仍然存在。
細節:
我使用 Windows 10 和 pop-os(基於 ubuntu)雙啟動。我有一台啟動模式設置為
UEFI
和安全啟動的 acer 筆記型電腦enabled
。我的分區如下所示:
$ lsblk -o NAME,SIZE,FSTYPE,MOUNTPOINT,UUID,LABEL,PARTUUID,PARTTYPE NAME SIZE FSTYPE MOUNTPOINT UUID LABEL PARTUUID PARTTYPE sda 238.5G ├─sda1 529M ntfs 6272EE1672EDEF2B Recovery b593e2b8-992e-4d79-9074-d990ba21d10c de94bba4-06d1-4d40-a16a-bfd50179d6ac ├─sda2 100M vfat 64EE-A907 6ef6e12c-3858-4a83-a1dd-8297719bd477 c12a7328-f81f-11d2-ba4b-00a0c93ec93b ├─sda3 16M 1b6ba39a-e528-4cf9-b158-cd1a9312afc2 e3c9e316-0b5c-4db8-817d-f92df00215ae ├─sda4 117.2G ntfs 8E6008B56008A655 c2f2d5bf-16a3-4e99-a6db-2385b36f3f46 ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 ├─sda5 58.6G ntfs F6D0CCD7D0CC9EED Storage c10e8d39-26c3-4d3b-8548-0aa97816ba0b ebd0a0a2-b9e5-4433-87c0-68b6b72699c7 ├─sda6 477M swap 74da5edc-3b6c-4644-a151-6b93562c8fa4 408e91bd-c7e7-4ab8-a2ac-bb2bb7fde375 0657fd6d-a4ab-43c4-84e5-0933c84b4f4f │ └─cryptswap 476.5M swap [SWAP] 2d2336c7-64c1-4d53-8e99-f66f9b93bef5 ├─sda7 600M vfat /boot/efi 7565-8082 a8c1ff00-3790-4ca0-a360-642e6f1859f0 c12a7328-f81f-11d2-ba4b-00a0c93ec93b └─sda8 61G ext4 / d40fe3bd-0749-4c29-9e9b-97a064a659dd 8a3b8567-c511-48cd-a3fa-776b556d17da 0fc63daf-8483-4772-8e79-3d69d8477de4
- 分區 1-4 是由 Windows 創建的,引導載入程序在
sda2
.- 分區 5 是我創建的,用於在 windows/linux 之間輕鬆共享文件。
- 其餘分區由 pop-os 創建(完成 windows 安裝後),pop-os 引導載入程序在
sda7
.我將 grub 安裝為:
$ sudo apt install grub-efi $ sudo grub-install --bootloader-id=grub Installing for x86_64-efi platform. Installation finished. No error reported. $ sudo update-grub Sourcing file `/etc/default/grub' Sourcing file `/etc/default/grub.d/init-select.cfg' Generating grub configuration file ... Found linux image: /boot/vmlinuz-5.4.0-7642-generic Found initrd image: /boot/initrd.img-5.4.0-7642-generic Found linux image: /boot/vmlinuz-5.4.0-7634-generic Found initrd image: /boot/initrd.img-5.4.0-7634-generic Found linux image: /boot/vmlinuz-5.4.0-7629-generic Found initrd image: /boot/initrd.img-5.4.0-7629-generic Found linux image: /boot/vmlinuz-5.4.0-7626-generic Found initrd image: /boot/initrd.img-5.4.0-7626-generic Found Windows Boot Manager on /dev/sda2@/efi/Microsoft/Boot/bootmgfw.efi Adding boot menu entry for UEFI Firmware Settings done
之後我的
/boot
目錄如下所示:$ sudo tree -a /boot /boot ├── config-5.4.0-7626-generic ├── config-5.4.0-7629-generic ├── config-5.4.0-7634-generic ├── config-5.4.0-7642-generic ├── efi │ ├── c0cc91f7cdfcb9a597d9db525eb08842 │ ├── EFI │ │ ├── BOOT │ │ │ └── BOOTX64.EFI │ │ ├── Linux │ │ ├── grub │ │ │ ├── grub.cfg │ │ │ └── grubx64.efi │ │ ├── Pop_OS-d40fe3bd-0749-4c29-9e9b-97a064a659dd │ │ │ ├── cmdline │ │ │ ├── initrd.img │ │ │ ├── initrd.img-previous │ │ │ ├── vmlinuz.efi │ │ │ └── vmlinuz-previous.efi │ │ └── systemd │ │ └── systemd-bootx64.efi │ ├── loader │ │ ├── entries │ │ │ ├── Pop_OS-current.conf │ │ │ └── Pop_OS-oldkern.conf │ │ ├── loader.conf │ │ └── random-seed │ └── System Volume Information │ ├── AadRecoveryPasswordDelete │ └── ClientRecoveryPasswordRotation ├── grub │ ├── fonts │ │ └── unicode.pf2 │ ├── grub.cfg │ ├── grubenv │ └── x86_64-efi │ ├── acpi.mod | < files omitted ... > │ └── zstd.mod ├── initrd.img -> initrd.img-5.4.0-7642-generic ├── initrd.img-5.3.0-7642-generic < files omitted ... > ├── initrd.img.old -> initrd.img-5.4.0-7634-generic ├── System.map-5.4.0-7626-generic < files omitted ... > ├── vmlinuz -> vmlinuz-5.4.0-7642-generic ├── vmlinuz-5.4.0-7626-generic < files omitted ... > └── vmlinuz.old -> vmlinuz-5.4.0-7634-generic 16 directories, 314 files
/boot/efi/EFI/grub
,/boot/efi/EFI/BOOT
和下的文件/boot/grub
是由 新添加的grub-install
。此外,這對我來說看起來不錯:
$ cat /boot/efi/EFI/grub/grub.cfg search.fs_uuid d40fe3bd-0749-4c29-9e9b-97a064a659dd root hd0,gpt8 set prefix=($root)'/boot/grub' configfile $prefix/grub.cfg
重新啟動後,我按 F2 並設法添加
EFI/grub/grubx64
到啟動順序的頂部。保存並退出後,我進入 grub 提示符。
然後,使用
set
命令我看到以下輸出(省略了一些條目):grub> set cmdpath=(hd0,gpt7)/EFI/grub grub_cpu=x86_64 grub_platform=efi prefix=(hd0,gpt7)/EFI/ubuntu root=(hd0,gpt7)
我現在迷路了,似乎載入了正確的引導載入程序(
cmdpath=(hd0,gpt7)/EFI/pop
),但EFI/grub/grub.cfg
完全忽略了其中的設置。它從哪裡得到這些不正確的設置?如上所述修復後
prefix
,我得到了一個功能齊全的 grub 菜單,其中包含 1.pop-os、2.pop-os 備份圖像、3.windows 和 4.啟動設置的條目。我嘗試了所有選項,它們都有效。所以我設法啟動到popOs,
efibootmgr -v
告訴我這個:$ efibootmgr -v BootCurrent: 0003 Timeout: 0 seconds BootOrder: 0003,0001,0002,0000,2001,2002,2003 Boot0000* Windows Boot Manager HD(2,GPT,6ef6e12c-3858-4a83-a1dd-8297719bd477,0x109000,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)RC Boot0001* systemd PciRoot(0x0)/Pci(0x17,0x0)/Sata(2,0,0)/HD(7,GPT,a8c1ff00-3790-4ca0-a360-642e6f1859f0,0x160d3000,0x12c000)/File(\EFI\systemd\systemd-bootx64.efi)A01 .. Boot0002* HDD0: HFS256G39TND-N210A PciRoot(0x0)/Pci(0x17,0x0)/Sata(2,0,0)/HD(7,GPT,a8c1ff00-3790-4ca0-a360-642e6f1859f0,0x160d3000,0x12c000)RC Boot0003* grub PciRoot(0x0)/Pci(0x17,0x0)/Sata(2,0,0)/HD(7,GPT,a8c1ff00-3790-4ca0-a360-642e6f1859f0,0x160d3000,0x12c000)/File(\EFI\grub\grubx64.efi)A01 .. Boot0004* EFI USB Device RC Boot0005* EFI DVD/CDROM RC Boot0006* EFI Network RC Boot2001* EFI USB Device RC Boot2002* EFI DVD/CDROM RC Boot2003* EFI Network RC
我期望應該發生的事情
(hd0,gpt7)/EFI/grub/grub.efi
我從 UEFI 韌體啟動 grub 。- grub 讀取配置文件在
(hd0,gpt7)/EFI/grub/grub.cfg
. 這設置root
為(hd0,gpt8)
和prefix
。(hd0,gpt8)/boot/grub
- grub 將配置載入到
(hd0,gpt8)/boot/grub/grub.cfg
.- grub 為我提供了一個菜單,我選擇了我想要載入的作業系統並繼續我的一天。
實際發生了什麼
(hd0,gpt7)/EFI/grub/grub.efi
我從 UEFI 韌體啟動 grub 。- grub不讀取
(hd0,gpt7)/EFI/grub/grub.cfg
. 相反,它設置root
為(hd0,gpt7)
和。如上所述, 我手動修復了錯誤。prefix``(hd0,gpt7)/boot/ubuntu
prefix
3. grub 將配置載入到(hd0,gpt8)/boot/grub/grub.cfg
. 4. grub 為我提供了一個菜單,我選擇了我想要載入的作業系統並繼續我的一天。我嘗試過的事情:
- 禁用安全啟動(沒有區別)
- 重新執行
grub-install
和upgrade-grub
(沒有區別)sudo grub-install --target=x86_64-efi --efi-directory=/boot/efi --bootloader-id=grub --recheck --debug /dev/sda &> grub.log
(沒有區別,在這裡輸出)
這個問題的確切原因還不完全清楚,但它可能與 popOs 維護人員錯誤配置的 grub 包有關。
grub-install
我設法通過複製由to創建的 grub 文件來解決它/boot/efi/EFI/ubuntu
。如果您在 popOs 上並且沒有grub-install
任何選項,那麼以下應該可以工作:sudo mv /boot/efi/EFI/pop /boot/efi/EFI/ubuntu
我尚未測試的另一種解決方法是:
sudo cp /boot/grub/x86_64-efi/grub.efi /boot/efi/EFI/pop/grubx64.efi
有關詳細資訊,請參閱錯誤報告。
當
grubx64.efi
由 生成時grub-mkimage
,可以將預設prefix
值嵌入其中。在 Debian 中,這被設置為
/EFI/debian
whengrub-mkimage
被grub-install
;呼叫。在 Ubuntu 中,前綴將/EFI/ubuntu
分別為。這導致 GRUB 首先讀取位於 的迷你配置文件/EFI/(debian|ubuntu)/grub.cfg
,該文件通常只包含幾行將 GRUB 重定向到/boot
目錄/文件系統所在的位置,以從那裡讀取真正的配置文件:<any configuration lines required to cover complications like software RAID, disk encryption or LVM> search.fs_uuid <UUID of the filesystem that contains /boot> set prefix=($root)'/boot/grub' # or just ($root)/grub if /boot is a separate filesystem configfile $prefix/grub.cfg
如果你使用的是 Pop!OS 的 GRUB 包,如果 Pop 的打包者沒有給予足夠的重視,它的
grub-install
/ defaults中可能會有類似的遺留“ubuntuism” 。grub-mkimage
而且由於 Pop 的預設 UEFI 引導載入程序似乎是 gummiboot 而不是 GRUB,因此可能沒有註意到這樣的錯誤。如果您安裝了
grub-efi-amd64-signed
與 Secure Boot 兼容的軟體包,那麼您的原始版本/boot/efi/EFI/pop/grubx64.efi
實際上可能與 ./boot/grub/x86_64-efi/grub.efi
,因為前者已經完成了 Secure Boot 簽名過程,並且通常基本上內置了所有 GRUB 模組。也許 Pop!OS 開發人員
grub-efi-amd64-signed
按原樣使用 Ubuntu 的軟體包,而沒有應用他們對非 SecureBoot 簽名版本所做的更改?背景:
當
grub-install
與該--uefi-secure-boot
選項一起使用時,或者如果檢測到 Secure Boot,則不是使用為正在安裝 GRUB 的系統grub-mkimage
建構優化grubx64.efi
的,而是使用預編譯和 Secure Boot-signed/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed
。至少在 Debian 中,這是使用可重現的建構技術建構的,因此使用相應版本的源包和分離的 Secure Boot 簽名文件,任何人都可以自己編譯它並驗證結果與預建構的絕對相同版本。使該部分正常工作顯然是為什麼需要一段時間才能將安全引導支持引入 Debian 的主要原因。