Linux

在 /dev/sda1 分區上哪裡可以找到 VBR?

  • January 29, 2016

我有一個內置硬碟/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.lstgrub.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 文章,我在其中獲得了大部分資訊。

引用自:https://unix.stackexchange.com/questions/68796