透過 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)。

  1. 準備隨身碟。(廢話)
  2. 將隨身碟接到電腦後 umount(這是因為一般的電腦會 auto-mount,不 umount 無法重新格式化)
  3. 刪除現有的 partition,建立一全新的 partition。
  4. 將這個 partition 設為 bootable
  5. 格式化。
  6. 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
}

=====================================

幾個注意事項:

  1. 要如何知道關於某個 livecd 的 menuentry 要如何撰寫呢?可以將 livecd mount 後,看看它是如何執行的,再照抄即可。
  2. Fedora 的 Livecd 有點問題,所以並需要解開後放入磁碟中,無法直接由光碟映像檔開機。
參考資料:

留言

這個網誌中的熱門文章

我弟家的新居感恩禮拜分享:善頌善禱

Openssl 範例程式:建立SSL連線

如何利用 Wireshark 來監聽 IEEE 802.11 的管理封包