Что 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...

Пока все хорошо! Кажется логичным, что эти две контрольные суммы должны быть идентичны.

Grub кажется мне немного более загадочным, когда я пытаюсь использовать его для достижения того же поведения, что и Syslinux.

Проведя небольшое расследование, 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байты отличаются, и я не могу понять, что вызывает эту разницу.

Есть ли сопоставимый mbr.binтип файла для Grub? Да boot.img? Изменяет ли Grub некоторые из этих байтов? Генерирует ли Grub эти отличающиеся байты на лету? Являются ли эти байты, сгенерированные Grub, специфичными для каждой системы и уникальными каждый раз, когда Grub их записывает?

решение1

Да, boot.imgзаписывается в первые 440 байт MBR. boot.imgсодержит "Блок параметров BIOS", содержащий данные, зависящие от системы, на которой он установлен. Эти данные записываются в BPM при установке Grub.Здесьэто исходный код.

Кстати, я бы не стал тратить много времени на GRUB. Этот код, вероятно, не будет работать на новых ПК через пару лет. Intel планирует избавиться от устаревшего режима BIOS к 2020 году.

Связанный контент