Что пишет Grub в загрузочный сектор для загрузки MBR?

777
Will Haley

Часть процесса установки 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
Я пытался посмотреть в своей системе, чтобы увидеть, что она использует, но ... я перешел на EFI некоторое время назад. Ignacio Vazquez-Abrams 6 лет назад 0

1 ответ на вопрос

1
Johan Myréen

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

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

Спасибо за эту информацию! Когда вы говорите «Эти данные записываются в BPM, когда Grub установлен», вы имеете в виду, что данные BPB извлекаются / записываются во время установки Grub в MBR? Таким образом, выполнение чего-то вроде `grub-install` приводит к тому, что системный BPB и общий` boot.img` объединяются в эти 440 байтов в MBR? Или вы имеете в виду, что BPB записывается, когда двоичные файлы / пакеты Grub установлены в хост-системе? Will Haley 6 лет назад 0
И я знаю, что EFI - это современный / правильный способ ведения дел, но я не осознавал, что в устаревшем BIOS был какой-то крайний срок. Приятно знать, что дата 2020 года. Спасибо! Will Haley 6 лет назад 0
Когда Grub установлен, программа установки считывает `boot.img` в память и распаковывает его перед записью на диск как новый MBR. Данные поступают из двух разных источников: BPM и таблица разделов считываются с диска, а некоторые генерируются на лету, например, загрузочный диск (смещение 0x64) и kernel_sector (смещение 0x5c). Даже два байта инструкции заменяются на NOP, если это необходимо. BPM отсутствует в MBR, но соответствующие байты все равно копируются. Johan Myréen 6 лет назад 0
Intel объявила о крайнем сроке 2020 года в конце 2017 года, но я не задерживаю дыхание. С другой стороны, я считаю, что сброс BIOS - это хорошая вещь в долгосрочной перспективе, поскольку сосуществование как BIOS, так и UEFI вызывает много путаницы. Johan Myréen 6 лет назад 0