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