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.bin
Grub是否有類似的檔案類型?是嗎boot.img
? Grub 會修改其中一些位元組嗎? Grub 是否即時產生這些不同的位元組? Grub 產生的那些位元組是否特定於每個系統,並且每次 Grub 寫入它們時都是唯一的?
答案1
是的,boot.img
寫入 MBR 的前 440 位元組。boot.img
包含一個“BIOS 參數區塊”,其中包含取決於其安裝的系統的資料。安裝 Grub 時,此資料將寫入 BPM。這裡是原始碼。
順便說一句,我不會在 GRUB 上花太多時間。幾年後這段程式碼可能無法在新電腦上運作。英特爾計劃在 2020 年淘汰傳統 BIOS 模式。