自制開機menu組態

GRUB的multi-boot環境取決於os-prober,也就是在『grub-install』執行以後,GRUB會探測你目前有多少種的kernel和其他作業系統然後幫你輸出到『grub.cfg』裡。

除了Linux和Hurd以外,GRUB2也支援像是FreeBSD,NetBSD和OpenBSD等等的作業系統,並且只要你的作業系統是用multiboot規格去編譯的話,也都可以用GRUB2來開機。

這個章節來介紹一下,怎麼自製簡單組態,第一個『Linux』的例子,是直接自制『grub.cfg』,而其它的例子則是加到『/etc/grub.d/40_custom』底下,然後在用命令『update-grub』產生『grub.cfg』。

如果要將自制的menu加到『40_custom』裡面,框架需如下:

menuentry "Some title here" {
<Some data>
}

(底下的所有例子,請自行將磁碟和partition的數據換成你的,當然還有UUID也要記得換)

Linux

根據章節『Making a GRUB bootable CD-ROM』的步驟,先建立相關資料夾,安裝grub,然後在掛載起來的路徑『/mnt/boot/grub/』底下建立一個『grub.cfg』,內容如下:

menuentry "my Ubuntu 16.04" {
        set root=(hd0,msdos1)
        linux /vmlinuz root=UUID=8c9eb01d-b58b-4e19-acdb-e1028004a637
        initrd /initrd.img
}

然後在將grub給安裝到目錄下後,將以上的所有內容給建立救援映像檔:

grub-mkrescue -o grub.iso iso

接下來將這個映像檔給掛載起來以後重開機,直接看到以下畫面: 按『e』看一下裡面的內容如下: 然後直接按『F10』應該就沒問題可以直接開機了。

FreeBSD

GRUB2可以使用命令『kfreebsd』來啟動FreeBSD kernel,流程的話如下:

1.設定FreeBSD kernel所在的partition

set root=(/dev/ad4,msdos1)

2.讀取kernel

kfreebsd /boot/kernel/kernel

3.讀取 kernel boot information

kfreebsd_loadenv /boot/device.hints

4.設定 root裝置的路徑

set kFreeBSD.vfs.root.mountfrom=ufs:/dev/ad4s1a

5.設定file-system的options

vfs.root.mountfrom.options=rw

6.最後,以剛剛的kernel和root file-system啟動

boot

如果想要使用自制的『grub.cfg』的話,可以拿下面這個例子來加在你的『/etc/grub.d/40_custom』裡面在加以修改:

menuentry "FreeBSD 8.0 direct" {
        insmod ufs2
        set root='(/dev/ad4,msdos1)'
        search --no-floppy --fs-uuid --set 4c0029f407b3cd1d
        kfreebsd /boot/kernel/kernel
        kfreebsd_loadenv /boot/device.hints
        kfreebsd_module /boot/splash.bmp type=splash_image_data
        set kFreeBSD.vfs.root.mountfrom=ufs:ad4s1a
}

不確定你的UUID的話,可以用以下指令:

ls (hd0,1)

如果你想要傳遞參數給FreeBSD bootloader的option的話(/boot/loader.conf),可以直接使用『set』命令,如下面例子:

# 強制叫kernel等USB出現
set kFreeBSD.kern.cam.boot_delay="10000"

在修改好你的客製化menu以後,接下來下一步就是在檔案『/etc/default/grub』裡面將『os_prober』關掉,並且更新組態:

GRUB_DISABLE_OS_PROBER=true

最後記得『update-grub』。

NetBSD

GRUB2可以使用命令『knetbsd 』來啟動NetBSD kernel,流程的話如下:

1.設定NetBSD kernel所在的partition,如果你的NetBSD是安裝在第一個disk的第一個partition的話

set root=(hd0,msdos1)

2.讀取kernel並且指定root裝置的路徑

knetbsd /netbsd --root=wd0a

3.啟動kernel

boot

一樣,如果想要使用自制的『grub.cfg』的話,可以拿下面這個例子來加在你的『/etc/grub.d/40_custom』裡面在加以修改:

menuentry "NetBSD on sda1" {
        insmod ufs2
        set root=(hd0,msdos1)
        knetbsd /netbsd --root=wd0a
}

在修改好你的客製化menu以後,接下來下一步就是在檔案『/etc/default/grub』裡面將『os_prober』關掉,並且更新組態:

GRUB_DISABLE_OS_PROBER=true

最後記得『update-grub』。

Generic Multi-Boot

想要啟動一個multi-boot相容的kernel,你在讀取kernel時,必須要用命令『multiboot』來讀取,有個例子可以讓你練習一下,先下載『Grub Invaders』,然後解壓縮放到路徑『/boot』。接下來執行下面兩個步驟,沒意外的話你就會看到『invaders』已經被啟動了。

1.讀取Grub invaders

multiboot /boot/invaders/invaders

2.啟動

boot

Chain Loading

如果想要使用FreeBSD,NetBSD或是Windows的boot程式的話,也可以使用chainloading來指定特定的partition。通常一般的entry會像這樣:

menuentry "FreeBSD"{
    set root=(hd0,msdos1)
    chainloader +1
}

而如果你有兩個版本以上的Ubnutu或是多種的作業系統安裝的話,最好就不要使用chainloading,而是要在『/etc/grub.d/40_custom』加入像底下這樣子的entry:

menuentry "Yet another distro/installation/encrypted Ubuntu installation/..." { 
               set root=(hd0,msdosX) 
               configfile /boot/grub/grub.cfg 
}

上面這個例子,如果你的目標作業系統的『/boot』是在『/dev/sda5』的話,那那個X就會是5,並且使用『configfile』來切換會比使用『multiboot』來的好,因為在Ubuntu 12.04時,multiboot通常會指到『/boot/grub/core.img』,但是在14.04以後『core.img』的位置換到了『/boot/grub/i386-pc/core.img』,所以如果使用multiboot時,系統會有可能混亂。

在修改好你的客製化menu以後,接下來下一步就是在檔案『/etc/default/grub』裡面將『os_prober』關掉,並且更新組態:

GRUB_DISABLE_OS_PROBER=true

最後記得『update-grub』。

Others

底下在多三個Ubuntu官方給的案例當參考:

1.第一個為硬碟(sda8上)版本的系統救援CD

menuentry "System Rescue CD" {
    set root=(hd0,8)
    linux /sysrcd/rescuecd subdir=sysrcd setkmap=us
    initrd /sysrcd/initram.igz
}

2.簡單的Windows7 chain load

menuentry "Windows 7" {
    insmod ntfs
    set root='(hd0,1)'
    search --no-floppy --fs-uuid --set a3f1ea41fc67a3f1
    chainloader +1
}

3.chainloading到其它的GRUB bootloader

menuentry "Grub 1 Bootloader" {
    set root=(hd0,8)
    chainloader +1
}

results matching ""

    No results matching ""