新的 GRUB2 請參考 https://benjr.tw/95009
Step 0: 前言
Step 1: GRUB 設定檔
Step 2: 常見問題
Step 3: 開機以及核心信息轉向 console redirection
Step 4: Rescue mode
Step 0: 前言
GRUB 的載入可以分為三個階段 stage1,stage1.5 和 stage2
- BIOS 會將硬碟的 MBR( 前512 bytes)讀進記憶體中.這就是第一階段 (stage1) 他將有能力繼續做stage1.5以及stage2.
- 第一點五階段 (stage1.5) 會去找尋我的系統上 /boot 磁區.並且讀取 /boot 磁區上一些相關資料.
- 第二階段 (stage2) 會顯示 GRUB menu 以及 command 環境.GRUB的使用者介面允許使用者選取作業系統核心或將伊些參數傳給核心(kernel).後面會介紹如何傳參數給 kernel.
- 第二階段 (stage2) 會等待使用者選取一個作業系統核心(kernel 和 initrd)並將他讀入記憶體中.接下來就將控制權交由作業系統管理了.
Step 1: GRUB 設定檔
系統安裝好後 GRUB 存放在 /boot/grub/grub.conf. /boot/grub/menu.lst 是他的分身.
[root@benjr ~]# cat /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 hiddenmenu 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
說明:
default=0
預設開機選項,每個 title 代表一項開機選單 (而這裡 0 代表 RedHat Linux,1 代表 Win2000 )
timeout=10
開機選單等待時間(10表示10秒)
timeout=-1</strong>
如果是 -1 代表不自動選哪一個OS開機,你也可以直接在前面加上 # 這樣也不會使用預設的選項開機.
hiddenmenu
表示不顯示選單直接由預設的選項開機.
password --md5 $1$0BqX5/$D/MgNxFsg8oOsPsVz8EAN.
GRUB 密碼,詳細設定請看”Step 2:常見問題”說明
splashimage=(hd0,1)/boot/grub/splash.xpm.gz
選單的背景圖示,詳細設定請看”註”說明
title Red Hat Linux (2.4.18-3)
開機選單
root (hd0,1)
設定 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 ………..依序下去) .這個順序其實是參考了 /boot/grub/device.map 檔案
[root@benjr ~]# cat /boot/grub/device.map # this device map wasgenerated by anaconda (fd0) /dev/fd0 (hd0) /dev/hda
kernel /boot/vmlinuz-2.4.18-3 ro root=/dev/hda2 initrd /boot/initrd-2.4.18-3.img
kernel,ramdisk 所在位址
title Win2000
其他非 Linux 開機選單
rootnoverify (hd0,0)
不同於 root ,它並不會先驗證檔案系統
chainloader +1
用來載入 Microsoft 的作業系統(如:DOS,Windows…)
將開機以及核心信息轉向至 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
Step 2:常見問題
1.GRUB 設定檔
GRUB 設定檔是寫入就立即生效,不須像LILO需再回寫至MBR.除非GRUB本來就不存在MBR,此時就要下指令
[root@benjr ~]# grub-install /dev/hda
回寫至MBR,當我們的 H.D 裝置順序有誤錯時.要先修改 /boot/grub/device.map 檔案中硬碟的順序.
[root@benjr ~]# cat /boot/grub/device.map #this device map wasgenerated by anaconda (fd0) /dev/fd0 (hd0) /dev/hda
請確定你要安裝的 GRUB 的 H.D 順序在 hd0 ,或者在使用 grub-install 加上參數–recheck
[root@benjr ~]# grub-install --recheck /dev/hda
2.安裝系統後設定GRUB的密碼
GRUB的密碼是經過MD5的加密所以無法在grub.conf直接設定,所以有個指令用來幫我們的將密碼以MD5加密的方式呈現
[root@benjr ~]# 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
系統預設有 hiddenmenu 你必須按任意鍵才會出現選單我們才能為核心加入參數.
按下任意鍵之後可以看到兩個選單一是 smp 多核心的 kernel 會是單一核心的 kernel ,選擇你要開機的核心,你可以在選單下面看到有提示要按什麼鍵來進入編輯模式.上下鍵是可以選擇不同的核心.“e” 就是鍵入編輯模式. “a” 是可以直接為核心加入參數. “c” 為進階版的編輯模式,你可以使用 GRUB 提供的 shell 下指令.
如果再開始選單鍵入 “e” 就會進入編輯模式,你還可以針對 root 磁區,kernel 還是 initrd 輸入參數,要編輯還是按 “e” 如果都加好參數此時就可以按 “b” 直接開機.
這是當你連續按 2 個 “e” 就可以輸入參數.參數 1 就是要進入 single user mode.
按 “c” 是 shell 模式,按 help 可以看到所有的指令,不建議使用除非你對於他的指令有所了解.
在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 的背景圖為 640*480*14 色的 xpm (檔案格式).我們可以使用 Linux 提共的 #gimp 修改成我們需要的圖示.在圖片按右鍵 Image -> Mode -> Indexed 在最上面有一個 Generate Optimum Plalette Max. Number of colors 改成14色.接下來儲存的類型,請選擇 Xpm.還要用 gzip 壓縮 #gzip -9 xxx.xpm 最後會產生 xxx.xpm.gz 將它放在 /boot/grub/xxx.xpm.gz 修改一下 /boot/grub/grub.conf 就可以了.設定檔中的 splashimage=(hd0,1)/boot/grub/xxx.xpm.gz 修改成你剛剛產生的檔名即可.
Step 3: 開機以及核心信息轉向 console redirection
1. 安裝完你的作業系統
2. 修改你的 BIOS(如果你的有支援 ) BIOS Redirection Port to [Serial 1 or Serial 2]
3. 修改你的 /boot/grub/grub.conf
[root@benjr ~]# vi /boot/grub/grub.conf
default=0 timeout=10
# 這三行和 GRUB 輸出有關
# splashimage=(hd0,1)/boot/grub/splash.xpm.gz
# 因為文字模式下無法顯示任何圖片,所以要將這一行刪除或者註記(#)
serial --unit=0 --speed=115200
#–unit 決定你的資料要從哪一個 comport 出去,unit=0 (/dev/ttyS0), unit=1(/dev/ttyS1)
#–speed 決定了傳輸速度
#下面還有其他的參數可使用
#–word=8 傳輸字元可以為7或8 bits
#–parity =no 需要同位元檢查的就選 yes
#–stop=1 需要停止位元就選 1
terminal –timeout=10 serial console title RedHat Enterprise Linux AS (2.4.21-9.ELsmp) root (hd0, 0)
#接下來這一行就會將 kernel 的訊息輸出至 comport
kernel /vmlinuz-2.4.21-9.ELsmp ro root=LABEL=/ console=ttyS0,115200,vt100 initrd /initrd-2.4.21-9.EL.img
4. 系統預設不能使用 comport 來登入系統 ,所以要修改一下 /etc/inittab
[root@benjr ~]# vi /etc/inittab # Run gettys in standard runlevels co:2345:respawn:/sbin/agetty ttyS0 115200 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
5. 由於 PAM 的限制所以 root 無法使用 comport 登入系統 ,所以還是要修改一下 /etc/securetty:
['root@benjr ~]# vi /etc/securetty ttyS0
/etc/sysconfig/kudzu
[root@benjr ~]# vi /etc/sysconfig/kudzu SAFE=yes
6. 接下來要將 Null Modem 接在兩方的電腦, Linux 重新開機就可以不需要螢幕.所有的資料都將透過 comport 來傳送.
Step 4: Rescue mode
1.當安裝完OS重開機時有時只會看到GRUB的提示字元就停住了,這有可能是不小心把grub裝錯硬碟,這時只能使用原光碟片來進行修復
boot: linux rescue
2.如果還能進到 GRUB 本身提供bash like的操作介面,我們可以先手動將OS開起來再修改相關的設定
GRUB開機有4個步驟
I.指定磁碟機及分割區
#root (hd0,0)
II.指定開機核心及root file system
#kernel </VMLINUZ-X.X.X-X ro>root=LABEL=/
III.載入initrd
#initrd </INITRD-IMAGE>
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/
新的作業系統採用 GRUB2 請參考 https://benjr.tw/95009
4 thoughts on “GRUB (GNU GRand Unified Boot loader)”