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つのチェックサムは同一である必要があることは論理的に思われます。
Grubを使用して、Syslinuxと同じ動作を実現しようとすると、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'
source のいくつかを見ると、私はthinkgrub-bios-setup
がMBRへの書き込みを担当していると考えています。最初の512バイトをゼロにすると、 -grub-bios-setup
を実行します。これらのバイトは、ゼロにする前の状態に戻ります。
残念ながら、私はコードを十分に理解していないため、whatがgrub-bios-setup
によって記述されていることを完全に理解できません。
私はいくつかの勘がありました。 I think書かれていることの一部は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がそれらを書き込むたびに一意ですか?
はい、 boot.img
はMBRの最初の440バイトに書き込まれます。 boot.img
には、インストールされているシステムに依存するデータを含む「BIOSパラメータブロック」が含まれています。このデータは、Grubのインストール時にBPMに書き込まれます。 ここ はソースコードです。
ところで、GRUBにはあまり時間をかけません。このコードは、おそらく2、3年以内に新しいPCで実行されないでしょう。 Intelは、2020年までにレガシーBIOSモードを廃止することを計画しています。