web-dev-qa-db-ja.com

GrubはMBRブートのためにブートセクターに何を書き込みますか?

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-installgrub-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を実行します。これらのバイトは、ゼロにする前の状態に戻ります。

残念ながら、私はコードを十分に理解していないため、whatgrub-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がそれらを書き込むたびに一意ですか?

2
Will Haley

はい、 boot.imgはMBRの最初の440バイトに書き込まれます。 boot.imgには、インストールされているシステムに依存するデータを含む「BIOSパラメータブロック」が含まれています。このデータは、Grubのインストール時にBPMに書き込まれます。 ここ はソースコードです。

ところで、GRUBにはあまり時間をかけません。このコードは、おそらく2、3年以内に新しいPCで実行されないでしょう。 Intelは、2020年までにレガシーBIOSモードを廃止することを計画しています。

1
Johan Myréen