透過 grub2 來製作 Multiboot 的 LiveUSB
現在大部分的 Linux Distribution 都有提供 Livecd 的服務,但每次都要燒成 CD 或 DVD 也太不環保了,所以就想說使用 LiveUSB 來減少麻煩。但如果一個 USB 單單作為一套 Linux Distribution 的 LiveUSB 又覺得很浪費,因為一片 CD 才 600、700 MB,但 USB Disk 動不動都 8G、16G 了,所以就想說一個 Disk 多裝一些 Distribution 的 Livecd。於是就有了這篇文章。所有的動作皆在 Linux 環境完成(實驗環境:Ubuntu 10.04)。
- 準備隨身碟。(廢話)
- 將隨身碟接到電腦後 umount(這是因為一般的電腦會 auto-mount,不 umount 無法重新格式化)
- 刪除現有的 partition,建立一全新的 partition。
- 將這個 partition 設為 bootable。
- 格式化。
- sudo grub-install --root-directory=/media/XXX /dev/sdx
其中大部分的步驟都可以用圖形介面的工具完成,如 Disk Utility,所以就不寫下 fdisk 的指令了(要用在查)。這樣就把 grub2 安裝好了。
接下來就是要設定 grub2 了。grub2 的設定檔為 /boot/grub/grub.cfg,其實 grub2 很不希望人家直接編輯 grub2 的設定檔!理論上,應該要透過 /etc/grub.d/40_custom 上新增自己的選項,然後透過 update-grub 來進行更新。不過誰理他 :p (其實也不是不理它,只是它預設會更改系統上的 grub2,要如何指定到 USB 上面的 grub 我懶的去查,所以還是懶 ...)。附帶一提,grub2 可以偵測系統內所有的作業系統,自行產生相對應的 menu,指令如下: os-probe。
下面是我的 grub.cfg
=====================================
set timeout=30
set default=0
insmod ext2
set root='(hd0,1)'
search --no-floppy --fs-uuid --set 869dc9c7-1b52-44d7-9e89-9a0e0f346939
這部份是根據 USB disk 的 UUID 來進行搜尋,要尋找 UUID 可以透過 ll /dev/disk/by-uuid/ 來查詢。
if loadfont /boot/unicode.pf2 ; then
set gfxmode=640x480
insmod gfxterm
insmod vbe
if terminal_output gfxterm ; then true ; else
terminal gfxterm
fi
fi
set locale_dir=($root)/boot/grub/locale
set lang=zh_TW
insmod gettext
insmod png
background_image /boot/LiveUSB.png
設定背景
設定背景
set menu_color_normal=blue/black
set menu_color_highlight=red/black
menuentry "Run Ubuntu Live ISO 11.10" {
set root='(hd0,1)'
search --no-floppy --fs-uuid --set 869dc9c7-1b52-44d7-9e89-9a0e0f346939
set isofile="/boot/isos/ubuntu-11.10-desktop-amd64.iso"
loopback loop $isofile
linux (loop)/casper/vmlinuz file=/cdrom/preseed/ubuntu.seed boot=casper persistent iso-scan/filename=$isofile noprompt splash
initrd (loop)/casper/initrd.lz
}
menuentry "Run Lubuntu Live ISO 11.10" {
set root='(hd0,1)'
search --no-floppy --fs-uuid --set 869dc9c7-1b52-44d7-9e89-9a0e0f346939
set isofile="/boot/isos/lubuntu-11.10-desktop-amd64"
loopback loop $isofile
linux (loop)/casper/vmlinuz file=/cdrom/preseed/ubuntu.seed boot=casper persistent iso-scan/filename=$isofile noprompt splash
initrd (loop)/casper/initrd.lz
}
menuentry "Run Fedora 16 Desktop" {
set root='(hd0,1)'
linux /boot/isos/Fedora16/isolinux/vmlinuz0 root=UUID=869dc9c7-1b52-44d7-9e89-9a0e0f346939 rootfstype=auto ro liveimg quiet rhgb live_dir=/boot/isos/Fedora16/LiveOS/
initrd /boot/isos/Fedora16/isolinux/initrd0.img
}
menuentry "Run Clonezilla Live 1.2.8-46" {
set root='(hd0,1)'
search --no-floppy --fs-uuid --set 869dc9c7-1b52-44d7-9e89-9a0e0f346939
set isofile="/boot/isos/clonezilla-live-1.2.8-46-amd64.iso"
loopback loop $isofile
linux (loop)/live/vmlinuz boot=live live-config noswap nolocales edd=on nomodeset ocs_live_run=\"ocs-live-general\" ocs_live_extra_param=\"\" ocs_live_keymap=\"NONE\" ocs_live_batch=\"no\" ocs_lang=\"\" vga=791 ip=frommedia nosplash toram=filesystem.squashfs findiso=$isofile
initrd (loop)/live/initrd.img
}
menuentry "Win7PE" --class windows --class os {
set root='(hd0,1)'
ntldr /boot/win7pe.bin
}
menuentry "Boot from HD (Linux)" {
set root='(hd1)'
insmod chain
chainloader +1
}
menuentry "Boot from HD (Windows)" --class windows --class os{
set root='(hd1,msdos1)'
insmod chain
insmod part_msdos
insmod ntfs
chainloader +1
}
menuentry "Memory test (memtest86+)" {
insmod ext2
set root='(hd0,1)'
linux16 /boot/memtest86+.bin
}
menuentry "Reboot" {
reboot
}
=====================================
幾個注意事項:
幾個注意事項:
- 要如何知道關於某個 livecd 的 menuentry 要如何撰寫呢?可以將 livecd mount 後,看看它是如何執行的,再照抄即可。
- Fedora 的 Livecd 有點問題,所以並需要解開後放入磁碟中,無法直接由光碟映像檔開機。
參考資料:
留言
張貼留言