本帖最后由 stevenldj 于 2013-12-29 12:22 編輯 一樓、學(xué)習(xí)筆記: [注:以后如果內(nèi)容有改動(dòng),會(huì)用彩色文本標(biāo)注,以便查閱,如果是改錯(cuò)字或改筆誤,則仍使用黑色文本] ============================== 學(xué)習(xí) Grub4Dos(最好在虛擬機(jī)中進(jìn)行練習(xí),以免損壞電腦中的系統(tǒng)和文件) ============================== 下載 Grub4Dos: http://code.google.com/p/grub4dos-chenall/downloads/list ============================== 版本 0.4.5c 和 0.4.6a 的區(qū)別: 0.4.5c 是穩(wěn)定版。0.4.6a 處于 alpha 測(cè)試階段。但是,這個(gè)系列有新功能,比如,支持微軟的 exFAT 文件系統(tǒng)。0.4.6 最大的改動(dòng)是啟動(dòng)代碼,比如,grldr.mbr,bootlace.com 之類的。 差別主要在啟動(dòng)代碼,即自舉 grldr 。 0.4.6a 可以從 exFAT 文件系統(tǒng)啟動(dòng)(原內(nèi)核已支持exFAT 文件系統(tǒng)); 0.4.6a 可以從 ext4 文件系統(tǒng)啟動(dòng); 0.4.6a 可以在啟動(dòng)之初(加載 grldr 之前)加載 usb2.0 驅(qū)動(dòng),使被 BIOS 識(shí)別為軟盤(pán)的 u 盤(pán)支持 LBA 讀寫(xiě); 0.4.6a 可以支持 udf 格式的光盤(pán),可以支持 iso9600 擴(kuò)展的 Joliet 格式,并啟動(dòng)之(修改了內(nèi)核,正在優(yōu)化中,近期發(fā)布)。 因?yàn)?Grub4Dos 還在不斷的完善,所以上面的信息也不一定完全準(zhǔn)確。 要穩(wěn)定就用 0.4.5c,要支持更多的磁盤(pán)格式就用 0.4.6a。 ============================== 進(jìn)入 Grub4Dos 的方法: 1、將下載的 grub4dos 壓縮包解壓 2、創(chuàng)建執(zhí)行環(huán)境: 方法一:用 FbinstTool 創(chuàng)建一個(gè) fba 文件,然后將解壓后的文件拖拽到 fba 的根目錄中,啟動(dòng) Qemu 虛擬機(jī),進(jìn)入 Grub4Dos 環(huán)境(你要會(huì)用 FbinstTool)。 方法二:在純 DOS 下運(yùn)行解壓后的 grub.exe,進(jìn)入 Grub4Dos 環(huán)境(你要會(huì)用純 DOS)。 方法三:將解壓后的文件復(fù)制到 C 盤(pán)根目錄,然后在 ntldr 的配置文件 boot.ini 中添加 C:\grldr="進(jìn)入 GRUB4DOS",重啟系統(tǒng),選擇 "進(jìn)入 GRUB4DOS" 菜單項(xiàng),進(jìn)入 Grub4Dos 環(huán)境(你要有 ntldr 引導(dǎo)的分區(qū),或者 WinXP 系統(tǒng))。 方法四:將解壓后的文件復(fù)制到 U 盤(pán)或硬盤(pán)任意分區(qū)的根目錄中,然后用 BootICE 修改 U 盤(pán)或硬盤(pán)的主引導(dǎo)記錄為 Grub4Dos,從 U 盤(pán)或硬盤(pán)啟動(dòng),進(jìn)入 Grub4Dos 環(huán)境(你要會(huì)用 BootICE)。 方法五:其它 ... ============================== 學(xué)習(xí)方法(一共83個(gè)命令): 在啟動(dòng) Grub4Dos 的過(guò)程中不停的按 c 鍵,進(jìn)入 Grub4Dos 的命令行模式,通過(guò)手動(dòng)輸入命令來(lái)學(xué)習(xí) Grub4Dos。 學(xué)習(xí)過(guò)程中參考 Grub4Dos 0.4.5c 的幫助文檔: http://bbs./forum.php?m ... &extra=page%3D1 Grub4Dos 命令要區(qū)分大小寫(xiě),路徑不區(qū)分大小寫(xiě)。 Tab 鍵可以實(shí)現(xiàn)命令或文件名補(bǔ)全 在終端中一條一條的輸入下面的命令進(jìn)行學(xué)習(xí) ========================================================================================== 先學(xué)習(xí)這些命令(16個(gè)): ls、find、root、rootnoverify、map、cdrom、cat、cmp、dd、write、read、calc、checktime、echo、pager、clear ============================== ls 類似 Linux 中的 ls 命令,類似 Dos 下的 dir 命令,列出當(dāng)前目錄(工作目錄)下的文件和目錄 ls /boot 列出當(dāng)前目錄(工作目錄)下名稱以 boot 開(kāi)頭的文件和目錄,不要用 ls boot,它只在根目錄下有效。 ls /boot/ 列出當(dāng)前目錄下 boot 目錄中的文件和目錄,不要用 ls boot/,它只在根目錄下有效。 ls (hd0,0)/ 列出 (hd0,0) 中的文件和目錄,不要用 ls (hd0,0),它只在 (hd0,0) 為當(dāng)前磁盤(pán)時(shí)有效。 ls dev 列出所有驅(qū)動(dòng)器列表(驅(qū)動(dòng)器不包括分區(qū)) ls /boot/ > nul && echo exist 判斷目錄 /boot/ 是否存在,如果存在,則輸出 exist(這個(gè)方法對(duì)空目錄無(wú)效) ls /boot > nul && echo exist ! echo not exist 判斷當(dāng)前目錄(工作目錄)中是否存在文件名以 boot 開(kāi)頭的文件或目錄,如果存在,則輸出 exist,否則輸出 not exist ls (hd0,0)/boot/ > nul && echo exist ! echo not exist 判斷目錄 (hd0,0)/boot/ 是否存在,如果存在,則輸出 exist,否則輸出 not exist [注意:若文件夾下無(wú)任何文件,對(duì) ls 命令而言,認(rèn)為該文件夾不存在。] [注意:由于 (ud) 中不存在目錄,所謂的目錄只是帶 / 的文件名所產(chǎn)生的假象,所以 ls (ud)/ 時(shí),會(huì)列出 (ud) 中的所有文件,但是 ls (ud)/boot/ 卻可以列出 /boot/ 下的所有文件,因?yàn)檫@些文件的文件名都是以 /boot/ 開(kāi)頭] ============================== debug on find 列出所有磁盤(pán)(磁盤(pán)包括分區(qū))(debug off 靜默模式下無(wú)法顯示磁盤(pán)列表) debug on find +1 列出文件系統(tǒng)已知的所有磁盤(pán)(debug off 靜默模式下無(wú)法顯示磁盤(pán)列表) debug on find checkrange 0x07 parttype 列出分區(qū)類型為 0x07(NTFS)的所有分區(qū)(debug off 靜默模式下無(wú)法顯示磁盤(pán)列表) find /ntldr checkrange 0x07 parttype 在分區(qū)類型為 0x07(NTFS)的分區(qū)中查找 /ntldr 文件,并列出找到的分區(qū)。 find --set-root /ntldr 查找包含 /ntldr 文件的設(shè)備,把第一個(gè)找到的設(shè)備設(shè)為當(dāng)前設(shè)備。 find --set-root --ignore-floppies --ignore-cd /ntldr 查找包含 /ntldr 文件的設(shè)備,把第一個(gè)找到的設(shè)備設(shè)為當(dāng)前設(shè)備。忽略軟盤(pán)和光盤(pán)。 find --set-root --devices=upnhcf /ntldr 查找包含 /ntldr 文件的設(shè)備,把第一個(gè)找到的設(shè)備設(shè)為當(dāng)前設(shè)備。指定查找順序:ud,pxe,網(wǎng)絡(luò)設(shè)備,硬盤(pán),光盤(pán),軟盤(pán) find --set-root --devices=upnh /ntldr 查找包含 /ntldr 文件的設(shè)備,把第一個(gè)找到的設(shè)備設(shè)為當(dāng)前設(shè)備。指定查找順序,并忽略軟盤(pán)和光盤(pán)。 find --set-root ls /grub/ 查找包含 /grub/ 目錄的設(shè)備,把第一個(gè)找到的設(shè)備設(shè)為當(dāng)前設(shè)備。/grub/ 目錄不能為空,否則會(huì)忽略該目錄。 debug on find --set-root makeactive --status 查找活動(dòng)主分區(qū),把第一個(gè)找到的設(shè)備設(shè)為當(dāng)前設(shè)備。(debug off 靜默模式下無(wú)法顯示磁盤(pán)列表) find --set-root=/boot/grub /boot/grub/menu.lst 查找包含 /boot/grub/menu.lst 的設(shè)備,把第一個(gè)找到的設(shè)備設(shè)為當(dāng)前設(shè)備,并將工作目錄設(shè)置為 /boot/grub [注意:查找的時(shí)候會(huì)優(yōu)先查找當(dāng)前設(shè)備(如果在列表中的話),不再查找 (hdx) 設(shè)備,仍會(huì)查找 (hdx,y) 設(shè)備] [題外話:如果 find 支持 find /FILE 和 find /DIR/ 就好了,這樣可以實(shí)現(xiàn)更精確的查找。] ============================== root 顯示當(dāng)前設(shè)備名稱及其相關(guān)信息。 root (hd0,0) 將 (hd0,0) 作為當(dāng)前磁盤(pán),工作目錄為 /,效果和 root (hd0,0)/ 一樣。 root (hd-1,0) 將 (hd-1,0) 作為當(dāng)前磁盤(pán),工作目錄為 /,效果和 root (hd-1,0)/ 一樣 root (hd0,0)/boot 將 (hd0,0) 作為當(dāng)前磁盤(pán),工作目錄為 /BOOT,效果和 root (hd0,0)/boot/ 一樣。 root ()/boot 修改工作目錄為當(dāng)前磁盤(pán)下的 /BOOT 目錄,效果和 root ()/boot/ 一樣。 root (hd0,0) > nul && echo ok ! echo fail root (hd0,0) > nul || echo fail ! echo ok 將 (hd0,0) 設(shè)置為當(dāng)前設(shè)備,如果成功,則輸出 ok,如果不成功,則輸出 fail。(上面兩條命令效果相同) ============================== rootnoverify (hd0,0) 相當(dāng)于 root (hd0,0),但不測(cè)試安裝該分區(qū)。這用于有些系統(tǒng)裝在 GRUB 能訪問(wèn)的磁盤(pán)區(qū)之外, 但仍需要設(shè)置正確的根分區(qū)的情況。有些需要安裝分區(qū)才能確定的參數(shù)可能會(huì)有問(wèn)題。 下面的命令可以正確執(zhí)行,但是換成 root 就不行了: rootnoverify (hd0) chainloader +1 boot [題外話:這個(gè)命令如果改成 root --nv (hd0) 或許更簡(jiǎn)單一些,輸入字符也少一些] ============================== 設(shè)備類型: (fd0) 第一個(gè)軟盤(pán) (fd1) 第二個(gè)軟盤(pán) (hd0) 第一個(gè)硬盤(pán) (hd1) 第二個(gè)硬盤(pán) (hd-1) 最后一個(gè)硬盤(pán) (hd) 最后一個(gè)硬盤(pán)之后的硬盤(pán)號(hào)碼,創(chuàng)建新的虛擬硬盤(pán)時(shí)使用 (cd0) 第一個(gè)光驅(qū),相當(dāng)于 (hd32),由 cdrom --init 創(chuàng)建 (cd1) 第二個(gè)光驅(qū),相當(dāng)于 (hd33),由 cdrom --init 創(chuàng)建 由于 cdrom 的識(shí)別能力太低,同時(shí)市場(chǎng)上的光驅(qū)設(shè)備幾乎全被U盤(pán)代替,所以 (cd?) 這種格式可能面臨淘汰。 (hd0,0) 第一塊硬盤(pán)的第一主分區(qū) (hd0,4) 第一塊硬盤(pán)的第一擴(kuò)展分區(qū) (hd-1,0) 最后一塊硬盤(pán)的第一主分區(qū),沒(méi)有 (hd-2,0) 這種格式,也沒(méi)有 (hd-1,-1) 這種格式。 (hd#,0) 第一主分區(qū)(在硬盤(pán)#上) (hd#,1) 第二主分區(qū)(在硬盤(pán)#上) (hd#,2) 第三主分區(qū)(在硬盤(pán)#上) (hd#,3) 第四主分區(qū)(在硬盤(pán)#上) (hd#,4) 第一邏輯分區(qū)(在硬盤(pán)#上) (hd#,5) 第二邏輯分區(qū)(在硬盤(pán)#上) (hd#,6) 第三邏輯分區(qū)(在硬盤(pán)#上) (hd#,7) 第四邏輯分區(qū)(在硬盤(pán)#上) (hd32) 第一個(gè)光驅(qū) (hd33) 第二個(gè)光驅(qū) (0xFF) 最后一個(gè)光驅(qū)(hd127) () 當(dāng)前磁盤(pán) (bd) 初始啟動(dòng)設(shè)備(設(shè)備包括磁盤(pán)和驅(qū)動(dòng)器) (cd) 從光盤(pán)啟動(dòng)后,Grub4Dos 捕獲到的啟動(dòng)光盤(pán),如果不是從光盤(pán)啟動(dòng),則沒(méi)有 (cd) 設(shè)備 (ud) Fbinst 啟動(dòng)方式制作的隱藏分區(qū) (pd) PXE 網(wǎng)絡(luò)啟動(dòng)設(shè)備 (nd) 網(wǎng)絡(luò)驅(qū)動(dòng)器,現(xiàn)已不常用(nd 已經(jīng)不存在了,已經(jīng)被pd代替) (md) 內(nèi)存驅(qū)動(dòng)器,實(shí)現(xiàn)了將整個(gè)內(nèi)存作為一個(gè)磁盤(pán)驅(qū)動(dòng)器來(lái)訪問(wèn) (rd) 隨機(jī)存貯驅(qū)動(dòng)器。(md) 設(shè)備訪問(wèn)內(nèi)存是從物理地址 0 開(kāi)始,而 (rd) 可以訪問(wèn)起始于任何基地址的內(nèi)存 以數(shù)字命名的設(shè)備: fd0 - fd126 : 0x0 - 0x7E (軟盤(pán)和虛擬軟盤(pán),排除 0x21 和 0x23) pxe : 0x21 (網(wǎng)絡(luò)啟動(dòng)設(shè)備) ud : 0x23 (Fbinst 隱藏分區(qū)) rd : 0x7F (隨機(jī)存貯驅(qū)動(dòng)器) hd0 - hd30 : 0x80 - 0x9E (硬盤(pán)和虛擬硬盤(pán)) cd : 0x9F (捕獲到的啟動(dòng)光盤(pán),這個(gè)不一定正確,視 bios 而定) hd32 - hd127 : 0xA0 - 0xFF (光盤(pán)和虛擬光盤(pán)) 設(shè)備后面跟隨 +1 表示將設(shè)備的第 1 個(gè)扇區(qū)當(dāng)作一個(gè)單一的文件看待: (hd0)+1 將整個(gè)硬盤(pán)的第一個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 1 個(gè)扇區(qū)) (hd0,0)+1 將整個(gè)分區(qū)的第一個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 1 個(gè)扇區(qū)) (fd0)+1 將整個(gè)軟盤(pán)的第一個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 1 個(gè)扇區(qū)) (cd0)+1 將整個(gè)光盤(pán)的第一個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 1 個(gè)扇區(qū)) (md)+1 將整個(gè)內(nèi)存的第一個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 1 個(gè)扇區(qū)) (rd)+1 這個(gè)比較特殊,將指定內(nèi)存的所有內(nèi)容當(dāng)作一個(gè)文件 [注意:(rd)+1 這個(gè)標(biāo)志始終代表文件,它包含存儲(chǔ)在 (rd) 中的所有字節(jié)。 ] 同樣可以使用 +2、+3 等,表示將前 2 個(gè)或前 3 個(gè)扇區(qū)當(dāng)作單一的文件看待: (hd0)+2 將整個(gè)硬盤(pán)的前 2 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 2 個(gè)扇區(qū)) (hd0,0)+3 將整個(gè)分區(qū)的前 3 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 3 個(gè)扇區(qū)) (fd0)+5 將整個(gè)軟盤(pán)的前 5 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 5 個(gè)扇區(qū)) (cd0)+10 將整個(gè)光盤(pán)的前 10 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 10 個(gè)扇區(qū)) (md)+32 將整個(gè)內(nèi)存的前 32 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 32 個(gè)扇區(qū)) (rd)+2 將指定內(nèi)存的前 2 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 2 個(gè)扇區(qū)) 也可以使用類似 32+5 的方法: (hd0)512+2 將整個(gè)硬盤(pán)的第 512 個(gè)扇區(qū)之后的 2 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 2 個(gè)扇區(qū)) (hd0,0)32+3 將整個(gè)分區(qū)的第 32 個(gè)扇區(qū)之后的 3 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 3 個(gè)扇區(qū)) (fd0)1+1 將整個(gè)軟盤(pán)的第 2 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 1 個(gè)扇區(qū)) (cd0)128+1 將整個(gè)光盤(pán)的第 129 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 1 個(gè)扇區(qū)) (md)0+32 將整個(gè)內(nèi)存的前 32 個(gè)扇區(qū)當(dāng)作一個(gè)文件(共 32 個(gè)扇區(qū)) (rd)0+1 等效于 (rd)+1,將指定內(nèi)存的所有內(nèi)容當(dāng)作一個(gè)文件 關(guān)于 (rd) 設(shè)備: (rd) 設(shè)備只是對(duì)內(nèi)存區(qū)域的引用,(rd) 設(shè)備所引用的內(nèi)存區(qū)域是不被保護(hù)的,你可以將 (rd) 理解為指向內(nèi)存塊的指針。在 Grub4Dos 中,很多東西都是自由的、無(wú)保護(hù)的、沒(méi)有限制的,(rd) 就是其中之一。 (rd) 不是一個(gè) int13 設(shè)備,而僅僅是一個(gè) grub4dos 設(shè)備。在 grub4dos 里面,存在 (rd) 設(shè)備,但進(jìn)入 DOS 以后,就沒(méi)有 (rd) 設(shè)備了。 (rd)+1 始終表示 (rd) 設(shè)備的整個(gè)內(nèi)容,而不是第一個(gè)扇區(qū)。 通過(guò)下面的地址可以獲取 (rd) 設(shè)備的信息: set /a rdnum=*0x82CC # (rd) 設(shè)備的設(shè)備號(hào) set /a rdbase=*0x82D0 # (rd) 設(shè)備的起始地址 set /a rdsize=*0x82D8 # (rd) 設(shè)備的總長(zhǎng)度 通過(guò)下面的方法可以自由設(shè)置 (rd) 設(shè)備的信息: map --ram-drive=0xFF7F # 修改 (rd) 設(shè)備的設(shè)備號(hào) map --mem --rd-base=50000 # 設(shè)置 (rd) 設(shè)備的起始地址 map --mem --rd-size=30000 # 設(shè)置 (rd) 設(shè)備的總長(zhǎng)度 下面的命令僅僅修改了 (rd) 設(shè)備的信息: map --mem /FILE (rd) 這里的 (rd) 指向了一塊內(nèi)存區(qū)域,這塊內(nèi)存區(qū)域中存放了 /FILE 文件的內(nèi)容,但是這塊內(nèi)存是不被保護(hù)的,這塊內(nèi)存隨時(shí)都可能被其他代碼修改,甚至被 Grub4Dos 自身修改。 下面的命令也修改了 (rd) 設(shè)備的信息,但是 (rd) 指向的內(nèi)存區(qū)域是受保護(hù)的,因?yàn)樗?(fd0) 重疊,而 (fd0) 是受保護(hù)的: map --mem /FILE (rd) map --mem /FILE (fd0) map --hook 如果第一條命令和第二條命令交換一下順序,那么結(jié)果就不一樣了。 什么情況下需要使用 (rd) 設(shè)備?當(dāng)你需要它的時(shí)候就去用它,如果你實(shí)在不知道什么時(shí)候需要用到 (rd),那么很簡(jiǎn)單,不要用它。 ============================== map --status 顯示磁盤(pán)仿真的狀態(tài)。 map /PE.ISO (0xFF) map --hook 將 /PE.ISO 映射到 (hd127) 仿真磁盤(pán),/PE.ISO 必須在磁盤(pán)中連續(xù)存放,不能有碎片。 map --mem /PE.ISO (0xFF) map --hook 先將 /PE.ISO 加載到內(nèi)存,然后再映射到 (hd127) 仿真磁盤(pán),/PE.ISO 可以有碎片。 map --mem=-2880 /FLOPPY.IMG (fd0) map --hook 先將 /FLOPPY.IMG 加載到內(nèi)存,然后再映射到 (fd0) 仿真軟盤(pán),(fd0) 將占用至少 1440KB 的內(nèi)存。 map --mem --top /PE.ISO (0xFF) map --hook 將 /PE.ISO 加載到高端內(nèi)存,然后再映射到 (hd127) 仿真磁盤(pán),把鏡像加載到高位內(nèi)存就不能使用 gzip 壓縮,兩者不能同時(shí)實(shí)現(xiàn)。 在 grub4dos 中,內(nèi)存在 3.25G 處被分成了高端內(nèi)存和低端內(nèi)存兩端,鏡像不能跨 3.25G 這個(gè)點(diǎn)。如果你的內(nèi)存小于 3.25G,你就沒(méi)有高端內(nèi)存可用。 map --unmap=0xFF map --rehook 卸載 (hd127) 仿真磁盤(pán)。不能使用 --unmap=(0xFF) 的方法卸載,--unmap= 后面必須是數(shù)字。 --rehook 用于停止仿真盤(pán)并釋放內(nèi)存,相當(dāng)于 --unhook 然后 --hook(這樣看來(lái),map --unhook 命令似乎不會(huì)被單獨(dú)使用了) map --unmap=0,0x80,0xFF map --rehook 卸載多個(gè)仿真磁盤(pán)。 map --unmap=0:0xFF map --rehook 卸載所有仿真磁盤(pán)。 如果要通過(guò)設(shè)備名的方法卸載某個(gè)設(shè)備,可以這樣做: map (hd127) (hd127) map --rehook map --read-only /FLOPPY.IMG (fd0) map --hook (fd0) 只能讀,不能寫(xiě),防止 /FLOPPY.IMG 文件被破壞。 映射到仿真盤(pán)中的文件都是可以修改的,無(wú)論是 IMG、ISO、VHD 等,除非使用 --read-only 參數(shù)。 map --fake-write /FLOPPY.IMG (fd0) map --hook (fd0) 處于假寫(xiě)狀態(tài),可以寫(xiě)入數(shù)據(jù),但并未記錄到 (fd0) 上,防止 /FLOPPY.IMG 文件被破壞。 map --unsafe-boot /FLOPPY.IMG (fd0) map --hook 這個(gè)參數(shù)不知道是什么作用,大概是允許修改 (fd0) 的引導(dǎo)扇區(qū)。 map ---disable-chs-mode /FLOPPY.IMG (fd0) map --hook 禁用 (fd0) 的 CHS 訪問(wèn)功能。 map --disable-lba-mode /FLOPPY.IMG (fd0) map --hook 禁用 (fd0) 的 LBA 訪問(wèn)功能。 map 命令還可以用來(lái)修改 (rd) 隨機(jī)存儲(chǔ)器的信息,上面已經(jīng)說(shuō)過(guò)了。 [注:其他 map 參數(shù)似乎不怎么常用,也不太理解其含義,這里就不總結(jié)了] [注意:在map命令行中,(hdm,n)+1 式的寫(xiě)法被解釋成代表整個(gè)(hdm,n)分區(qū),而不僅僅是此分區(qū)的第一扇區(qū)。] [注意:--unhook 的仿真盤(pán),如果沒(méi)有 --unmap,則在需要的時(shí)候會(huì)自動(dòng) --hook。] ============================== 關(guān)于 map 命令的磁盤(pán)交換: # 打算把當(dāng)前設(shè)備映射為(hd0) map () (hd0) # 打算把(hd0)映射為當(dāng)前設(shè)備 map (hd0) () #開(kāi)始執(zhí)行映射 map --rehook ============================== cdrom --init map --hook 掛載 ATAPI 接口的光驅(qū)(map --hook 后才能訪問(wèn)) cdrom --stop map --rehook 卸載 ATAPI 接口的光驅(qū) ============================== cat /menu.lst 顯示 /menu.lst 的內(nèi)容 cat --hex /grldr 以十六進(jìn)制顯示 /grldr 的內(nèi)容 cat --skip=1024 /menu.lst 顯示 /menu.lst 的內(nèi)容,跳過(guò)前面 1KB 的內(nèi)容 cat --length=10 /menu.lst 顯示 /menu.lst 的內(nèi)容,只顯示前面 10 個(gè)字節(jié)的內(nèi)容 cat --locate="\x20 " /menu.lst 在 /menu.lst 中查找連續(xù)的兩個(gè)空格(轉(zhuǎn)義字符 + 非轉(zhuǎn)義字符)(區(qū)分大小寫(xiě)) cat --locate=abc /menu.lst 在 /menu.lst 中查找 abc 字符串(非轉(zhuǎn)義字符)(區(qū)分大小寫(xiě)) cat --locatei=abc /menu.lst 在 /menu.lst 中查找 abc 字符串(不區(qū)分大小寫(xiě)) cat --locate=abc --number=3 /menu.lst 在 /menu.lst 中查找 abc 字符串,只顯示前 3 個(gè)找到的結(jié)果 cat --locate=abc --replace=def /menu.lst 在 /menu.lst 中查找 abc 字符串,并替換為 def cat --locate=abc --replace=def --number=3 /menu.lst 在 /menu.lst 中查找 abc 字符串,并替換為 def,只替換前 3 個(gè)找到的結(jié)果 cat --locate=abc --replace=def --locate-align=16 /menu.lst 在 /menu.lst 中查找 abc 字符串,并替換為 def,只替換位置與 16 對(duì)齊的結(jié)果 通過(guò)下面的命令來(lái)查看 --locate-align=16 的效果: echo -n > /menu.lst cat --locate=\x0 --replace=1 /menu.lst cat /menu.lst cat --locate=1 --replace=0 --locate-align=16 /menu.lst cat /menu.lst cat --length=0 ()-1 固定用法,獲取當(dāng)前分區(qū)地址偏移 cat --length=0 ()/menu.lst 獲取 /menu.lst 的文件大小 cat --length=0 ()/menu.lst > nul && echo exist ! echo not exist 判斷文件 /menu.lst 是否存在,如果存在,則輸出 exist,否則輸出 not exist 轉(zhuǎn)義字符總結(jié): \??? 1到3位八進(jìn)制代碼表示的字符(\377)八進(jìn)制最大取值 \377,超出 377 的代碼將與 377 取模后再進(jìn)行轉(zhuǎn)換,比如 \400 表示 \0 \x?? 1到2位十六進(jìn)制代碼表示的字符(\xFF)最大取值 \xFF \空格 空格字符 \\ \ 字符(反斜線) \" " 字符(雙引號(hào)) \' ' 字符(單引號(hào)) \a 警報(bào) (聲音) \b 退格符 \f 換頁(yè)符 \n 換行符 \r 回車符 \t 水平制表符 \v 垂直制表符 [注意:執(zhí)行 cat --locate= 或 cat --locatei= 后,可以用 %?% 獲取最后一個(gè)查找結(jié)果,只有在 cat 命令行執(zhí)行完畢后,才能獲取正確的 %?%] 例如: cat --locate=a /File && set /a Last=%?% > nul ! set Last=-1 由于 %?% 和 cat 命令在同一條語(yǔ)句中,所以得不到正確的 %?% 結(jié)果。只有在 cat 命令行執(zhí)行完畢后,再執(zhí)行 set Last=%?% 才能獲取正確的 %?% 結(jié)果。 有一個(gè)技巧,可以用 &; 操作符實(shí)現(xiàn)變量的刷新: set Last=-1 && cat --locate=a /File &; set /a Last=%?% > nul ============================== cmp /menu.lst /m.lst 比較兩個(gè)文件是否相同。 cmp --hex /menu.lst /m.lst 比較兩個(gè)文件是否相同,并以十六進(jìn)制格式顯示對(duì)比結(jié)果。 cmp /menu.lst /m.lst > nul && echo same ! different 比較兩個(gè)文件是否相同,如果相同,則輸出 same,否則輸出 different。 ============================== dd if=()/menu.lst of=()/m.lst 將 /menu.lst 的內(nèi)容復(fù)制到 /m.lst 中 dd if=()/menu.lst of=()/m.lst bs=32 count=5 以 32 為塊大小(默認(rèn) 512),從 /menu.lst 中復(fù)制 5 塊數(shù)據(jù)到 /m.lst 中。e dd if=()/menu.lst of=()/m.lst bs=10 skip=5 seek=6 以 10 為塊大小,從 /menu.lst 中復(fù)制數(shù)據(jù)到 /m.lst 中。復(fù)制時(shí),跳過(guò) /menu.lst 的前 5 個(gè)塊,從第 6 個(gè)塊開(kāi)始讀取,寫(xiě)入時(shí),跳過(guò) /m.lst 的前 7 個(gè)塊,從第 8 個(gè)塊開(kāi)始寫(xiě)入。 dd if=()/menu.lst of=()/m.lst buf=0x2000000 buflen=0x2000000 將 /menu.lst 的內(nèi)容復(fù)制到 /m.lst 中,復(fù)制時(shí),從內(nèi)存的 0x2000000 位置(32M的位置)取 0x2000000 空間(32M的空間)作為緩存,對(duì)于復(fù)制大文件來(lái)說(shuō),增加緩存的大小能夠加快 dd 的讀寫(xiě)速度。 [注意:源文件和目標(biāo)文件都必須存在,路徑必須以設(shè)備名開(kāi)頭,超出文件長(zhǎng)度的部分會(huì)被丟棄,目標(biāo)文件不能是 gz 壓縮文件,源文件可以是 gz 壓縮文件,壓縮文件在復(fù)制前會(huì)被解壓。dd 可以對(duì)整個(gè)設(shè)備進(jìn)行讀寫(xiě)操作:dd if=(fd0) of=(fd1),慎用。] [注意:使用 dd 命令時(shí),不建議設(shè)置緩存,因?yàn)樵O(shè)置的緩存區(qū)域可能被其它程序混用,從而導(dǎo)致不可預(yù)知的后果] ============================== write /menu.lst abc 在 /menu.lst 文件的開(kāi)頭寫(xiě)入 3 個(gè)字符 abc,覆蓋原來(lái)的字符。 write /menu.lst "abc" 在 /menu.lst 文件的開(kāi)頭寫(xiě)入 5 個(gè)字符 "abc",覆蓋原來(lái)的字符。 write /menu.lst \"abc\" 在 /menu.lst 文件的開(kāi)頭寫(xiě)入 5 個(gè)字符 "abc",覆蓋原來(lái)的字符。 [注意:被寫(xiě)入的字符串,除了開(kāi)頭的空格,其他空格或單引號(hào)或雙引號(hào)都不需要轉(zhuǎn)義,轉(zhuǎn)義也可以被處理,反斜線必須被轉(zhuǎn)義] [注意:被寫(xiě)入的目標(biāo)文件必須存在,超出文件長(zhǎng)度的部分會(huì)被丟棄,目標(biāo)文件不能是 gz 壓縮文件,源文件可以是 gz 壓縮文件,壓縮文件在復(fù)制前會(huì)被解壓。write 命令可以對(duì)設(shè)備進(jìn)行操作:write (fd0) abc,慎用。] write 0x8274 0x2001 [建議:使用和 calc 相同的語(yǔ)法 write *0x8274 0x2001 和 write *0x8274 *0x8280] 如果寫(xiě)入的對(duì)象不是文件或設(shè)備,而是一個(gè)數(shù)字,則該數(shù)字表示內(nèi)存地址,write 將該地址處的內(nèi)存數(shù)據(jù)修改為指定值,被寫(xiě)入的數(shù)據(jù)必須為整數(shù),不能是字符串。用下面的內(nèi)存地址進(jìn)行練習(xí): write 0x50000 -1 redad 0x50000 write 0x50000 0 redad 0x50000 ============================== read 0x8280 [建議:使用和 calc 相同的語(yǔ)法 read *0x8280] 從內(nèi)存的指定位置讀取一個(gè) 32-bit 的值,并以十六進(jìn)制形式顯示出來(lái)。 ============================== 現(xiàn)在 grub4dos 本身對(duì)常規(guī)內(nèi)存的占用情況如下: 00000~0FFFF 被 grub4dos 的程序代碼和堆棧占用。 10000~1FFFF 為 grub4dos 將來(lái)的代碼和數(shù)據(jù)保留。 20000~2FFFF 被 grub4dos 內(nèi)核中的自動(dòng)幾何參數(shù)探測(cè)占用,作為緩沖區(qū)。 30000~37FFF 被 grub4dos 內(nèi)核中的常規(guī)磁盤(pán)讀寫(xiě)緩沖區(qū)占用。 38000~4FFFF 保留給 grub4dos 將來(lái)的擴(kuò)展。 50000~7FFFF 保留給用戶使用 100000~110000 被 dd 命令的磁盤(pán)緩沖區(qū)占用。 [注意:以上關(guān)于內(nèi)存分配的內(nèi)容不一定準(zhǔn)確,希望開(kāi)發(fā)人員指正] ============================== calc 1+1 計(jì)算 1+1 的結(jié)果,可執(zhí)行的操作:+(加)、-(減)、*(乘)、/(除)、%(余)、<<(左移)、>>(右移)、&(與)、|(或)、^(異或) calc 0xFF 顯示 0xFF 的十進(jìn)制和十六進(jìn)制結(jié)果 calc *0x8280 顯示內(nèi)存 0x8280 處存儲(chǔ)的整數(shù)值 calc *50000=1 將內(nèi)存 0x50000 處存儲(chǔ)的整數(shù)值修改為 1 calc *50000=*0x8280 將內(nèi)存 0x50000 處存儲(chǔ)的整數(shù)值修改為 0x8280 處存儲(chǔ)的整數(shù)值 calc *50000=1<<4 將內(nèi)存 0x50000 處存儲(chǔ)的整數(shù)值修改為計(jì)算后的結(jié)果(1<<4=16) [注意:在 set /a var=value 中,value 也可以用上面的方法進(jìn)行計(jì)算:set /a b=*0x8280] calc 和 set /a 可以將負(fù)數(shù)當(dāng)做被減數(shù)處理,不過(guò)要在減號(hào)之后添加一個(gè)空格,例如下面的代碼: set a=-32 set /a b=0-%a% 上面的 set 命令無(wú)法計(jì)算 0--32 的值,用下面的寫(xiě)法就可以計(jì)算了(在減號(hào)之后添加一個(gè)空格): set a=-32 set /a b=0- %a% 上面的 set 命令可以計(jì)算 0- -32 的值,結(jié)果為 32。 ============================== checktime 顯示當(dāng)前日期時(shí)間星期 checktime * 0-12 * * * && echo 上午 ! echo 下午 根據(jù)不同的時(shí)間顯示不同的信息。(checktime 分 時(shí) 日 月 星期) checktime * * * * 6,0 && echo 周末 ! echo 非周末 根據(jù)不同的時(shí)間顯示不同的信息。(checktime 分 時(shí) 日 月 星期) checktime * * * * */2 && echo 雙周 ! echo 單周 根據(jù)不同的時(shí)間顯示不同的信息。(checktime 分 時(shí) 日 月 星期) checktime 0,1-59/15 * * * * && echo 整刻鐘 ! echo 非整刻鐘 根據(jù)不同的時(shí)間顯示不同的信息。(checktime 分 時(shí) 日 月 星期) ============================== echo \\Hello 在屏幕上輸出 \\Hello(行尾會(huì)自動(dòng)添加換行符) echo -n \\Hello 在屏幕上輸出 \\Hello(行尾不會(huì)自動(dòng)添加換行符) echo -e \\Hello 在屏幕上輸出 \Hello(-e 表示處理轉(zhuǎn)義字符) echo -h 顯示 echo 支持的顏色表 echo $[0x1F] abc 使用顏色表 1F 處的前景色和背景色顯示 abc echo $[0x1F] abc $[0xE4] def 使用顏色表 1F 處的前景色和背景色顯示 abc,然后使用顏色表 E4 處的前景色和背景色顯示 def echo -P:0101 abc 在屏幕的第一行第一列顯示 abc echo -n > /menu.lst 清空 /menu.lst 文件的內(nèi)容 ============================== pager on 打開(kāi)滿屏分頁(yè)顯示模式 [Hit Q to quit, any other key to continue] pager off 關(guān)閉滿屏分頁(yè)顯示模式 pager 切換滿屏分頁(yè)顯示模式 pager status 輸出當(dāng)前滿屏分頁(yè)顯示模式 ============================== clear 清屏(清除屏幕上顯示的內(nèi)容) ========================================================================================== 接下來(lái)學(xué)習(xí)這些命令(9個(gè)): graphicsmode、vbeprobe、testvbe、setvbe、terminal、terminfo、font、background、foreground ============================== graphicsmode 顯示當(dāng)前使用的圖形模式 graphicsmode 0x12 使用 vga 模式(640×480),推薦使用 vbe 模式 graphicsmode 0x6A 使用 vga 模式(800x600,對(duì)一些機(jī)子支持不是很好,有可能會(huì)死機(jī)),推薦使用 vbe 模式 graphicsmode -1 640 使用 vbe 模式,指定分辨率寬度為 640,若顯示器不支持此寬度的分辨率,將執(zhí)行失敗 graphicsmode -1 800 600 使用 vbe 模式,指定分辨率寬度為 800,高度為 600,若顯示器不支持此分辨率,將執(zhí)行失敗 graphicsmode -1 1024 768 32 使用 vbe 模式,指定分辨率寬度為 1024,高度為 768,使用 32 位色,若顯示器不支持此分辨率或位色,將執(zhí)行失敗 graphicsmode -1 100:1000 100:1000 使用 vbe 模式,分辨率寬度從 100 到 1000 這個(gè)范圍內(nèi)選取可用的最大值,高度從 100 到 1000 這個(gè)范圍內(nèi)選取可用的最大值 即,上面的命令可選 320×200,320×400,640×400,640×480,800×600 等分辨率,從中選取可用的最高分辨率 graphicsmode -1 100:1000 100:1000 24:32 效果同上,但是增加了顏色深度的范圍,同樣,在 24 位色和 32 位色中選取可用的最高顏色深度 [注意:grub4dos 的 vbe 不支持 16 位及更低的色深,只支持 24 位和 32 位色深。所以,你的所有的 graphicsmode 命令,都需要顯式地指定 24:32 的色深,不可以省略。比如,使用 graphicsmode -1 和 graphicsmode -1 800 600 都是不完全正確的,應(yīng)該分別改成 graphicsmode -1 -1 -1 24:32 和 graphicsmode -1 800 600 24:32 才算是對(duì)的。] ============================== vbeprobe 偵測(cè) vbe 信息 vbeprobe 1024x768x32 偵測(cè)指定的 vbe 信息 vbeprobe 0x100 偵測(cè)指定的 vbe 信息 ============================== testvbe 800x600 測(cè)試指定的 vbe 模式,直接調(diào)用有時(shí)候會(huì)花屏 ============================== setvbe 800x600x32 在系統(tǒng)核心運(yùn)行前用來(lái)改變視頻模式,視頻模式信息會(huì)傳遞給核心。直接調(diào)用大部分情況下會(huì)花屏 [注意:setvbe 命令主要是為了某些 Linux 啟動(dòng)過(guò)程的圖形界面而設(shè)計(jì)的,一般是用不著的。建議永遠(yuǎn)不要使用它。如果你能避免使用它,就盡量避免使用它。通常 Linux 在自己的啟動(dòng)過(guò)程中,會(huì)自行設(shè)置相應(yīng)的圖形模式,而不是需要經(jīng)過(guò) grub4dos 的設(shè)置才行。所以,將來(lái)有可能取締這條 setvbe 命令。] ============================== terminal console 選擇文本模式的終端 terminal graphics 選擇圖形模式的終端 terminal --no-echo graphics 選擇圖形模式的終端,并且不顯示用戶輸入的字符 terminal --font-spacing=1:2 在 vbe 模式下,設(shè)置字距為 1,行距為2,單位:像數(shù)點(diǎn)。 [注:更多關(guān)于 terminal 的用法不知道怎么用,似乎也用不上。] ============================== terminfo 顯示當(dāng)前終端的配置信息 [注:更多關(guān)于 terminfo 的用法不知道怎么用,似乎也用不上。] ============================== font /unifont.hex.gz 加載字庫(kù)文件,用于在 vbe 模式下顯示漢字 字庫(kù)下載地址: https://code.google.com/p/grub4d ... name=unifont.hex.gz http://bbs./forum.php?mod=viewthread&tid=256198 ============================== background 303030 在 vga 模式下設(shè)置背景色,其它模式下不起作用 ============================== foreground FFFF00 在 vga 模式下設(shè)置前景色,其它模式下不起作用 ========================================================================================== 接下來(lái)學(xué)習(xí)這些命令(11個(gè)): halt、reboot、hide、unhide、hiddenflag、makeactive、partnew、parttype、blocklist、uuid、fstest ============================== halt 關(guān)機(jī)(halt 還有很多參數(shù),當(dāng)你關(guān)機(jī)出問(wèn)題的時(shí)候再去研究它的參數(shù)吧) ============================== reboot 重啟(沒(méi)有參數(shù)) ============================== hide (hd0,0) 隱藏第一硬盤(pán)第一主分區(qū) ============================== unhide (hd0,0) 取消隱藏第一硬盤(pán)第一主分區(qū) ============================== hiddenflag 顯示當(dāng)前根設(shè)備的顯/隱狀態(tài)(對(duì) ud、cd 等不起作用) hiddenflag (hd0,0) 顯示第一硬盤(pán)第一主分區(qū)的顯/隱狀態(tài) hiddenflag --set 將當(dāng)前跟設(shè)備設(shè)置為隱藏 hiddenflag --set (hd0,0) 將第一硬盤(pán)第一主分區(qū)設(shè)置為隱藏(即若原分區(qū)類型為 0x07,現(xiàn)在分區(qū)類型為 0x17) hiddenflag --clear 將當(dāng)前跟設(shè)備設(shè)置為顯現(xiàn) hiddenflag --clear (hd0,0) 將第一硬盤(pán)第一主分區(qū)設(shè)置為顯現(xiàn)(即若原分區(qū)類型為 0x17,現(xiàn)在分區(qū)類型為 0x07) ============================== makeactive 將當(dāng)前設(shè)備設(shè)置為活動(dòng) makeactive (hd0,0) 將第一硬盤(pán)第一主分區(qū)設(shè)置為活動(dòng) makeactive --status 顯示當(dāng)前設(shè)備是否為活動(dòng)狀態(tài) makeactive --status (hd0,0) 顯示第一硬盤(pán)第一主分區(qū)是否為活動(dòng)狀態(tài) ============================== partnew [--active] 分區(qū)號(hào) 類型 起始扇區(qū) [長(zhǎng)度] 這個(gè)不多研究,要修改分區(qū),還是用專用軟件吧。 Grub4Dos 0.4.5c 的幫助文檔中有一些例子,感興趣的可以研究一下。 ============================== parttype 顯示當(dāng)前分區(qū)的分區(qū)類型 parttype (hd0,0) 顯示第一硬盤(pán)第一分區(qū)的分區(qū)類型 parttype (hd0,0) 0x17 將第一硬盤(pán)第一分區(qū)的分區(qū)類型改為 0x17 ============================== blocklist /grldr 顯示文件的塊信息,即文件所在區(qū)域的起始?jí)K和塊長(zhǎng)度。 blocklist 命令不能用于 pxe 設(shè)備上的文件。 [注意:如果文件有碎片,blocklist 會(huì)列出文件的所有塊,包括碎片,如果碎片太多,超出了 Grub4Dos 的緩沖區(qū),則該命令會(huì)失敗] ============================== uuid 列處所有設(shè)備的 uuid 號(hào) uuid (hd0,0) 顯示指定設(shè)備的 uuid 號(hào) uuid 000E0336000C1B8D 查找 uuid 號(hào)為 000E0336000C1B8D 的設(shè)備,并將其設(shè)置為當(dāng)前設(shè)備 uuid (hd0,0) 000E0336000C1B8D && echo yes ! echo no 如果 (hd0,0) 的 uuid 號(hào)為 000E0336000C1B8D 則輸出 yes,否則輸出 no ============================== fstest 為了幫助開(kāi)發(fā)者開(kāi)發(fā)文件系統(tǒng)支持代碼而設(shè)置的命令,終端用戶不需要它。 ========================================================================================== 接下來(lái)學(xué)習(xí)這些命令(8個(gè)): kernel、initrd、module、modulenounzip、chainloader、boot、pxe、quit ============================== kernel [--no-mem-option] [--type=TYPE] FILE [ARG ...] 嘗試載入主引導(dǎo)映像文件。其它項(xiàng)將被作為內(nèi)核的命令行參數(shù)而傳遞給內(nèi)核。 使用此命令以前,內(nèi)核所用到的模塊應(yīng)該被重新載入。 參數(shù) --type 用于說(shuō)明內(nèi)核的類型,包括 "netbsd", "freebsd", "openbsd", "linux", "biglinux" 和 "multiboot"。 參數(shù) --no-mem-option 用于說(shuō)明不必自動(dòng)傳遞 Linux 的內(nèi)存參數(shù)。 ============================== initrd FILE [FILE...] 加載 Linux 格式的初始化虛擬盤(pán), 并設(shè)置必要的參數(shù)。 指定在系統(tǒng)啟動(dòng)訪問(wèn)真正的根文件系統(tǒng)前,訪問(wèn)的 ramdisk 映象。 下面通過(guò) kernel 和 initrd 命令啟動(dòng) Ubuntu 13.10 LiveCD: # 菜單標(biāo)題 title 啟動(dòng) Ubuntu 13.10 amd64 LiveCD # 查找 UBUNTU-13.10-X64.ISO 所在磁盤(pán)并將其設(shè)置為當(dāng)前磁盤(pán) find --set-root /BOOT/UBUNTU/UBUNTU-13.10-X64.ISO # 嘗試載入主引導(dǎo)映像文件 vmlinuz.efi,后面是傳遞給 vmlinuz.efi 的參數(shù)。 kernel /BOOT/UBUNTU/vmlinuz.efi boot=casper iso-scan/filename=/BOOT/UBUNTU/UBUNTU-13.10-X64.ISO locale=zh_CN.UTF-8 # 加載 Linux 格式的初始化虛擬盤(pán) initrd.lz。 initrd /BOOT/UBUNTU/initrd.lz ============================== module FILE [ARG ...] 對(duì)多重啟動(dòng)映像, 加載啟動(dòng)模塊文件(不處理該文件的內(nèi)容, 用戶必須自己確定核心的要求)。 剩余參數(shù)作為“模快命令行”傳遞,象 kernel 命令一樣。 這個(gè)命令一般用不上,當(dāng)你要啟動(dòng) Linux 系統(tǒng)的時(shí)候,而且系統(tǒng)要求加載模塊文件的時(shí)候,才會(huì)用到,相關(guān) Linux 系統(tǒng)中會(huì)有說(shuō)明,一般用戶可以忽略這個(gè)命令。 ============================== modulenounzip FILE [ARG ...] 與 module 類似,但是禁用了自動(dòng)解壓縮。 功能同上,一般用戶可以忽略這個(gè)命令。 ============================== chainloader /ntldr 加載 ntldr 啟動(dòng)文件 chainloader (hd0,0)+1 加載 (hd0,0) 的第一扇區(qū) chainloader +1 加載當(dāng)前設(shè)備的第一扇區(qū) chainloader --force (hd0,0)+1 加載 (hd0,0) 的第一扇區(qū),忽略該扇區(qū)啟動(dòng)標(biāo)識(shí)的有效性,強(qiáng)制啟動(dòng) [注:chainloader 還有許多其它參數(shù),可以在啟動(dòng)之前修改 CPU 的寄存器,不過(guò)對(duì)于普通用戶來(lái)說(shuō),這些東西不會(huì)用到,如果想知道 chainloader 的更多參數(shù),可以參考《Grub4Dos 0.4.5c 的幫助文檔》] ============================== boot 引導(dǎo)已加載的操作系統(tǒng)或扇區(qū)鏈?zhǔn)郊虞d器,確定進(jìn)行啟動(dòng),通常和 chainloader 命令搭配使用,在菜單文件中可以省略,命令行模式下需要。 chainloader /ntldr boot 加載 ntldr 啟動(dòng)文件,然后啟動(dòng)。 boot -1 調(diào)用 BIOS 的 int18 功能,根據(jù) BIOS 設(shè)置的啟動(dòng)順序,啟動(dòng)下一設(shè)備。 boot --int18 功能同上,調(diào)用 BIOS 的 int18 功能,根據(jù) BIOS 設(shè)置的啟動(dòng)順序,啟動(dòng)下一設(shè)備。 ============================== pxe 這個(gè)命令比較復(fù)雜,以后再研究,先把本地啟動(dòng)搞懂。 ============================== quit 如果是從 DOS 環(huán)境進(jìn)入 GRUB 環(huán)境中,使用本命令可以退回到 DOS 環(huán)境中。 quit --disable-a20 使用 --disable-a20 參數(shù),將會(huì)在把控制權(quán)移交給 DOS 時(shí)關(guān)閉 A20 總線。 ========================================================================================== 接下來(lái)學(xué)習(xí)這些命令(15個(gè)): configfile、default、savedefault、timeout、title、iftitle、hiddenmenu、password、lock、md5crypt、commandline、gfxmenu、splashimage、color、outline ============================== 用在命令行或菜單文件中: configfile /menu.lst 加載當(dāng)前設(shè)備根目錄下的菜單文件 /menu.lst。 configfile (hd0,0)/menu.lst 加載 (hd0,0)/menu.lst。 configfile (md)4+8 特殊用法,回到 grldr 內(nèi)置菜單。 新版返回內(nèi)置菜單的命令: write 0x307ff8 1 && configfile [注意:configfile 命令執(zhí)行后,當(dāng)前設(shè)備和當(dāng)前目錄將同時(shí)更新為 FILE 文件所在的設(shè)備。如果在內(nèi)置菜單的初始化命令組中出現(xiàn)不帶任何參數(shù)的 configfile 命令,那么控制將轉(zhuǎn)到啟動(dòng)設(shè)備上的 menu.lst 文件。] ============================== 用在所有菜單項(xiàng)之前: default 0 默認(rèn)選擇第一個(gè)菜單項(xiàng)(如果用戶不手動(dòng)選擇的話) default saved 默認(rèn)選擇上次 savedefault 保存的菜單項(xiàng)(savedefault 在菜單項(xiàng)中執(zhí)行,默認(rèn)保存到 /default 文件中) default /FILE 默認(rèn)選擇上次 savedefault 保存的菜單項(xiàng)(savedefault 在菜單項(xiàng)中執(zhí)行,默認(rèn)保存到 /FILE 文件中) [注意:/default 文件或 /FILE 文件必須為 2048 字節(jié),手動(dòng)修改后也要保證文件長(zhǎng)度為 2048 字節(jié)] ============================== 用在菜單項(xiàng)中: savedefault 將當(dāng)前菜單項(xiàng)作為默認(rèn)菜單保存到 /default 中或 default 命令指定的 /FILE 中。 savedefault --wait=5 將當(dāng)前菜單項(xiàng)作為默認(rèn)菜單保存到 /default 中或 default 命令指定的 /FILE 中,保存前給用戶一個(gè) 5 秒的提示: About to write the entry number x to file Press Y to allow or N to deny. 如果用戶在 5 秒內(nèi)沒(méi)有按 Y 鍵,則默認(rèn)不保存菜單項(xiàng)。 ============================== 用在所有菜單項(xiàng)之前: timeout 10 在出現(xiàn)菜單列表后,10 秒鐘之內(nèi),如果用戶沒(méi)有手動(dòng)進(jìn)行選擇,則執(zhí)行默認(rèn)菜單項(xiàng)。 ============================== title 菜單標(biāo)題 指定菜單項(xiàng)的標(biāo)題文本 title 菜單標(biāo)題\n菜單提示第一行\(zhòng)n菜單提示第二行\(zhòng)n... 指定菜單項(xiàng)的標(biāo)題文本和提示文本 [注意:如果菜單項(xiàng)中沒(méi)有啟動(dòng)敏感命令,則該菜單不能用上下方向鍵選擇,只能用左右方向鍵選擇。] 啟動(dòng)敏感命令: boot、chainloader、configfile、command、commandline、halt、kernel、pxe、quit、reboot 在菜單列表界面可以執(zhí)行如下操作: e :編輯當(dāng)前的啟動(dòng)菜單項(xiàng) b :?jiǎn)?dòng)當(dāng)前的菜單項(xiàng) c :進(jìn)入 grub 的命令行方式 在編輯菜單項(xiàng)時(shí)可以執(zhí)行如下操作: e :編輯當(dāng)前行 d :刪除當(dāng)前行 o :在當(dāng)前行下面插入新行 O :在當(dāng)前行上面插入新行 b :?jiǎn)?dòng)當(dāng)前菜單 c :進(jìn)入 grub 的命令行方式 esc:返回 grub 菜單列表,取消對(duì)當(dāng)前菜單項(xiàng)所做的任何修改 [注意:對(duì)菜單的修改只是臨時(shí)的,只對(duì)本次啟動(dòng)有效] 在命令行下可以執(zhí)行如下操作: esc:返回 grub 菜單列表 在菜單列表中可以按數(shù)字鍵來(lái)選擇菜單,如果要選擇 9 以上的菜單項(xiàng),可以按兩次數(shù)字鍵,比如要選擇第 25 菜單項(xiàng),可以先按下 2 再按下 5(菜單序號(hào)從 0 開(kāi)始,即第一個(gè)菜單的序號(hào)為 0)。 ============================== iftitle [if exist (hd0,0)/bootmgr] 啟動(dòng) (hd0,0) 中的 NT6.x 如果 [] 中的條件成立,則顯示該菜單,否則不顯示該菜單 ============================== 用在所有菜單項(xiàng)之前: hiddenmenu 3 不顯示菜單列表,使用菜單項(xiàng) 3 啟動(dòng),在 timeout 時(shí)間內(nèi)按任意鍵可以顯示菜單列表。 hiddenmenu --chkpass=0x5700 不顯示菜單列表,使用菜單項(xiàng) default 啟動(dòng),在 timeout 時(shí)間內(nèi)按 F11 鍵可以顯示菜單列表。 [注意:按鍵代碼如果不清楚可以使用 pause --test-key 命令來(lái)獲取功能] ============================== 用在菜單項(xiàng)中,或用在所有菜單項(xiàng)之前: password 密碼 對(duì)菜單進(jìn)行加鎖,看下面的示例: title 菜單標(biāo)題 password 123 commandline 要執(zhí)行該菜單需要輸入密碼 123 title 菜單標(biāo)題 password --md5 $1$JS/2$CKT61E11gzkdEKQnEpqjhS1 commandline 要執(zhí)行該菜單需要輸入密碼 123(密碼 123 是經(jīng)過(guò) md5 加密的) timeout 10 default 0 password 123 title 菜單1 commandline title 菜單2 commandline 對(duì)整個(gè)菜單列表進(jìn)行加鎖,被加鎖后的菜單列表不能按 e 鍵進(jìn)行編輯,不能按 c 鍵進(jìn)入命令行,解鎖后才能使用這些功能,在菜單列表界面下按下 p 鍵可以輸入解鎖密碼。 [注意:要想獲取字符串的 md5 編碼,可以執(zhí)行 md5crypt 123] ============================== 用在菜單項(xiàng)中: lock 鎖定當(dāng)前菜單,需要解鎖后才能進(jìn)入??聪旅娴氖纠?br> timeout 10 default 0 password 123 title 菜單1 lock commandline title 菜單2 commandline 解鎖前,“菜單1”不能執(zhí)行,“菜單2”可以執(zhí)行,解鎖后,“菜單1”和“菜單2”都可以執(zhí)行 ============================== 用在命令行中: md5crypt abc 獲取字符串 abc 的 md5 編碼。 ============================== 用在菜單項(xiàng)中: commandline 進(jìn)入 Grub4Dos 的命令行。 ============================== 用在所有菜單項(xiàng)之前: gfxmenu /message 使用 /message 中的圖形菜單 由于 gfxmenu 與 Grub4Dos 兼容性不好,所以不建議使用 ============================== 用在所有菜單項(xiàng)之前: splashimage /FILE vbe 圖形模式下載入背景圖片文件。在 vbe 模式下,可使用 24位色或32位色 BMP 格式或 XPM 格式的圖片作為背景。 ============================== 用在所有菜單項(xiàng)之前: color normal=0xFFFFFF highlight=0xFF0000 設(shè)置未選中菜單為白色,選中菜單為紅色 color heading=0x0000FF helptext=0x00FF00 設(shè)置菜單頂部信息的顏色為藍(lán)色,菜單幫助信息的顏色為綠色 color standard=0xFFFFFF 設(shè)置控制臺(tái)的文本顏色為白色 color border=0xFF00FF 設(shè)置菜單邊框顏色為品紅色(VBE模式下有效) color normal=0xFFFFFF highlight=0xFF0000 heading=0x0000FF helptext=0x00FF00 standard=0xFFFFFF border=0xFFFF00 同時(shí)設(shè)置上面所有顏色 color 0xFFFFFF 0xFF0000 0x0000FF 0x00FF00 0xFFFFFF 0xFFFF00 同時(shí)設(shè)置上面所有顏色(如果按順序設(shè)置,可以省略狀態(tài)標(biāo)記) color 0xFFFFFF 0xFF0000 設(shè)置未選中菜單為白色,選中菜單為紅色(如果按順序設(shè)置,可以省略狀態(tài)標(biāo)記) [注:0xFFFFFF 表示紅綠藍(lán)三種顏色的值:0xRRGGBB] ============================== 用在所有菜單項(xiàng)之前: outline on 打開(kāi)圖形模式下的字符輪廓顯示模式。 outline off 關(guān)閉圖形模式下的字符輪廓顯示模式。 outline 切換圖形模式下的字符輪廓顯示模式。 outline status 顯示當(dāng)前圖形模式下的字符輪廓顯示模式。 [注:當(dāng)由于背景的原因字跡顯示不清時(shí)可以嘗試開(kāi)啟,會(huì)獲得比較好的顯示效果] ========================================================================================== 接下來(lái)學(xué)習(xí)這些命令(16個(gè)): call、exit、shift、goto、set、setlocal、endlocal、if、checkrange、errorcheck、errnum、fallback、pause、command、insmod、delmod ============================== call :標(biāo)簽1 參數(shù)1 參數(shù)2 ... 轉(zhuǎn)到到“標(biāo)簽1”執(zhí)行行并在 :eof 處返回,通過(guò) goto :eof 或 exit 可以跳轉(zhuǎn)到 :eof 處。 !BAT #注:文件頭 !BAT 是必須的,用于識(shí)別這是一個(gè) Grub4Dos 批處理腳本 # 將此文件保存為 test,然后在 Grub4Dos 的命令行中輸入 test 執(zhí)行它 call :label1 參數(shù)1 參數(shù)2 參數(shù)3 參數(shù)4 參數(shù)5 參數(shù)6 && echo ok ! echo fail call :label2 參數(shù)1 參數(shù)2 參數(shù)3 參數(shù)4 參數(shù)5 參數(shù)6 && echo ok ! echo fail echo 腳本結(jié)束 exit :label1 echo %1 %2 %3 %4 %5 %6 %7 %8 %9 exit 0 :label2 echo %9 %8 %7 %6 %5 %4 %3 %2 %1 exit 1 調(diào)用 label1 并獲取其返回值,根據(jù)返回值顯示 ok 或 fail 調(diào)用 label2 并獲取其返回值,根據(jù)返回值顯示 ok 或 fail label1 始終返回 true label2 始終返回 false call 可以刷新環(huán)境變量,進(jìn)入新的環(huán)境,例如下面的代碼: iftitle [find --set-root --devices=h /bootmgr && call set bootmgr=%@root^%] load BOOTMGR of Windows VISTA/WIN7/WIN2008 on %bootmgr% 如果不加 call 則 --set-root 不能立即生效。 這里還要注意一點(diǎn),整行命令在執(zhí)行之前會(huì)被解析,解析的過(guò)程中,會(huì)將其中的變量替換成實(shí)際的值。%@root^% 的寫(xiě)法就是為了防止在解析命令行的時(shí)候?qū)⑵鋽U(kuò)展成實(shí)際的值,而是將其擴(kuò)展成字符串 %@root%,以便下次解析的時(shí)候繼續(xù)擴(kuò)展。當(dāng) find --set-root --devices=h /bootmgr 執(zhí)行成功后,需要執(zhí)行 && call set bootmgr=%@root^%(此時(shí) %@root^% 已經(jīng)被擴(kuò)展成 %@root% 了)的時(shí)候,又要執(zhí)行一次解析,此時(shí)會(huì)將 %@root% 擴(kuò)展成實(shí)際的值。 ============================== exit 跳轉(zhuǎn)到腳本文件的 :eof 處(腳本文件的結(jié)尾處)。功能同 goto :eof ============================== shift 批處理專用,丟棄第一個(gè)參數(shù),后面的參數(shù)向前移動(dòng)。 shift 3 批處理專用,丟棄第三個(gè)參數(shù),后面的參數(shù)向前移動(dòng)。 [注意:Grub4Dos 中可以使用 %1~%9 參數(shù),其中 %9 指剩下的所有參數(shù)] ============================== goto :標(biāo)簽1 批處理專用,跳轉(zhuǎn)到“標(biāo)簽1”處執(zhí)行,不返回,不支持參數(shù)。 goto 3 菜單專用,跳轉(zhuǎn)到指定的菜單項(xiàng)執(zhí)行。 ============================== set a=123 設(shè)置變量 a 的值為字符串 123 set /a a=123 設(shè)置變量 a 的值為十進(jìn)制整數(shù) 123 set /A a=123 設(shè)置變量 a 的值為十六進(jìn)制整數(shù) 0x7B set /a a=123+4 設(shè)置變量 a 的值為十進(jìn)制整數(shù) 127(可參考 calc 命令) set /A a=123+4 設(shè)置變量 a 的值為十六進(jìn)制整數(shù) 0x7F(可參考 calc 命令) set a 顯示變量 a 的值 set a= 刪除變量 a set *0x8280=0x80 設(shè)置內(nèi)存地址 0x8280 處的整數(shù)值為 0x80 set 列出所有變量列表 set a=abcdef set len_a=%@retval% 通過(guò) %@retval% 獲取最后一次設(shè)置的變量的長(zhǎng)度 set a=abcdef && set /a len_a=*0x4cb00 通過(guò) *0x4cb00 獲取最后一次設(shè)置的變量的長(zhǎng)度 [注意:變量名最長(zhǎng)為 8 個(gè)字符,變量?jī)?nèi)容最長(zhǎng)為 512 字節(jié),變量最多只能設(shè)置 60 個(gè)] ============================== setlocal 和 endlocal setlocal 與 endlocal 之間的變量為本地變量,見(jiàn)下面的例子: set a=123 setlocal set a=4 echo %a% endlocal echo %a% 在 setlocal 與 endlocal 之間將 a 賦值為 4,但是這不影響 setlocal 之前設(shè)置的變量 a,在 endlocal 之后,變量 a 恢復(fù)為之前的值 123。 setlocal @ 和 endlocal @ setlocal 與 endlocal 之間的變量為本地變量,setlocal @ 和 endlocal @ 可以跨腳本文件存在。 [注意:setlocal @ 之前的 setlocal 將失效,setlocal @ 之后的 setlocal 不能跨腳本。] ============================== if #%a%==#123 echo ok 如果變量 a 的值等于 123 則輸出 ok if #%a%<=#123 echo ok 如果變量 a 的值小于等于 123 則輸出 ok if #%a%>=#123 echo ok 如果變量 a 的值大于等于 123 則輸出 ok if #%a%>=#abc echo ok 如果變量 a 的值等于字符串 abc 則輸出 ok(區(qū)分大小寫(xiě)) if /i #%a%>=#abc echo ok 如果變量 a 的值等于字符串 abc 則輸出 ok(忽略大小寫(xiě)) if #%a%==# echo ok 如果變量 a 的值為空則輸出 ok if #%a%==#123 && echo ok 如果變量 a 的值等于 123 則輸出 ok if #%a%==#123 || echo fail 如果變量 a 的值不等于 123 則輸出 fail if not #%a%==#123 echo fail 如果變量 a 的值不等于 123 則輸出 fail if exist a echo ok 如果存在變量 a 則輸出 ok if not exist a echo fail 如果不存在變量 a 則輸出 fail if exist /grldr && echo ok ! echo fail 如果存在文件 /grldr 則輸出 ok,否則輸出 fail 判斷文件或目錄是否存在,對(duì)驅(qū)動(dòng)器無(wú)效,比如 (ud)/: if exist /FILE && 文件或目錄存在 ! echo 文件或目錄不存在 判斷文件是否存在: cat --length=0 /FILE && echo 文件存在 ! echo 文件不存在 判斷目錄是否存在,對(duì)驅(qū)動(dòng)器無(wú)效,比如 (ud)/: cat --length=0 /FILE && echo 目錄不存在 || if exist /FILE && echo 目錄存在 ! echo 目錄不存在 ============================== checkrange 范圍 命令 && 成功 ! 失敗 如果“命令”的返回值在“范圍”內(nèi),則執(zhí)行“成功”,否則執(zhí)行“失敗”。 checkrange 23 calc 20+3 && echo ok ! echo fail 如果 20+3 的值為 23,則輸出 ok,否則輸出 fail checkrange 0x21,0x23,0x80 read 0x8280 && echo ok ! echo fail 如果從 0x8280 處讀出的值為 0x21 或 0x23 或 0x80 則輸出 ok,否則輸出 fail checkrange 0:100 calc %a% && echo ok ! echo fail 如果變量 a 的值在 0-100 之間,則輸出 ok,否則輸出 fail ============================== errorcheck on 打開(kāi)錯(cuò)誤檢查,遇到錯(cuò)誤將終止執(zhí)行 errorcheck off 關(guān)閉錯(cuò)誤檢查,執(zhí)行中遇到錯(cuò)誤將忽略,直至執(zhí)行完畢 errorechek 切換錯(cuò)誤檢查模式 errorcheck status 顯示當(dāng)前錯(cuò)誤檢查模式 [注:errorcheck 命令控制著錯(cuò)誤是否被處理。默認(rèn) errorcheck 是開(kāi)啟的,即在錯(cuò)誤發(fā)生時(shí)命令腳本將停止執(zhí)行。如果 errorcheck 是關(guān)閉的,則腳本將一直執(zhí)行到 boot 命令(即 off 狀態(tài)下,fallback 命令等將失效)。一條 boot 命令可以把錯(cuò)誤檢查轉(zhuǎn)變?yōu)殚_(kāi)啟] ============================== errnum 返回上一條命令的錯(cuò)誤代碼。若上一條命令未出錯(cuò),則返回錯(cuò)誤代碼為 0,否則返回相應(yīng)的錯(cuò)誤代碼。 ============================== fallback 3 如果當(dāng)前菜單項(xiàng)執(zhí)行出錯(cuò),則轉(zhuǎn)移到第 3 菜單項(xiàng)繼續(xù)執(zhí)行。該命令僅在菜單中使用,用于無(wú)人引導(dǎo)模式:如果默認(rèn)菜單項(xiàng)執(zhí)行出錯(cuò),無(wú)需等待用戶操作,立即跳轉(zhuǎn)到第 3 菜單項(xiàng)繼續(xù)執(zhí)行。 ============================== pause press any key to continue 暫停命令的運(yùn)行,并給出一段提示信息,按下任意鍵后繼續(xù)。 pause --wait=10 press any key to continue 暫停命令的運(yùn)行,并給出一段提示信息,按下任意鍵后繼續(xù)。如果在 10 秒內(nèi)沒(méi)有按下任意鍵,則自動(dòng)返回命令行。 pause --test-key 執(zhí)行該命令后,按下任意鍵,將顯示該按鍵的掃描碼。 pause && set /a key=*0x4CB00 ! set key= 暫停命令的運(yùn)行,按下任意鍵后繼續(xù),并將該按鍵的 ASCII 碼存入變量 key 中。如果按下的是 ESC 鍵,則刪除變量 key ============================== command 顯示當(dāng)前指定的外部命令的位置 command --set-path=/boot/grub 指定外部命令的位置為 /boot/grub command RUN /pe.iso 查找外部命令 RUN 并執(zhí)行,參數(shù)為 /pe.iso command /boot/RUN /pe.iso 執(zhí)行外部命令 /boot/RUN,參數(shù)為 /pe.iso [注意:查找外部命令的順序如下: 如果是以 '(' 或 '/' 開(kāi)頭的文件被認(rèn)為是一個(gè)絕對(duì)路徑的文件,將直接執(zhí)行。否則先查找 insmod 加載的命令。再查找當(dāng)前目錄下的同名文件。再查找 --set-path 指定位置的同名文件。] ============================== insmod RUN 將外部命令 RUN 加載到內(nèi)存,使得執(zhí)行外部命令時(shí)直接從內(nèi)存讀取,而不是從源設(shè)備讀取,加快執(zhí)行速度。 insmod FILE.MOD FILE.MOD 是使用 makemod 程序生成的外部命令合集,免去多次使用 insmod 加載外部命令的麻煩。也可以使用 Fbinsttool 工具來(lái)制作 FILE.MOD 文件。 insmod /boot/grub/fat.gz fat 將外部命令 fat.gz 加載到內(nèi)存,同時(shí)指定新的名字 fat,此時(shí)可直接使用 fat 調(diào)用本外部命令。 [注意:insmod 載入的文件,其文件名長(zhǎng)度不能超過(guò) 11 個(gè)字符。] ============================== delmod 顯示已加載的外部命令 delmod RUN 卸載已加載的外部命令 RUN delmod * 卸載所有已加載的外部命令 delmod -l %~nx0 || insmod %0 判斷當(dāng)前腳本是否已經(jīng)載入內(nèi)存,如果沒(méi)有,則將其載入內(nèi)存。 ========================================================================================== 接下來(lái)學(xué)習(xí)這些命令(8個(gè)): help、debug、displaymem、geometry、is64bit、serial、tpm、setkey ============================== help 顯示內(nèi)部命令列表 help --all 顯示所有命令列表 help root 顯示 root 命令的幫助信息 ============================== debug off 或 debug 0 開(kāi)啟靜默模式 debug normal 或 debug 1 開(kāi)啟標(biāo)準(zhǔn)模式 debug on 開(kāi)啟冗余模式,從 debug 2 到 debug 0x7fffffff 都等同于 debug on(調(diào)試報(bào)告 BUG 時(shí)請(qǐng)使用該模式,可以獲得更詳細(xì)的信息) debug -1 隱藏倒計(jì)時(shí)提示 debug 3 開(kāi)啟批處理腳本調(diào)試模式(單步執(zhí)行),debug 3 模式下按 c 鍵可以進(jìn)入命令行,按 Ctrl + c 組合鍵可以中止腳本的執(zhí)行。 ============================== displaymem 顯示 GRUB 所判斷的當(dāng)前系統(tǒng)的內(nèi)存分布,包括所有物理內(nèi)存區(qū)域。 ============================== geometry (hd0) 輸出 (hd0) 的相關(guān)信息。 ============================== is64bit 如果 CPU 支持 64 位的話返回 true,否則返回 false。 ============================== serial 初始化一個(gè)串口設(shè)備。串口,不研究。 ============================== tpm --init 在地址 0000:7C00 處使用 512 字節(jié)數(shù)據(jù)作為初始化 TPM(可信賴平臺(tái)模塊)的緩存。用不上,不研究。 ============================== setkey a b 將按鍵 b 映射為按鍵 a,此時(shí)按下 b 鍵等同于按下 a 鍵。 [注:這里的鍵必須是字母, 數(shù)字, 和以下特殊鍵: escape(轉(zhuǎn)義), exclam(!), at(@), numbersign(#), dollar($), parenright ()) , caret(^), ampersand(&), asterisk(*), plus(+), percent(%), minus(-), underscore(_), equal(=), parenleft[(], backspace(退格), tab(制表), bracketleft([), braceleft({), bracketright(]), braceright(}), enter(回車), control(控制), semicolon(;), colon(:), quote('), doublequote("), slash(/), backquote(`), tilde(~), shift(換檔), backslash(\), bar(|), comma(,), less(<) period(.), greater(>), question(?), alt(交互), space(空格), capslock(大寫(xiě)), Fx(功能鍵) 和 delete(刪除)。 ========================================================================================== |
|
來(lái)自: Hongrongqi > 《grub4doc》