Grub2

錯誤的 grub 前綴 (efi) grub-installupdate-grub 不能修復它

  • October 27, 2020

問題:

引導時,grub 會進入提示符(grub>, not grub 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

我期望應該發生的事情

  1. (hd0,gpt7)/EFI/grub/grub.efi我從 UEFI 韌體啟動 grub 。
  2. grub 讀取配置文件在(hd0,gpt7)/EFI/grub/grub.cfg. 這設置root(hd0,gpt8)prefix(hd0,gpt8)/boot/grub
  3. grub 將配置載入到(hd0,gpt8)/boot/grub/grub.cfg.
  4. grub 為我提供了一個菜單,我選擇了我想要載入的作業系統並繼續我的一天。

實際發生了什麼

  1. (hd0,gpt7)/EFI/grub/grub.efi我從 UEFI 韌體啟動 grub 。
  2. 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-installupgrade-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/debianwhengrub-mkimagegrub-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 的主要原因。

引用自:https://unix.stackexchange.com/questions/615109