2008年3月5日 星期三

GRUB(GNU GRand Unified Boot loader)

GRUB(GNU GRand Unified Boot loader)
前言:
GRUB 的載入可以分為三個階段 stage1,stage1.5 和 stage2
1.BIOS 會將硬碟的 MBR( 前512 bytes的開機管理程式)讀進記憶體中.這就是第一階段 (stage1) 他將有能力繼續做stage1.5以及stage2.
2.第一點五階段 (stage1.5) 會去找尋我的系統上 /boot 磁區.並且讀取 /boot 磁區上一些相關資料,所以此時已可以認識filesystem.
3.第二階段 (stage2) 會顯示 GRUB menu 以及 command 環境.GRUB的使用者介面允許使用者選取作業系統核心或將伊些參數傳給核心(kernel).
4.第二階段 (stage2) 會等待使用者選取一個作業系統核心(kernel 和 initrd)並將他讀入記憶體中.接下來就將控制權交由作業系統管理了.

GRUB 設定
#cat /etc/boot/grub/grub.conf
--------------------------------------------------------------------------------------------------
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You do not have a /boot partition. This means that
# all kernel and initrd paths are relative to /, eg.
# root (hd0,1)
# kernel /boot/vmlinuz-version ro root=/dev/hda2
# initrd /boot/initrd-version.img
#boot=/dev/hda
default=0
timeout=10
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.
splashimage=(hd0,1)/boot/grub/splash.xpm.gz

#for console system from serial port
#serial = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
title Red Hat Linux (2.4.18-3)
root (hd0,1)
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 #console=ttyS1,9600 #for console system from serial port
initrd /boot/initrd-2.4.18-3.img
title Win2000
rootnoverify (hd0,0)
chainloader +1
--------------------------------------------------------------------------------------
說明:
I.預設開機選項,每個 title 代表一項開機選單 (而這裡 0 代表 RedHat Linux,1 代表 Win2000 )
default=0

II.開機選單等待時間(10表示10秒)
timeout=10

III.GRUB 密碼,詳細設定請看"註"說明
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.

IV.選單的背景圖示,詳細設定請看"註"說明
splashimage=(hd0,1)/boot/grub/splash.xpm.gz

V.開機選單
title Red Hat Linux (2.4.18-3)

VI.設定 H.D 的 root paraition 所在位置.
第一個參數是開機 H.D BIOS setting 中的硬碟開機順序,不管是 IDE 或 SCSI H.D 皆是 hdx (x 是依據 BIOS setting 中的硬碟開機順序,0:第一顆,1:第二顆...........依序下去,這裡是設定成第一顆 H.D)
第二個參數就是開機 H.D root 的 partition (0:第一個 partition ,1:第二個 partition ...........依序下去)
root (hd0,1)
這個順序其實是參考了 /boot/grub/device.map 檔案
#cat /boot/grub/device.map
#this device map wasgenerated by anaconda
(fd0) /dev/fd0
(hd0) /dev/hda


VII.kernel,ramdisk 所在位址
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2
initrd /boot/initrd-2.4.18-3.img

VIII.其他非 Linux 開機選單
title Win2000
不同於 root ,它並不會先驗證檔案系統
rootnoverify (hd0,0)
用來載入 Microsoft 的作業系統(如:DOS,Windows...)
chainloader +1

IVV.將開機以及核心信息轉向至 ComPort 來輸出,詳細設定請看"註"說明
serial = 1,9600n8 (ttyS1, 9600 bd, no parity, 8 bits)
或者
serial --unit=1 --speed=9600 --word=8 --parity=no --stop=1
terminal --timeout=10 serial console
當然核心這邊也要加入參數才能將信息轉向至 ComPort
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 console=ttyS1,9600

kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 console=ttyS1,9600n8

註:
1.GRUB 設定檔
GRUB 設定檔是寫入就立即生效,不須像LILO需再回寫至MBR.
除非GRUB本來就不存在MBR,此時就要下指令
#grub-install /dev/hda
回寫至MBR
當我們的 H.D 裝置順序有誤錯時.要先修改 /boot/grub/device.map 檔案中硬碟的順序.
#cat /boot/grub/device.map
#this device map wasgenerated by anaconda
(fd0) /dev/fd0
(hd0) /dev/hda
請確定你要安裝的 GRUB 的 H.D 順序在 hd0
或者在使用 grub-install 加上參數--recheck
#grub-install --recheck /dev/hda

2.安裝系統後設定GRUB的密碼
GRUB的密碼是經過MD5的加密所以無法在grub.conf直接設定
所以有個指令用來幫我們的將密碼以MD5加密的方式呈現
#grub-md5-crypt
將加過密的密碼寫到/boot/grub/grub.conf檔,類似如下
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.
設password對於一般boot選項是不會有差異的
如果你要對 boot 選項加參數,如進入signal user mode 時必須鍵入密碼,才能對 boot 選單加參數
就如同 lilio.conf 設定檔加入 restricted 一樣

3.GRUB 如何進入signal mode
在GRUB選單鍵入p打密碼(沒有設定密碼就不需要了),鍵入e 進行編輯,在kernel 選單鍵入e 進行編輯,後面再加 1(signal mode),2,3(level 3for text mode),5(level 5 for Xwindow) 等參數進入不同的runlevel.鍵入b去啟動系統

