2009年1月2日 星期五

使用 Grub4Dos 來做隨身碟的開機管理

※grubinst(grubutil)可以在nt/2k/xp下寫進mbr,這樣grub4dos就懂得搜索ntfs根目錄下的grldr了!

※上星期買印表機時, 送了一個 1G 的 USB 隨身碟. 由於容量不小, 自己每天也都是筆記型電腦帶來帶去的, 也沒什麼東西要用這個來存放. 最後想說, 這玩意也可以拿來開機, 我只要把一些常用的程式放到上頭去, 就可以取代原本的一堆緊急救援的光碟片了, 這樣子應該會方便許多. 不過這些光碟, 有些是 DOS, 有些是 Linux, 也有些是 XPE 的程式, 如果要都放在一個隨身碟上頭, 就必須要有個開機管理的程式, 能夠在開機時選擇要進到那一個系統才可以. 所以就想到了在 Linux 中常用的 grub 這個 boot loader, 剛好也有個 DOS 版本的 grub4dos 可以使用. 所以… 就決定使用 grub4dos 來處理了.

首先使用 grubutil 裡頭的 grubinst_gui.exe 程式, 把隨身碟的 MBR 修改成使用 grub 來開機, 然後把 grub4dos 的 grldr 放到隨身碟的根目錄中, 基本上, 這樣子做之後, 就會在開機後執行 grldr 來使用 grub 了. 剩下來的, 就是設定 grub 的各種開機選項了. 只要同樣在隨身碟的根目錄中, 建立一個 menu.lst 的文字檔, 設定 grub 的各種開機選項就可以了.

首先, 如果你的隨身碟要由 DOS (Windows 98 中的 DOS) 開機, 只要把 IO.SYS, MSDOS.SYS 與 COMMAND.COM 複製到隨身碟的根目錄中, 然後在 menu.lst 中加上下面的設定:

title DOS
chainloader /io.sys

這樣子在 grub 中就會出現 DOS 這個選項了. 選擇後就會透過 IO.SYS 來做一般 DOS 開機的動作了.

接著, 我還有用 NoN 的 XPE, 把 ISO 檔案內的 SETUPLDR.BIN, RXPE.COM, RXPE.IM_ 與 RXPE.SIF 放到隨身碟的根目錄, 再把 OUTTOOL 目錄複製一份到隨身碟中, 然後在 menu.lst 中加上下面的設定:

title NoName XPE
chainloader /setupldr.bin

這樣子在 grub 中會出現 NoName XPE 這個選項, 選擇後就會載入 NoN XPE 了.

接著, 經常使用的 memtest86 軟體, 建立一個 MEMTEST86 的目錄, 把 memtest86.bin 放到這個目錄下頭, 然後在 menu.lst 中加上下面的設定:

title MemTest86 3.4
kernel /memtest86/memtest.bin (fd0)
boot

這樣子在 grub 中選擇 MemTest86 3.4 就會執行 memtest86 軟體.

接著, 在 Linux 中, 經常使用 SystemRescueCd 這個光碟, 同樣也可以放到隨身碟中. 首先建立一個 SYSRCD 的目錄, 然後把光碟內的 sysrcd.dat 放到這個目錄下, 再把光碟內 isolinux 目錄下的 rescuecd 與 rescuecd.igz (如果你習慣選擇使用其他的 kernel 也可以, 如 x86-64 的 rescue64 與 rescue64.igz)也放到 SYSRCD 目錄內. 然後在 menu.lst 中加上下面的設定:

title SystemRescueCd
root (hd0,0)
kernel /sysrcd/rescuecd subdir=sysrcd setkmap=us video=ofonly vga=0 cdroot
initrd /sysrcd/rescuecd.igz
boot

這樣子在 grub 中選擇 SystemRescueCd 就會載入 SystemRescueCd 的內容了.

如果你有使用 Acronis True Image 這個軟體, 可以先使用這個軟體, 產生回覆光碟或光碟的 iso 檔案, 然後建立一個 ATIRCD 的子目錄, 把光碟內的 kernel.dat 與 ramdisk.dat 放到 ATIRCD 的子目錄中. 然後在 menu.lst 中加上下面的設定:

title Acronis True Image
root (hd0,0)
kernel /atircd/kernel.dat quiet
initrd /atircd/ramdisk.dat /s
boot

這樣子在 grub 中選擇 Acronis True Image 這個選項, 就會執行 True Image 了.

