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

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 つのチェックサムは同一であるはずであると考えるのが妥当でしょう。

Syslinux と同じ動作を実現するために Grub を使用しようとすると、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'

いくつかのソース、 私考えるこれがgrub-bios-setupMBR への書き込みを担当するものです。最初の 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.imgMBR の最初の 440 バイトに書き込まれます。boot.img「BIOS パラメータ ブロック」が含まれており、これにはインストールされているシステムに依存するデータが含まれています。このデータは、Grub がインストールされると BPM に書き込まれます。ここソースコードです。

ちなみに、GRUB にはあまり時間を費やさないほうがいいでしょう。このコードはおそらく数年後には新しい PC では動作しなくなるでしょう。Intel は 2020 年までにレガシー BIOS モードを廃止する予定です。

関連情報