![](https://img.51dongshi.com/20250108/wz/18386314252.jpg)
u盤裝系統引導失敗grup()原文轉自不點,本人有變更和刪減首先,Grub4DOS 是什么?Grub4DOS 是服務于 PC BIOS 基于平臺開源的引導管理器 GNU GRUB legacy 以 GPL2 發布授權協議。這種引導管理器的特點是什么?可用于啟動 DOS、Windows、Linux 其他操作系統也可用于啟動其他引導管理器。它可以自己經過 MBR、PBR、CDROM、PXE 啟動,也可以從 DOS、Win9x、Linux 在操作系統下啟動或被其他指導管理器啟動 fbinst、NTLDR、BOOTMGR、SYSLINUX、GNU GRUB、LILO 啟動。它具有磁盤和光盤模擬功能(基于實際模式) BIOS),可用于啟動軟盤、硬盤、光盤圖像。grub4dos 介紹核心文件grub4dos 有兩個核心文件,grldr 和 grub.exe,用于不同的場合。在 grub4dos 早期發展,只有 GRUB.EXE 沒有這個核心文件 GRLDR 文件。GRUB.EXE 起初只是 DOS 可執行文件格式由兩部分組成:頭部 主體頭是為主體的運行做準備的。“主體” 就是 GNU GRUB 的核心代碼 pre_stage2。后來,grub.exe 也可以當作 DOS 使用設備驅動格式 DEVICE=grub.exe 加載,甚至 grub.exe 也是合法的 Linux 其他許多指導工具可以加載核格式。然而,頭 主體” 整體結構沒有變化。GRLDR 也差不多,由 “頭部 主體” 構成。與 “GRUB.EXE 是為DOS 出生的情況類似,GRLDR 就是為 NTLDR 而生的。它甚至被稱為grub for ntldr”。grub4dos 所有的核心文件有如此簡單、單一的整體結構,使其易于分析和掌握。GRLDR 的頭部占用 16 風扇區,即 8K,即 8192 或者(用十六進制表示)0字節x2000 字節。GRLDR 的頭部會被 NTLDR 加載。遺憾的是,NTLDR 不能夠把 GRLDR 完全加載到內存,只能加載 8K 大大小小的頭。這就是為什么 GRLDR 頭正好是8K” 的原因。這樣,當頭部得到控制時,它就有了尋找主體的主要任務 部分在哪里,然后將主體部分加載到內存中。實際執行步驟是在每個硬盤和分區的根目錄中找到頭部的整個目錄GRLDR 文件(如果都失敗了,最后會嘗試在第一軟盤 fd0 根目錄搜索 GRLDR 找到文件) GRLDR 然后加載完整 GRLDR 文件到內存,并提交控制權。順便說一句 grldr.mbr 文件。主要用于安裝 MBR 上。它的長度是 18 個扇區(即 9K)。其任務和功能是尋找和加載 GRLDR 文件。這有點類似 GRLDR 頭部的作用。但 GRLDR 頭部是被 NTLDR 加載,而 grldr.mbr 是被 BIOS 所以,這還是有區別的。grldr.mbr 末尾的兩個扇區用于探測和適應 BIOS 磁盤幾何參數。所以,grldr.mbr 的長度是 18 個扇區,比 grldr 的頭部(16 扇區)多了兩個扇區。grldr.mbr 也能被 NTLDR 但是,NTLDR 也只能加載 grldr.mbr 的開頭的 16 扇區(8K),末尾不能加載兩個扇區。NTLDR 的升級版 —— BOOTMGR —— 但能完全加載 grldr.mbr 因為內存 BOOTMGR 可加載長達 64K 的文件。而 grldr.mbr 只有 9K,因此,它可以被接受 bootmgr 內存完全加載。從版本 0.4.5 開始,grub.exe 也能夠被 ntldr 加載(在 boot.ini 的末尾添加 c:\\grub.exe="grub.exe" 這樣的一行完全相似 grldr 的情況)。grldr 并非只能被 ntldr 其它啟動軟件也可以加載加載。例如,fbinst、syslinux 都可以加載 grldr。原則上,任何啟動軟件(改造后)都可以加載 grldr,因為加載起來很容易,只要 grldr 放在 16 可以在字節對齊的內存地址處提交控制權。另外,一切都可以加載 ntldr 還可以加載引導管理器 grldr。這是因為 ntldr 總是在固定地址加載 2000:0000 處,而如果 grldr 這里也加載,當然可以正常運行,因為 2000:0000 是一個 16 字節對齊地址。當網卡的 PXE BIOS 加載 grldr 時,它把 grldr 加載在 0000:7C00 這也是一個 16 字節對齊地址。所謂 “16 字節對齊 16 意思是整除。無論 grldr(或 grub.exe)被加載的東西(以及加載在哪里)是什么? grldr(或 grub.exe)附加步驟將自動執行,即主體部分(pre_stage2)放置在固定地址 0000:8200 處。也就是說,當主體部分即將獲得控制權時,它總是位于 0000:8200 處。前面已經解釋過了 grldr 和 grub.exe 宏觀結構都是 頭+主體。但頭和主體都有更精細的結構。GRLDR 固定占用頭部 16 扇區(8K)。但是,GRUB.EXE 頭很長,長度不固定。所以首先要確定頭部的長度。相對于 GNU GRUB legacy 頭是 grub4dos 特有的。頭部的唯一功能是將主體加載到內存中。而主體就是 GNU GRUB legacy 的核心代碼 pre_stage2。因此,當主體得到控制時,頭部就不必存在了。頭部就像三級運載火箭中的一個級別。它的目的和功能是把主體送到軌道上,然后放棄自己。當主體得到控制時,找不到頭,因為它已經從內存中消失了。grub4dos 也改造了 GNU GRUB legacy 的核心文件 pre_stage(它成了 grub4dos 主體部分)。grub4dos 在主體的開頭安排了許多核心變量,允許用戶讀取或寫入。有些變量不能寫入,一旦寫入,就會被破壞 grub4dos 工作環境。有些變量可以寫入,用戶可以通過寫入這些變量來控制 grub4dos 行為方式。內存中主體部分的位置固定,頭部加載在物理地址上 0x8200 這里可以看作是主體的固有 “軌道”。所以,很多變量都在 0x8200 之后的小區域。當然,grub4dos 內核中的許多結構屬于用戶可訪問的信息,分散在所有內存空間中。例如,0x800 處的 4K 字節是未壓縮的內置菜單;0x110000 處的 256K 內存虛擬盤的圖像通常位于內存的頂部。grub4dos 核心似乎對內存的使用有一種破碎的感覺,但它有一個發展過程,我們不希望后續工作 grub4dos 版本會給用戶帶來麻煩,所以盡量保持兼容性。兼容性要求使 grub4dos 使用內存有點奇怪。如何使用grub4dos大多數人沒有或很少接觸過linux的windows用戶剛剛開始使用grub菜單離不開時間。也就是說,使用grub以前,我們要做好準備menu.lst文件。下面是一個menu.lst的例子。(以#和//開始,表示注釋,不執行)# 默認延遲時間(秒),即啟動界面將停留30秒。timeout 30# 第一項是默認值,如果是1,則默認執行第二項菜單。default 0#設置外部命令的位置#set例如:--set-path=變量command --set-path=(bd)/BOOT/GRUB/# 設置圖形背景文件splashimage (hd0,0)/boot/grub/xp2008.gz# 設置中文支持的字體文件fontfile (hd0,0)/boot/grub/fonts# 現在基本上背景圖片和字體都集成了meassgae在文件中。因此,我們可以用一個命令代替上述兩個命令。因此,我們可以用一個命令代替上述兩個命令。命令如下:# 設置圖形背景文件和字體gfxmenu (bd)/BOOT/GRUB/MESSAGE#將指定文件作為配置文件加載執行此命令后,將重新加載內置菜單,進入二級、三級或任何菜單后可返回主菜單。該命令可以解決返回主菜單的問題。configfile (md)4 8title 使用map啟動本地硬盤上的一鍵備份還原軟盤鏡像文件map (hd0,0)/boot/grub/okdos.ima (fd0)map --hookchainloader (fd0) 1rootnoverify (fd0)title 使用memdisk啟動本地 Win98 軟盤鏡像文件kernel (hd0,0)/boot/grub/memdisk.gzinitrd (hd0,0)/boot/grub/win98.imgtitle 使用memdisk本地硬盤上啟動瑞星殺毒軟盤壓縮鏡像文件root (hd0,0)kernel /boot/grub/memdisk.gz c=80 h=12 s=36 floppyinitrd /boot/rav.ziptitle 啟動第一主分區(hd0、0)上的操作系統rootnoverify (hd0,0)makeactivechainloader1title 啟動第二主分區(hd0、1)操作系統上的操作系統rootnoverify (hd0,1)makeactivechainloader1title 啟動WinPE 2003 維護系統//加載外置SRS驅動F6IMG///輸出指定內容(即啟動菜單時顯示此行文本)echo $[1106]Loading TYPE, Please Wait ...//0x8298是擴展內存的大小,單位是KB,這里也就是192MB用上面的話MAP --MEM(將要模擬的鏡像加載到內存中,然后模擬為虛擬軟驅)加載WINPE.ISO,否則就以MAP方式加載。checkrange 0x30001:-1 read 0x8298 > nul && map --mem (ud)/BOOT/WINPE.ISO (0xff) ! run (ud)/BOOT/WINPE.ISO (0xff)//避免藍屏參數map --e820cycles=3///模擬立即生效map --hook///加載風扇鏈式加載器(虛擬軟驅)chainloader (0xff)title 啟動Win8PE精簡全能版(32位)find --set-root /BOOT/bootmgr{x}