syslinuxの一部インストールプロセスmbr.bin
デバイスのマスター ブート レコードへのインストールが含まれます。
dd \
conv=notrunc \
bs=440 \
count=1 \
if=/usr/lib/syslinux/mbr/mbr.bin \
of=/dev/sdX
それらのバイトをディスクから復元し、元のmbr.bin
ファイルと比較すると、同一です。
$ sha512sum /usr/lib/syslinux/mbr/mbr.bin
3ba2bd96c7e5d81e...
$ dd bs=440 count=1 if=/dev/sdX | sha512sum
3ba2bd96c7e5d81e...
ここまでは順調です! これら 2 つのチェックサムは同一であるはずであると考えるのが妥当でしょう。
Syslinux と同じ動作を実現するために Grub を使用しようとすると、Grub は私にとって少し神秘的に思えます。
少し調べてみると、新しいブートローダーをインストールするときに、インストールでこれが呼び出されるdpkg-reconfigure grub-pc
ことがわかりました...grub
grub-install --target=i386-pc --force --no-floppy /dev/sdX
同じgrub-install
コマンドを実行して を追加すると、 が を呼び出す--verbose
ことがわかります。grub-install
grub-bios-setup
grub-bios-setup \
--verbose \
--force \
--directory='/boot/grub/i386-pc' \
--device-map='/boot/grub/device.map' \
'/dev/sdX'
いくつかのソース、 私考えるこれがgrub-bios-setup
MBR への書き込みを担当するものです。最初の 512 バイトをゼロにして再実行するとgrub-bios-setup
、それらのバイトがゼロにする前の状態に戻ります。
残念ながら、私はコードを完全に理解できるほどには理解していません何は によって書かれていますgrub-bios-setup
。
いくつか予感はありました。考える書き込まれる内容の一部は と関係がありますboot.img
。実際、ブート セクターの特定のバイトを と と比較するとboot.img
、それらは同じです (ここで読み取られるバイトの合計数は であることに注意してください440
)。
$ skip=104 count=336; \
sudo dd if=/boot/grub/i386-pc/boot.img \
skip=$skip bs=1 count=$count 2>/dev/null | sha512sum ; \
sudo dd if=/dev/sdX \
skip=$skip bs=1 count=$count 2>/dev/null | sha512sum
e531a81fd3eedb324a9...
e531a81fd3eedb324a9...
類似点はあるものの、全体的に同じです。最初の104
バイトが異なり、その違いの原因がわかりません。
Grub に同等の種類のファイルはありますかmbr.bin
? ありますかboot.img
? Grub はそれらのバイトの一部を変更しますか? Grub はそれらの異なるバイトをオンザフライで生成しますか? Grub によって生成されるそれらのバイトは各システムに固有であり、Grub が書き込むたびに一意ですか?
答え1
はい、boot.img
MBR の最初の 440 バイトに書き込まれます。boot.img
「BIOS パラメータ ブロック」が含まれており、これにはインストールされているシステムに依存するデータが含まれています。このデータは、Grub がインストールされると BPM に書き込まれます。ここソースコードです。
ちなみに、GRUB にはあまり時間を費やさないほうがいいでしょう。このコードはおそらく数年後には新しい PC では動作しなくなるでしょう。Intel は 2020 年までにレガシー BIOS モードを廃止する予定です。