Windows

在哪裡可以了解有關如何使用 GRUB ntldr 命令(模組?)的更多資訊

  • February 9, 2022

我最近偶然發現了 GRUBntldr模組。

顯然,它可以用來替代chainloader啟動 NT >= 6.0 版本的 Windows,如下例所示。(如果 Windows 分區的捲引導記錄損壞了,這將非常方便。)

menuentry "Windows 7 (bootmgr on /dev/sda1)" --class windows --class os {
   insmod part_msdos
   insmod ntfs
   insmod ntldr
   set root='(hd0,msdos1)'
   search --no-floppy --fs-uuid --set=root 1EA0019AA0017A13
   ntldr ($root)/bootmgr
}

我在哪裡可以了解有關如何使用此引導指令的更多資訊?當我查看GNU GRUB 手冊的HTML 版本時,我沒有看到它列出來。


回复ckhan的回答

非常感謝!我幾乎決定我必須嘗試探勘原始碼以了解有關 GRUBntldr命令/模組的更多資訊。但是你做得比我做得好得多。

我從來沒有想過查看電子郵件檔案以了解編寫程式碼的人可能進行了哪些設計討論。這種方法聽起來將來可能會很有幫助。謝謝你提到它。

我對 GRUBntldr支持的看法

  1. 雖然我不確定區別有多大,但ntldr它是一個模組,而不是一個命令。或者,如果您願意,也可以是動態載入的命令。

按照您的原始碼連結並查看第 152 ( GRUB_MOD_INIT) 和 159 ( GRUB_MOD_FINI) 行,您可以看到要載入的程式碼……我猜……解除安裝模組。

GRUB 顯然實現了許多您可能認為是“命令”的功能作為模組。我知道的唯一區別是,在使用模組之前,必須確保它已使用 command 載入insmod ntldr

*旁白:*我一直想知道為什麼 GRUB 不支持reboot. 事實證明該命令存在,但它是一個模組。如果reboot返回unknown command,則insmod reboot允許 GRUB “記住”該reboot命令。

旁白: GRUB 何時以及為什麼會“解除安裝”一個模組,我還不知道。也許這是類似於“垃圾收集”的結果??我注意到一旦載入模組似乎仍然存在,即使在系統關閉並重新啟動之後也是如此。當然,你不能依賴它,但這似乎是它在實踐中經常起作用的方式。 2. 有趣的是,它們ntldr基於chainloader. 我沒有看過chainloader.c程式碼。我猜它可能還會在英特爾 16 位模式下進行重定位負載?

高興他們沒有ntldrchainloader. 我同意弗拉基米爾的觀點。無論幕後有什麼相似之處,使用語法都是非常不同的。目前的方法不那麼笨拙。 3. 看到將這個命令添加到 GRUB 顯然缺乏熱情也很有趣。顯然,GRUB 開發人員認為損壞 Windows*分區引導記錄 (PBR)*的可能性極小。但是,我可以在足夠普通的安裝過程中勾勒出如何做到這一點。

首先假設使用者在他們的系統上安裝了 Windows。他們現在將 Ubuntu (12.04 LTS)Windows 一起安裝。在 Ubuntu 安裝過程中,他們顯然可以決定將 GRUB 安裝在哪裡。由於我無法猜測的原因,他們中的一些人決定將 GRUB 安裝到安裝 Windows 的分區中。

安裝完成,他們可以成功啟動 Ubuntu。但是,當他們嘗試通過選擇 GRUB 菜單中的條目來啟動 Windows 時,Windows 不會啟動。而是嘗試使用 GRUB 啟動 Windows 只是重新顯示 GRUB 菜單?

為什麼?好吧,顯然當他們選擇將 GRUB 安裝到 Windows 分區時,實際發生的部分是 Windows 分區的 PBR 被 GRUB 的 PBR 覆蓋。所以chainloader +1不會連結載入 Windows 引導載入程序,而是重新載入 GRUB。

IMO,允許使用者在這種情況下啟動 Windows 的最安全快捷方式是使用 GRUB 的新ntldr. 我想知道這是否會引起開發人員的興趣。我預計他們沒有預料到這種情況。

我想知道除了 Windows 之外的引導載入程序,ntldr以及bootmgrGRUBntldr命令可能能夠載入?

研究未記錄的功能

你是對的ntldr命令(它是命令,而不是模組)沒有記錄。所以這是程式碼考古學冒險的一個很好的藉口 。

每當我發現一個未記錄的功能時,首先要做的是檢查來源。

  • Savannah git repo的來源 顯示它在 2010 年 8 月被合併到主線中。
  • 源分支似乎已不復存在,但您仍然可以看到它在那年初的 2010 年 4 月出現。來自“Vladimir ‘phcoder’ Serbinenko”的簽入評論是
ntldr support. (based on information from nyu but no code from him)

它非常緊密地基於chainloader命令,以至於標題註釋中的文件名仍未更新。

現在我們有了準確的簽入和名稱,我們可以檢查郵件檔案。您可以在grub-devel 郵件列表中看到開發人員在一年前討論添加此功能的位置 :

該執行緒的一些相關摘錄:

Robert Millan這個更新檔實現了 NTLDR 引導語義的載入器(在 BootMGR 中是相同的,因此兩者都支持)

Robert Millan如果我們想要這個功能,我認為它應該是 chainloader 中的一個選項,而不是一個獨立的命令。它實際上與鍊式載入器幾乎相同,唯一的區別是 ntldr 在 PBR 之後由 GRUB 載入,而不是由 PBR 本身載入。

Vladimir Serbinenko我認為這沒有任何問題,因為 ntldr 僅將此 PBR 用作超級塊來辨識分區。因此,我寧願將此載入視為傳遞 $root 的特殊情況,只是它的形式有點奇怪

Yves Blusseau關於命令,我認為如果我們只有一個命令對使用者來說會更簡單:chainloader(就像在 grub4dos 中一樣),它將嘗試檢測引導載入程序的類型。這只是我個人的看法。

Vladimir Serbinenko我不同意這一點。chainloader 和 ntldr 不共享相同的語法:chainloader 需要一個引導扇區,而 ntldr 需要一個 ntldr ot bootmgr 文件。GRUB2 旨在打破 GRUB1 的錯誤設計決策,其中之一是“核心”命令。GRUB4DOS 在這個主題上遵循 GRUB1。

羅伯特米蘭好吧。讓我們讓它成為一個單獨的命令。我認為它仍然應該與 chainloader.c 共享程式碼(使用一些 ifdefs)。

回答你的問題

在仔細研究了所有這些之後,我們對如何使用它了解多少?

  • 它基於鍊式裝載機。
  • 它需要一個參數:要打開的文件。
  • 它避免了分區引導記錄:因此它可以繞過那裡的損壞。請參閱這篇文章,詳細說明他們是如何測試的。
  • 只有大約 160 行程式碼,你可以看到那裡沒有太多其他的東西。

希望這很有用!

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