私はデフォルトの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
末尾に注意)これが犯人だと思います。-hdd1
prefix
(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
私は実際にはgrubのデフォルト値を変更する方法を学びたい
prefix
(好奇心または行為と呼びます)。私は
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を確認してください。プレフィックスを自由に変更できるだけの十分な空きスペースがあります。
それでは興味深く重要な部分を見てみましょう。
すでに述べたように、バイナリファイルの長さは同じにしておく必要があります。新しいプレフィックスを 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
新しいスタートアップオプションを追加することを忘れないでください!
私はそれを使用しますefibootmgr
。efibootmgr
古い起動オプションを削除して新しい起動オプションを追加できます。
# 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
私の質問に対する答えはまだありません。つまり、prefix
grub-efiでデフォルト値を変更する方法がまだわからないということです。しかし、私は私の問題に対する解決策を見つけました。efibootmgr
救助に来てください。これまではよく理解できませんでした。
--bootloader-id=
これを行うと、まずそのオプションが破棄され、grub-install
結果は同じでした。今--bootloader-id=debian
ブートローダファイルが 。EFI\debian
EFI\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\debian
grubでそれを見つけることができます。