在 /dev/sda1 分區上哪裡可以找到 VBR?
我有一個內置硬碟
/dev/sda
,如下所示:Disk /dev/sda: 160.0 GB, 160041885696 bytes 255 heads, 63 sectors/track, 19457 cylinders, total 312581808 sectors Units = sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disk identifier: 0x00042134 Device Boot Start End Blocks Id System /dev/sda1 * 2048 293048319 146523136 83 Linux /dev/sda2 293050366 312580095 9764865 5 Extended /dev/sda5 293050368 312580095 9764864 82 Linux swap / Solaris
現在我可以很容易地找到帶有 的 MBR
xxd /dev/sda | less
,它位於第一個扇區。根據維基百科,在我的情況下,VBR 必須位於第一個可引導分區內的第一個扇區中/dev/sda1
。但是在第一個扇區中,/dev/sda1
當我執行xxd /dev/sda1 | less
.我實際上想在那裡找到 GRUB 的二進制程式碼,那它會在哪裡呢?
它通常不安裝在那裡。大多數時候,GRUB(第 1 階段)僅安裝在 Linux 上的 MBR中。
儘管 GRUB 版本 1 總是會在 MBR(階段 1.5,即文件系統驅動程序)之後的 30 kB 中稍微溢出,但對於 GRUB 版本 2,安裝在 MBR 中的程式碼可以通過原始讀取載入一些其他更大的程式碼(階段 1.5)磁碟上的任何扇區(但通常會堅持 GRUB 1 行為——即從 MBR 之後的 30 kB 載入程式碼)。
這 30 kB 通常是可用的非分區“空閒”磁碟空間,因為由於歷史原因,磁碟的第一個分區在扇區 63 之前啟動是非常罕見的,在 MBR 之後至少留下 512*62 = 31 kiB。
然後,它載入一些文件,通常來自
/boot
,如菜單(menu.lst
或grub.cfg
)、更多文件系統驅動程序等。這是第 2 階段。之後,就足夠啟動一個作業系統了。
至於現在的VBR,由於不夠可靠,在Linux分區上不常用,但是MS Windows一般會在系統(C:\)分區的開頭安裝一個。如果你想啟動 Windows,GRUB 只會執行它。這個過程稱為鍊式載入:啟動另一個引導載入程序。這也意味著在那裡使用的文件系統必須保持其分區的開頭不變,否則它可能會覆蓋 VBR!可用的“未觸及”空間量取決於文件系統,因此沒有很好的保證:它很可能非常小……
關於從“不尋常”的地方載入階段 1.5,正如我所說,GRUB 2 可以從磁碟上的任何扇區載入其階段 1.5。它可能來自一個文件,但這可能很危險,因為文件系統可以隨時決定將該文件移動到磁碟上的其他扇區(或者更糟糕的是,將其分段!),並且 GRUB 需要更新MBR 每次…
一個有趣的案例是GUID 分區表(GPT)。它們太大,無法確保為 1.5 階段始終提供足夠的空間 (30 kB)。在這種情況下,推薦的解決方案是使用專用的“引導載入程序分區”(這不是問題,因為 GPT 可以支持 128 個分區),它不會託管文件系統,而是 GRUB 的 1.5 階段數據。這樣一來,它就不會動了,你可以給它足夠的空間。
你真的應該閱讀維基百科的 GRUB 文章,我在其中獲得了大部分資訊。