2012年11月26日星期一

製作 GRUB2 Live Boot

GRUB2 是一種多重啟動的強大引導器
GRUB2 還可以即時編寫 GRUB 指令或修改 menuentry
燒錄在光碟或獨立於另一個磁碟裝上的 GRUB2 可以啟動因 MBR 被破壞而不能起動的作業系統

自製 GRUB2 除了安裝 grub2 還需要安裝 Xorriso
可以執行
sudo apt-get install xorriso
來安裝 Xorriso
再利用
grub-mkrescue --output=grub2.iso
便可以製作最簡單的 GRUB2
然後可燒錄成光碟或利用 Portable Drive boot 機
由於 GRUB2 沒有任何 menuentry 會自動設定至 GRUB2 command mode ,使用者便可以自行編製啟動程序




雖然 GRUB2 並非難編寫,但完全只使用 command mode 進行啟動需要具備充足的 GRUB2 認識
因此通常會自製設定檔,方便操作
自訂設定檔還可以透過 ISO boot (參考在下的文章) 將 ISO 存放在於自製的 GRUB2 Live Boot 中
製作成多系統安裝光碟或 Portable Drive
先建立 fakeroot/boot/grub 並在目錄 fakeroot/boot/grub 建立 grub.cfg
fakeroot 並非指定名稱,只是方便製作 GRUB2 Live Boot 時的虛擬根目錄
fakeroot/boot/grub 是根據 Linux 的 /boot/grub 所製訂的啟動目錄
fakeroot/boot/grub/grub.cfg 是 GRUB2 Live Boot 的設定檔
利用
grub-mkrescue --output=grub2.iso fakeroot
便可以將 fakeroot 中的資料參照目錄結構,寫入至 GRUB2 Live Boot 中

讓 GRUB2 Live Boot 的選單人性化,最簡單的方法就是複製 Linux 原來的 GRUB2 加以修改
但原來的 GRUB2 設定檔結構非常繁複,因此在下將 GRUB2 設定檔的主要功能抽出,其他功能都刪除
insmod part_msdos
insmod ext2
set root=(cd)
loadfont /boot/theme/unicode.pf2
set gfxmode=1024x768

insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
insmod gfxterm
insmod part_msdos
insmod ext2
set root=(cd)
insmod gettext
terminal_output gfxterm
set default=0
set timeout=10

insmod part_msdos
insmod ext2
set root=(cd)
insmod png
background_image /boot/theme/splash.png
set menu_color_normal=white/black
set menu_color_highlight=blue/green
這是 GRUB2-1.99+ 的寫法
有幾個位置需要主意
  1. set root=(cd)
    這是 GRUB2-1.99+ 的 ISO 燒錄至光碟,GRUB2 直接視光碟機為 (cd)
    若是 GRUB2-1.98- 的 ISO 燒錄至光碟,GRUB2 會將光碟機編為 (hd96) ,代號 96 是因為 GRUB2 將光碟機視為記憶體
    不管 GRUB2 的版本,將 GRUB2 ISO 存放至 Portable Drive 便要指定 Drive 及 Partition 代號,如 hd2,msdos1
    但即是不使用 set root=(cd) 的情況下,GRUB2 預設的 root 為媒體本身
    即是不管理使用 GRUB2-1.99+ / GRUB2-1.98- / Portable Drive , GRUB2 會自動選擇自己
    但當需要改變 root 時而使用並不清楚 GRUB2 對於媒體的代號時,仍可於 GRUB2 command 輸入 ls 來查自媒體代號
  2. loadfont /boot/theme/unicode.pf2
    預設的 GRUB2 並沒有提供 unicode 字體,若果清單有 unicode 文件,便會變成亂碼
    要讓 GRUB2 顯示 unicode 便需要讓 GRUB2 載入具 unicode 字形的字形檔,利用 loadfont /path/to/file 載入字形檔
    Linux 預載的 GRUB2 使用 Linux 的 /usr/share/grub/unicode.pf2
    簡單地將 /usr/share/grub/unicode.pf2 複製至 fakeroot 中載該檔案便可以使用
  3. background_image /boot/theme/splash.png
    background_image 就是載入清單背景
    與 loadfont 一樣,可以將圖像存放於 fakeroot 中載該檔案便可以使用
    但留意圖像格式
    格式為 png 需要使用 insmod png 載入 png 模組
    格式為 jpe, jpeg, jpg 需要使用 insmod jpeg 載入 jpeg 模組
    格式為 tga 需要使用 insmod tga 載入 tga 模組
    tga 為 GRUB 能接受的圖像格式,但由於現在能使用 png, jpeg 模組,tga 於 GRUB2 已經甚少使用
    並非 tga 的質量不高,或體積過大,而是一般圖像瀏覽器不一定能夠開啟




