1. 程式人生 > >ubuntu中載入程式grub的配置問題

ubuntu中載入程式grub的配置問題



在ubuntu10.04中,啟動選單是由/boot/grub/grub.cfg檔案決定的。開啟該檔案,在此檔案的開頭可以看見這樣一句話# it is automatically generated by /usr/sbin/grub-mkconfig using templates from /etc/grub.d and setting from /etc/default/grub。這句話的大致意思是,/boot/grub/grub.cfg是通過 /etc/grub.d 作為模板、/etc/default/grub 作為配置,被 grub-mkconfig 命令自動生成的。在我之前發表的ubuntu10.04核心升級博文中所說的自動設定grub方法,即執行update-grub命令,本質上就是根據/etc/default/grub配置檔案,用grub-mkconfig命令自動生成的。那麼怎麼修改配置檔案呢?下圖是/etc/default/grub檔案中常用的變數:

ubuntu <wbr>10.04 <wbr>grub設定

其中的GRUB_DEFAULT表示預設的選單項,各啟動選單的選單號是從0開始依次加1的。

GRUB_HIDDEN_TIMEOUT=0被#註釋掉後,系統在啟動時會顯示所有的啟動選單。

GRUB_TIMEOUT 為引導項列表自動選擇超時時間。

根據自己的需要設定好這些變數以後,必須執行update-grub命令,這些配置引數才會更新到/boot/grub/grub.cfg檔案中。

我在虛擬機器中用這種方法進行grub配置以後,重啟,系統在啟動升級核心的時候,顯示:VFS:Unable to mount fs on unknown-blocking(0,0),然後無法進入系統。這個錯誤一般都是因為找不到記憶體盤ramdisk的映象檔案。於是,我從原來版本的ubuntu核心進入系統,開啟/boot/grub/grub.cfg檔案,看到update後的該檔案的升級核心選單項:

menuentry 'UbuntuLinux 2.6.34.11' --class ubuntu --class gnu-linux --class gnu --class os {

recordfail

insmod ext2

set root='(hd0,1)'

search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427

linux /boot/vmlinuz-2.6.34.11 root=/dev/sda1 ro   quiet splash

}

我們只需加上一個initrd項(粗體顯示),修改後的升級核心選單項為:

menuentry 'UbuntuLinux 2.6.34.11' --class ubuntu --class gnu-linux --class gnu --class os {

recordfail

insmod ext2

set root='(hd0,1)'

search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427

linux /boot/vmlinuz-2.6.34.11 root=/dev/sda1 ro   quiet splash

initrd /boot/initrd-linux2.6.34.11

}

其中,initrd項就是指定記憶體盤ramdisk映象檔案路徑。

PS:在新增initrd項之前,要先修改/boot/grub/grub.cfg的讀寫許可權,才能對該檔案進行修改。修改儲存之後,新核心就能夠正常啟動啦啦啦~

另一種方法是手動更改/boot/grub/grub.cfg檔案,開啟該檔案:

# DO NOT EDIT THIS FILE## It is automatically generated by /usr/sbin/grub-mkconfig using templates# from /etc/grub.d and settings from /etc/default/grub#

### BEGIN /etc/grub.d/00_header ###if [ -s $prefix/grubenv ]; then load_envfi

#該default設定系統預設的選單項set default="0"if [ ${prev_saved_entry} ]; then set saved_entry=${prev_saved_entry} save_env saved_entry set prev_saved_entry= save_env prev_saved_entry set boot_once=truefi

function savedefault { if [ -z ${boot_once} ]; then saved_entry=${chosen} save_env saved_entry fi}

function recordfail { set recordfail=1 if [ -n ${have_grubenv} ]; then if [ -z ${boot_once} ]; then save_env recordfail; fi; fi}insmod ext2set root='(hd0,1)'search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427if loadfont /usr/share/grub/unicode.pf2 ; then set gfxmode=640x480 insmod gfxterm insmod vbe if terminal_output gfxterm ; then true ; else # For backward compatibility with versions of terminal.mod that don't # understand terminal_output terminal gfxterm fifiinsmod ext2set root='(hd0,1)'search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427set locale_dir=($root)/boot/grub/localeset lang=zhinsmod gettextif [ ${recordfail} = 1 ]; then set timeout=-1else

#此處的timeout設定選單項顯示時間 set timeout=10fi### END /etc/grub.d/00_header ###

### BEGIN /etc/grub.d/05_debian_theme ###set menu_color_normal=white/blackset menu_color_highlight=black/light-gray### END /etc/grub.d/05_debian_theme ###

### BEGIN /etc/grub.d/10_linux ###

#以下幾個menuentry都是啟動選單menuentry 'Ubuntu, with Linux 2.6.32-21-generic' --class ubuntu --class gnu-linux --class gnu --class os { recordfail insmod ext2 set root='(hd0,1)' search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427

#linux後的粗體路勁為核心映象檔案 linux /boot/vmlinuz-2.6.32-21-generic root=UUID=2e78226c-16d3-4da2-a35a-77e2146d6427 ro quiet splash

#initrd後的粗體檔案為記憶體盤ramdisk映象檔案 initrd /boot/initrd.img-2.6.32-21-generic}menuentry 'Ubuntu, with Linux 2.6.32-21-generic (recovery mode)' --class ubuntu --class gnu-linux --class gnu --class os { recordfail insmod ext2 set root='(hd0,1)' search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427 echo 'Loading Linux 2.6.32-21-generic ...' linux /boot/vmlinuz-2.6.32-21-generic root=UUID=2e78226c-16d3-4da2-a35a-77e2146d6427 ro single echo 'Loading initial ramdisk ...' initrd /boot/initrd.img-2.6.32-21-generic}### END /etc/grub.d/10_linux ###

### BEGIN /etc/grub.d/20_memtest86+ ###menuentry "Memory test (memtest86+)" { insmod ext2 set root='(hd0,1)' search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427 linux16 /boot/memtest86+.bin}menuentry "Memory test (memtest86+, serial console 115200)" { insmod ext2 set root='(hd0,1)' search --no-floppy --fs-uuid --set 2e78226c-16d3-4da2-a35a-77e2146d6427 linux16 /boot/memtest86+.bin console=ttyS0,115200n8}### END /etc/grub.d/20_memtest86+ ###

#下面的從“### BEGIN /etc/grub.d/30_os-prober ###”到“### END /etc/grub.d/30_os-prober ###”之間的內容如果註釋掉,啟動過程才會顯示各啟動選單。如果不註釋掉,啟動過程是不會顯示各啟動選單的。

### BEGIN /etc/grub.d/30_os-prober ###if [ ${timeout} != -1 ]; then if keystatus; then if keystatus --shift; then set timeout=-1 else set timeout=0 fi else if sleep --interruptible 3 ; then set timeout=0 fi fifi### END /etc/grub.d/30_os-prober ###

### BEGIN /etc/grub.d/40_custom #### This file provides an easy way to add custom menu entries. Simply type the# menu entries you want to add after this comment. Be careful not to change# the 'exec tail' line above.### END /etc/grub.d/40_custom ###
OK,瞭解了這些,我們就可以根據自己需要新增啟動選單,設定grub參量了。