私はデフォルトの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