誤った grub プレフィックス (efi) `grub-install` と `update-grub` で修正できない

誤った grub プレフィックス (efi) `grub-install` と `update-grub` で修正できない

質問:

起動すると、grubはプロンプト(grub>代わりにgrub rescue>)を入力します。次の項目を入力する必要があります。

set prefix=(hd0,gpt8)/boot/grub
insmod normal
normal

一般的なグラップメニューを取得します。

これまでのところ、私が見つけたすべての記事はシステムブートを実行し、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

EFI/grub/grubx64再起動後、F2を押して起動順序の先頭に追加しました。ここに画像の説明を入力してください。

保存して終了すると、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上記のように修正した後、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.efiUEFI ファームウェアから 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.efiUEFI ファームウェアから grub を起動します。
  2. 幼虫確かにの設定ファイルを読んでください (hd0,gpt7)/EFI/grub/grub.cfgroot代わりに(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(違いなし、ここで出力)

ベストアンサー1

作成すると、デフォルト値をgrubx64.efi含めることができます。grub-mkimageprefix

Debian では に/EFI/debian設定されておりgrub-mkimagegrub-installUbuntu では接頭辞が/EFI/ubuntuあります。これにより、GRUBは最初にあるミニ構成ファイルを読み込みます。このファイルには通常、GRUBをディレクトリ/ファイルシステムのある場所/EFI/(debian|ubuntu)/grub.cfgにリダイレクトする数行しか含まれていません。そこから実際の設定ファイルを読み込みます。/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に類似した従来の「Ubuntu 注意」がある可能性があります。grub-mkimageそして、PopのデフォルトのUEFIブートローダはGRUBではなくGutmibootとして現れるので、これらのバグは目立たないかもしれません。

grub-efi-amd64-signedSecure Boot互換パッケージをインストールした場合、元のパッケージはSecure Boot署名プロセスを経て、通常はすべてのGRUBモジュールが組み込まれているため、/boot/efi/EFI/pop/grubx64.efi実際には異なる場合があります。/boot/grub/x86_64-efi/grub.efi

おそらく、Pop!OS開発者は、grub-efi-amd64-signedSecureBootではなく署名されたバージョンに変更を適用せずにUbuntuのパッケージをそのまま使用したのでしょうか。


背景:

grub-installこのオプションと一緒に使用するか、--uefi-secure-bootSecure Bootが検出された場合は、インストールするシステムgrub-mkimage構築に最適化されたGRUBを使用せずに、事前にコンパイルされたgrubx64.efiSecure Boot署名付きGRUBを使用します/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed

少なくともDebianでは再現可能なビルド技術を使用してビルドされているので、そのバージョンのソースコードパッケージとは別のセキュアブート署名ファイルを使用すると、誰でも直接コンパイルし、結果が事前にビルドされたものとまったく同じであることを確認できます。 1つのバージョン。得るそれ部分的にうまく機能するのは、Debianがセキュアブートサポートを受けるのに時間がかかる主な理由のようです。

おすすめ記事