根據需要編製 menuentry
menuentry "Reboot" {
    reboot
}

menuentry "Shutdown" {
    halt
}
基本的 GRUB2 指令,reboot 為 重新啟動電腦, halt 為關閉電腦

menuentry "Ubuntu 12.10 32-bit Live" {
    insmod part_msdos
    insmod ext2
    set root=(cd)
    file=/boot/iso/ubuntu-12.10-32bit.iso
    loopback loop $file
    set root=(loop)
    linux /casper/vmlinuz iso-scan/filename=$file root=/ boot=casper ro quiet splash noprompt # GUI
#    linux /casper/vmlinuz iso-scan/filename=$file root=/ boot=casper ro single noprompt # CLM
    initrd /casper/initrd.lz
}
載入 Ubuntu 發行版或以 Ubuntu 衍生的發行版

menuentry "GParted 0.14.0 Live" {
    insmod part_msdos
    insmod ext2
    set root=(cd)
    file=/boot/iso/gparted-0.14.0-live.iso
    loopback loop $file
    set root=(loop)
    linux /live/vmlinuz findiso=$file union=aufs boot=live toram=filesystem.squashfs config noswap noprompt
    initrd /live/initrd.img
}
載入 GParted ISO

menuentry "Memory Test 86+" {
    insmod part_msdos
    insmod ext2
    set root=(cd)
    loopback loop /boot/iso/ubuntu-12.10-32bit.iso
    set root=(loop)
    linux16 /install/mt86plus
}
借用 Ubuntu 的 /install/mt86plus 執行 Memory Test 86+

menuentry "Chainload Bootloader in First Harddisk" {
    insmod part_msdos
#    insmod ntfs
    set root=(hd0)
    chainloader +1
}

menuentry "Chainload Bootloader in First Harddisk First Partition" {
    insmod part_msdos
#    insmod ntfs
    set root=(hd0,msdos1)
    drivemap -s (hd0) $root
    chainloader +1
}
將啟動程序交給另一個啟動器,如 Windows 的 NTLDR

menuentry "Chainload GRUB2 in First Harddisk First Partition" {
    insmod part_msdos
    insmod ext2
    set root=(hd0,msdos1)
    multiboot /boot/grub/core.img
}
將啟動程式交給另一個 GRUB2 啟動器

2 則留言 :

  1. 請問一下,若是要加上簡單的密碼(只是讓不太懂電腦的普通使用者不要隨便亂按)該如何設定?謝謝呢。

    回覆刪除
  2. 要用 password 保護 menuentry
    可以係 grub.cfg 加上
    #
    set superusers="user1"
    password user1 password1
    #
    #
    #
    menuentry "some-bootable-device" --user user1{
    # do something
    }
    那麼若果需要啟動 some-bootable-device menuentry 時
    便需要輸入 user1 的 password 即 password1

    如果你忘記了 password 可以到 grub2 command
    利用 cat 指令取回 grub.cfg 中的文件內容
    因此這種方法只能防護不懂使用 grub2 command 的使用者
    對資深使用者並沒有意義

    回覆刪除