私たちはできる

私たちはできる

私はデフォルトのDebianバスターにOpenZFS 2.0.0をインストールして起動するために4日間を過ごしました。簡単に言えば、OpenZFS 2.0.0が実行され、バスターが起動しますが、少し手作業で助けが必要です。

再起動するたびに、 grub がコマンドラインに表示されます。明らかにgrub.cfgを実行していません。 grub.cfg を手動で実行すると、システムが起動します。

再起動後、コマンドラインでgrubを扱う他の多くのスレッドとQ&Aを読みました。しかし、私と同じような問題が見つかりませんでした。これまで問題を発見したと思います。私の質問は非常に具体的です。

grubのコマンドプロンプトでコマンドを実行すると、set次の行が表示されます(もちろん何よりも):

prefix=(hd0,gpt2)/EFI/debian

私はGrubの専門家だけでなく、Linuxの専門家でもありません。だから私は間違っているかもしれませんが、ブートローダ(grubx64.efiおよびそれぞれshimx64.efi)と設定ファイル(grub.cfg)は実際には。代わりににあるので(値が欠けている(hd0,gpt2)/EFI/debian-hdd1末尾に注意)これが犯人だと思います。-hdd1prefix(hd0,gpt2)/EFI/debian

したがってnormal、コマンドラインからこのコマンドを実行すると、何も起こりません(まあ、画面が更新されているように見えますが、何も起こりません)。しかし、初めて打者を打ったとき

set prefix=(hd0,gpt2)/EFI/debian-hdd1

その後、と入力すると、normal一般的なgrubブートメニューが表示されます。

prefixこれにより、この特別なケースでは変数が間違っていると考えられます。明らかに、grubはコマンドプロンプトに達したときにまだスクリプトを実行していません。したがって、値はprefixデフォルト値でなければなりません。

質問:

grubはこのデフォルト値をどこで取得しますか?コンパイル時のオプションですか、それともどこかに設定できますか?つまり、grub変数のデフォルト値prefix(つまり、スクリプトがまだ実行されていないときのこれらの変数の値)をどのように設定しますか?

注:

をインストールするgrub.cfgのではなく、インストールすると問題を解決できることがわかります。まだ試していません。 2つの理由があります。.../debian.../debian-hdd1

  1. 私は実際にはgrubのデフォルト値を変更する方法を学びたいprefix(好奇心または行為と呼びます)。

  2. 私はgrub-install、UEFIブートエントリ名(オプションを指定して設定--bootloader-id=debian-hdd1)を生成されたディレクトリ名として使用しているように見えるgrubをインストールしています。

    システムが起動するrpoolは、2つのディスクミラーで構成されており、いずれかのディスクに障害が発生した場合は別のディスクから起動できるため、この形式の起動エントリ名が必要です。したがって、UEFI BIOS設定で2つのディスクを区別できる必要があります。

答え1

私たちはできる

プレフィックスを永久に変更する方法を見つけました。ただし、次の注意事項があります。 grubx64.efi バイナリで直接変更し、ファイルの長さを同じにしてください。提供されるスペースの量はディストリビューションによって異なります。詳細な説明を読んでください。

婦人声明

  • これを行うには、次のことが必要です。セキュアブートオフハッシュ値が変更され、バイナリが拒否されるためです。独自のハッシュをインストールしてこの問題を解決できるかどうかはわかりません(MOK検索)。
  • 常にバックアップしてください変更するファイルの数。私の場合は合格するように起動可能なUSBフラッシュドライブ。他のシステムがない場合は、今すぐ起動可能なUSBを作成して起動できるかどうかをテストしてください。

まず質問:

デフォルトでは、質問全体は次のとおりです。安全な起動制限。セキュアブートで grubx64.efi ファイルを許可するには署名が必要です認められた機関によって。したがって、grub実行可能ファイルが署名され、あらかじめ焼いた。このプレフィックス設定の現在の標準はです/EFI/$(lsb_release -i -s)。もちろん、これは、efibootmgr--loader \\EFI\\other\\SSHIMX64.efi新しいブートオプションを作成するときにどのローダーパスを指定しても(たとえば)、grubブートローダーのプレフィックス変数に影響を与えないことを意味します。