4.修改GRUB 的背景圖
看過 grub.conf 設定檔的會發現 splashimage=(hd0,1)/boot/grub/splash.xpm.gz 這一段設定,將他解開就是所們所看到的圖示了.所以我們也可以將自己的圖壓縮後覆蓋原先的 /boot/grub/splash.xpm.gz
方法如下:
grub 的背景圖是一張640x480.14色的xpm 檔案.準備好一張640x480 大小的圖,拿到Linux 用Gimp 編輯一下.我們要用gimp 把它存成14色並轉成xpm 檔案格式.首先最有問題的就是怎麼存成14色,我們用Gimp 打開圖片,對著圖片按右鍵「圖像」-->「模式」-->「索引色…」選下去,會跳出一個視窗…在視窗最上面有一個「產生最優它的調色盤」,後面有你目前圖片的顏色數,把你的顏色數改成14,然後按下「確定」. 這樣就完成更改成14色了.改好顏色之後的存檔,對著圖片按右鍵「檔案」-->「另存新檔…」會跳出視窗,視窗下方的「決定檔案類型」請按下選項…選擇「Xpm」.然後「確定」.圖檔即成.
再來改grub.conf 找出splashimage=(hd0,1)/grub/splash.xpm.gz
其中(hd0,1)指的就是你的/boot 目錄,所以預設圖檔位置是/boot/grub/splash.xpm.gz,假設我把圖檔放在/boot/xpm/phoenix.xpm 這個檔,我就把該行改成splashimage=(hd0,1)/xpm/phoenix.xpm 存檔離開,重開就行了.
note: splashimage 的圖檔可壓縮也可不壓縮,預設是一幅壓縮的圖檔,這裡的範例是使用不壓縮比較簡單.如果要壓縮,指令是gzip -9 xxx.xpm,然後就會變成xxx.xpm.gz 的壓縮圖檔了.壓縮後檔案大小大約只有原來的三分之一.

5.開機以及核心信息轉向
1. 安裝完你的作業系統
2.修改你的 BIOS(如果你的有支援 ) BIOS Redirection Port to [Serial 1 or Serial 2]
3. 還又修改你的 /boot/grub/grub.conf
default=0
timeout=10
#splashimage=(hd0,1)/boot/grub/splash.xpm.gz
serial --unit=0 --speed=19200
terminal --timeout=15 serial console
title linux
root (hd0, 0)
kernel /vmlinuz ro root=/dev/hda3 console=ttyS0,19200,vt100 #or ttyS1
initrd /initrd.img
其中黑色粗體字就是要加的設定.
這三行和GRUB輸出有關
#splashimage=(hd0,1)/boot/grub/splash.xpm.gz 因為文字模式下無法顯示任何圖片,所以要將這一行刪除或者註記(#)
serial --unit=1 --speed=19200
--unit 決定你的資料要從哪一個 comport 出去,unit=0(/dev/ttyS0),unit=1(/dev/ttyS1)
--speed 決定了傳輸速度
下面還有其他的參數可使用
--word=8 傳輸字元可以為7或8 bits
--parity =no 需要同位元檢查的就選 yes
--stop=1 需要停止位元就選 1
terminal --timeout=15 serial console
接下來這一行就會將 kernel 的訊息輸出至 comport
kernel /vmlinuz ro root=/dev/hda3 console=ttyS0,19200,vt100

4. 系統預設不能使用 comport 來登入系統 ,所以要修改一下 /etc/inittab, :
# Run gettys in standard runlevels
co:2345:respawn:/sbin/agetty ttyS0 19200 vt100
c1:2345:respawn:/sbin/agetty ttyS1 19200 vt100
1:2345:respawn:/sbin/mingetty tty1
2:2345:respawn:/sbin/mingetty tty2
3:2345:respawn:/sbin/mingetty tty3
4:2345:respawn:/sbin/mingetty tty4
5:2345:respawn:/sbin/mingetty tty5
6:2345:respawn:/sbin/mingetty tty6
加入黑色粗體的來允許系統能使用 comport 登入系統

5. 由於 PAM 的限制所以 root 無法使用 comport 登入系統 ,所以還是要修改一下 /etc/securetty:
ttyS0
ttyS1

6. 接下來要將 Null Modem 接在兩方的電腦, Linux 重新開機就可以不需要螢幕.所有的資料都將透過 comport 來傳送.

6.OS無法開機
當安裝完OS重開機時有時只會看到GRUB的提示字元就停住了,這有可能是不小心把grub裝錯硬碟,這時只能使用原光碟機開機來進行修復,如果還能進到 GRUB 本身提供bash like的操作介面,我們可以先手動將OS開起來再修改相關的設定
GRUB開機有4個步驟
I.指定磁碟機及分割區
#root (hd0,0)
II.指定開機核心及root file system
#kernel root=LABEL=/
III.載入initrd
#initrd
IV.執行開機
#boot
開機以後再修改grub相關設定
由於GRUB提供bash like的介面,當你在選擇kernel 及initrd-image檔名時可以試著按下tab鍵就可以自動幫你找出檔名
note:
對GRUB來說,GRUB上的磁碟機為第一顆硬碟為hd0,然後以此類推比如說系統上有hda sda sdb sdc,Grub如果在hda上面,對grub來說hda=hd0 sda=hd1 sdb=hd2 sdc=hd3假如我的系統是在sda上,/boot 在第一個分割區上那指定磁碟機的時候就是#roo (hd1,0)

更多的 GRUB 的使用請參考下面的網站.
http://www.gnu.org/software/grub/manual/
...........

沒有留言: