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 相同的行為時,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'

看看一些來源, 我思考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.binGrub是否有類似的檔案類型?是嗎boot.img? Grub 會修改其中一些位元組嗎? Grub 是否即時產生這些不同的位元組? Grub 產生的那些位元組是否特定於每個系統,並且每次 Grub 寫入它們時都是唯一的?

答案1

是的,boot.img寫入 MBR 的前 440 位元組。boot.img包含一個“BIOS 參數區塊”,其中包含取決於其安裝的系統的資料。安裝 Grub 時,此資料將寫入 BPM。這裡是原始碼。

順便說一句,我不會在 GRUB 上花太多時間。幾年後這段程式碼可能無法在新電腦上運作。英特爾計劃在 2020 年淘汰傳統 BIOS 模式。

相關內容