解決策:

ディストリビューションがあり、ubuntu何らかの理由で名前をに変更したいとしますlongubuntu。次の手順を実行します。

# List contents of EFI directory
find /boot/efi/EFI;
# Rename the directory
mv /boot/efi/EFI/ubuntu /boot/efi/EFI/longubuntu;
# List contents of EFI/longubuntu for easy access
find /boot/efi/EFI/longubuntu;
# Always make a copy of the original
cp /boot/efi/EFI/longubuntu/BOOTX64.CSV /boot/efi/EFI/longubuntu/BOOTX64.CSV.bak
# Inside the .csv-file change 'ubuntu' to 'longubuntu'
nano /boot/efi/EFI/longubuntu/BOOTX64.CSV

続行する前に:

あることを確認してください。利用可能なヌル文字で十分です。バイナリファイルから。以下が重要です。全長は同じにしてください。。そうしないとエラーが発生します。このような場合元のgrubx64.efiにコピーしてください。それからもう一度やり直してください。いつVS Codeを使用してgrubx64.efi-binaryを確認してください。プレフィックスを自由に変更できるだけの十分な空きスペースがあります。
/EFI/ubuntu の後にヌル文字がたくさんあります。

それでは興味深く重要な部分を見てみましょう。

すでに述べたように、バイナリファイルの長さは同じにしておく必要があります。新しいプレフィックスを nul-chars( ) で埋めるか、テキストを nul-chars で埋めることで\0置き換えることができます。

したがって、私の場合のように長いプレフィックスを指定するには、次のようにします。

# Parameter -pi.bak will create a backup for you
perl -pi.perlbak -e 's/EFI\/ubuntu\0\0\0\0/EFI\/longubuntu/g' /boot/efi/EFI/longubuntu/grubx64.efi

短いプレフィックス(たとえばbent)を選択すると、新しい値に次の値が入力されます\0

# Parameter -pi.bak will create a backup for you
perl -pi.perlbak -e 's/EFI\/ubuntu/EFI\/bent\0\0/g' /boot/efi/EFI/longubuntu/grubx64.efi

ジョブの結果を確認でき、プレフィックスを含む行が印刷されます。

$~: grep -a 'EFI\/longubuntu' /boot/efi/EFI/longubuntu/grubx64.efi

以下を印刷します。
Grep は新しいプレフィックスを印刷します。

新しいスタートアップオプションを追加することを忘れないでください!

私はそれを使用しますefibootmgrefibootmgr古い起動オプションを削除して新しい起動オプションを追加できます。

# Print current boot options
:~# efibootmgr -v
BootCurrent: 0000
Timeout: 1 seconds
BootOrder: 0000
Boot0000* ubuntu        HD(1,GPT,28bd5547-5802-4f9c-97da-22ddd968dea6,0x800,0x100000)/File(\EFI\UBUNTU\SHIMX64.EFI)
# Delete current
:~# efibootmgr -b 0 -B
# List disks
:~# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
[...]
nvme0n1     259:0    0 238.5G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0   238G  0 part /
# Create new boot option
:~# efibootmgr --create --disk /dev/nvme0n1 --part 1 --label "Long Ubuntu Name" --loader \\EFI\\longubuntu\\shimx64.efi

楽しむ:

今再起動したら。それでも以前と同じようにディストリビューションで起動する必要があります。
それ以外の場合は、USBスティックで起動してEFIパーティションをマウントします。その後、変更をキャンセルするか、元のファイルにコピーし直してください。私のデバイスでは、次のようにEFIパーティションをマウントしました。

:~# lsblk
NAME        MAJ:MIN RM   SIZE RO TYPE MOUNTPOINT
[...]
nvme0n1     259:0    0 238.5G  0 disk
├─nvme0n1p1 259:1    0   512M  0 part /boot/efi
└─nvme0n1p2 259:2    0   238G  0 part /
:~# mkdir -p /media/efi; mount /dev/nvme0n1p1 /media/efi