如果你有 Windows 98 的開機片, 也可以把開機片做成一個 image 檔案 (winimage 或 linux 下頭直接用 dd 指令就可以), 如 win98.img 然後建立一個 WIN98 的目錄, 把這個檔案放到 WIN98 目錄中, 在 menu.lst 中加上下頭的設定:

title Windows 98 Boot Disk
map --mem (hd0,0)/win98/win98.img (fd0)
map --hook chainloader (fd0)+1
rootnoverify (fd0)

這樣子 grub 會弄一個虛擬的軟碟機, 把這個 image 載入會再開機.

最後, 加上一些進入 grub shell, 由軟碟機開機, reboot, halt 指令的項目:

title GRUB Command Line
commandline

title Floppy (fd0)
chainloader (fd0)+1
rootnoverify (fd0)

title Reboot
reboot

title Halt
halt

這樣子就完成了. 整個 menu.lst 如下:

color black/cyan yellow/cyan
default 0

title DOS
chainloader /io.sys

title NoName XPE
chainloader /setupldr.bin

title MemTest86 3.4
kernel /memtest86/memtest.bin (fd0)
boot

title SystemRescueCd
root (hd0,0)
kernel /sysrcd/rescuecd subdir=sysrcd setkmap=us video=ofonly vga=0 cdroot
initrd /sysrcd/rescuecd.igz
boot

title Acronis True Image
root (hd0,0)
kernel /atircd/kernel.dat quiet
initrd /atircd/ramdisk.dat /s
boot

title Windows 98 Boot Disk
map --mem (hd0,0)/win98/win98.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)

title Windows 98 Boot Disk with USB support
map --mem (hd0,0)/win98/w98usb.img (fd0)
map --hook
chainloader (fd0)+1
rootnoverify (fd0)

title GRUB Command Line
commandline

title Floppy (fd0)
chainloader (fd0)+1
rootnoverify (fd0)

title Reboot
reboot

title Halt
halt
經過這樣子的處理, 我們可以把一堆原本開機的軟碟片或光碟片, 都整合在一個小小的隨身碟中, 只要系統有支援 USB 開機 (現在應該沒有機器是不支援的吧), 就可以執行這些程式了. 同樣的方法, 並非只有 USB 隨身碟可以使用, 也可以使用在 USB 的硬碟機上頭. 剛好公司這幾天也發給我一個 WD 2.5〞 160G 的 USB 硬碟來備份我的筆記型電腦 (老闆的電腦硬碟壞了一次怕到了, 給每個主管都配一個小硬碟來備份資料), 同樣使用 grub4dos, 把這些軟體都複製過去, 一樣可以拿來開機使用.

※在 grub4dos 0.4.3 2007/11 之後的版本, 也支援直接由 .iso 的檔案中開機, 例如我們有個 ftool_203.iso, 可以用下面的方式來開機:

title FTool 2.0.3
map --mem (hd0,0)/ftool/ftool_203.iso (hd32)
map --hook
chainloader (hd32)
boot

只要指定 hd32 或更大的數字, 就表示該 image 是一個 ISO 9660 的光碟檔, 這樣子就可以了 (不過載入動作很慢, 就算是小檔案, 也要等一段不算短的時間, 檔案如果不小… 會有機器不動了的感覺). 不過, 如果你的系統是在光碟開機載入核心之後, 還會用到光碟的內容, 可能就會有問題 (以 NoN XPE 來說, 載入核心後會找不到 OUTTOOL 的檔案, 所以除了內建在核心的軟體外, 在 OUTTOOL 的程式不會出現).

※原本公司配的那個 WD 160G 的外接硬碟是用 FAT32 格式的, 後來在備份某些 .iso 檔案時, 發現大於 4G 不支援, 就轉成 NTFS 格式了.
不過 grub4dos 照樣可以使用, 上頭說的只有 DOS 開機的那部份無法使用, 不過利用 .img 的磁碟檔來模擬軟碟機也可以達到 DOS/WIN98 開機的動作. 如果使用新的版本, 更可以利用 .iso 來開機.
只不過 DOS 開機後, 沒有外加程式的話, 無法讀寫 NTFS 的資料, 不過... 這樣的需求不多, 如果真有需求, 也有免費的 NTFS4DOS (Avira 的免費版本, 就是 AntiVir 那家公司出的) 可以使用.