答え2

grub-installを実行すると、/boot/grub/x86_64-efi/grubx64.efiこの参照が生成されます。/boot/grub/grub.cfg

問題は、にコピーするのではなく、またはを/EFI/$GRUB_DISTRIBUTOR/grubx64.efiコピーすることです。/usr/lib/grub/x86_64-efi/monolithic/grubx64.efi/usr/lib/grub/x86_64-efi-signed/grubx64.efi.signed

これはdebパッケージと参照用に事前に構築されたバイナリです/EFI/ubuntu/grub.cfg

署名が必要な場合はこれが必要であることを知っていますが、grubx64.efiセキュアブートに興味がない場合は、正しく実装できなければなりません。

grubx64.efiどの設定を行うべきかを説明する設定を見つけることができます。たぶん代替として扱われるかもしれないので、確認してみましょう。

しかし、私が見つけた最も簡単な解決策は手動でコピーし/boot/grub/x86_64-efi/grubx64.efi/EFI/$GRUB_DISTRIBUTOR/grubx64.efiインストールすることです。reFindこれは自動的にEFIフォルダをスキャンし、グラフィックメニュー項目を作成します。

/EFI/ubuntu/grub.cfg次のメニュー項目を作成することもできます。

set timeout=5
set default=0

menuentry '@gorilla configfile' {
        search.fs_uuid c9708fd5-155c-4459-abbe-3a08930cfd05 root lvmid/GkCLQl-oP2y-Op1F-o5Tc-TT8P-0tjW-iV2yTe/SlCPLV-S3jd-
        set prefix=($root)'/@gorilla/boot/grub'
        configfile $prefix/grub.cfg
}

menuentry '@gorilla chainload' {
        search.fs_uuid c9708fd5-155c-4459-abbe-3a08930cfd05 root lvmid/GkCLQl-oP2y-Op1F-o5Tc-TT8P-0tjW-iV2yTe/SlCPLV-S3jd-
        set prefix=($root)'/@gorilla/boot/grub'
        chainloader $prefix/x86_64-efi/core.efi
}

以前のgrubバイナリが更新された設定をロードできないときにgrub-biosに問題が発生したことがあるので、設定ファイルを使用するよりも問題を回避するためにチェーンを/boot/grub/grub.cfgロードする方が良いと思いました。core.efi

答え3

私の質問に対する答えはまだありません。つまり、prefixgrub-efiでデフォルト値を変更する方法がまだわからないということです。しかし、私は私の問題に対する解決策を見つけました。efibootmgr救助に来てください。これまではよく理解できませんでした。

--bootloader-id=これを行うと、まずそのオプションが破棄され、grub-install結果は同じでした。今--bootloader-id=debianブートローダファイルが 。EFI\debianEFI\debian-hdd1

もちろん、UEFI BIOS設定の起動メニュー項目もdebian避ける必要があります。幸い、マニュアルページを読んだ後、efibootmgrがこの状況を解決するのに適したツールであることが明らかになりました。

まず、名前が正しくないUEFI BIOS起動メニュー項目を削除しました。

efibootmgr -b 0001 -B

次に、正しい名前で新しいUEFI BIOS起動メニュー項目を作成しました。

efibootmgr -c -d /dev/sda -p 2 -w -L debian-hdd1 -l '\EFI\debian\shimx64.efi'

このコマンドは、EFIパーティションのブートローダであるかどうかに関係なく、実際のブートローダのインストールには影響しません/boot/grub。代わりに、実際にはUEFIファームウェアに起動メニュー項目を作成します。

これが私にとって必要なことです。実際、EFIブートローダがオンになっているかオフになっているかはEFI\debian関係ありませんEFI\something-elseするUEFI設定のブートローダエントリ名が心配です。以前は、これがUEFI設定でブートローダエントリの名前を適切に指定する唯一の快適な方法--bootloader-idだと思っていたので、質問がありました。grub-install

grub.cfgこれで初期値が含まれているため、システムは問題なくブートされるため、EFI\debiangrubでそれを見つけることができます。

関連情報