GURB詳解(實施級)
一、什麽是grub
GRand Unified Bootloader,由名字就能看出,這是一個多重開機管理系統。目前在centos 6.x等linux發行版上使用的是0.97版本,在centos 7系列用的是grub2。這裏先討論一下grub0.97版本,grub2的機制已經變了,後續討論。
二、grub引導的三個階段
Centos 6.8中在/boot/grub目錄下,有如下文件:
其中,有stage1,stage2以及若幹個stage1.5。
看字面意思,其啟動順序就是stage1àstage1.5àstage2
stage1執行系統啟動,其目的是加載stage2,並將控制權轉移到stage2中。stage1.5的作用是連接stage1與stage2。
在stage2階段,將會讀取grub.conf配置文件,根據配置進行設置和顯示操作系統選擇界面。Stage2包含了除自引導之外的所有功能,是整個grub引導的核心。
首先說stage1,stage1可以看作是booloader的備份,但是又不盡相同,註意,千萬不可以將stage1直接覆蓋bootloader。
磁盤的第一個扇區,大小為512B,bootloader安裝在這個扇區中,占用前446B。然後64B是分區表,接著2B是Magic Number。也就是446+64+2=512
使用dd命令導出磁盤第一個扇區:
dd if=/dev/sda of=./mbr bs=512 count=1
用hexdump打開
紅色部分為
備份bootloader
dd if=/dev/sda of=./mbr.img bs=446 count=1
恢復bootloader
dd if=./mbr.img of=/dev/sda bs=446 count=1
資料中顯示,stage1.S被放在0面0道的第1扇區,start.S被放在0面0道的第2扇區,而與boot分區相關的文件系統的xxfs_stage1_5被放在0面0道第3扇區開始的扇區裏,其占據的扇區數目與該stage1_5文件的大小有關。而其余的stage1_5以及stage2都作為文件被存放在boot分區裏。
可是我在測試環境中第二個扇區、第三個扇區一直到第64個扇區,都是空的。可以認為,stage2在磁盤中的位置被寫死到stage1中,stage1無需識別文件系統,直接從磁盤指定位置讀取指定長度的段。
這裏是個疑問,會在以後的學習中註意。
三、grub的安裝與修復
grub的安裝有兩種方式,分別適應兩鐘不同的情況。
1、 mbr損壞,但是/boot/grub下所有文件都正常,我們只需要修復mbr。
進入救援模式之後,啟動grub shell
grub> root (hd0,0) //根據個人啟動分區的不同進行設置。 root(hd0,0) Filesystem type is ext2fs, partition type 0x83 grub> setup (hd0) setup(hd0) Checking if "/boot/grub/stage1"exists... no Checking if "/grub/stage1" exists...yes Checking if "/grub/stage2" exists...yes Checking if "/grub/e2fs_stage1_5"exists... yes Running "embed /grub/e2fs_stage1_5(hd0)"... 27 sectors are embedded. succeeded Running "install /grub/stage1 (hd0)(hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded Done.
2、 替換引導。比如,linux在安裝時就沒有安裝引導,或者以前用的是lilo,而現在想用grub。
使用grub-install命令即可。
grub-install /dev/sda //選定你要安裝bootloader的磁盤或者分區。
這個命令會自動創建/boot/grub目錄,並自動生成stage1 stage1.5和stage2,然後將stage1寫入mbr。
四、grub的設置
在這裏,首先可以了解一下grub.conf的結構。
default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz hiddenmenu title CentOS (2.6.32-642.4.2.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-642.4.2.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=autord_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-642.4.2.el6.x86_64.img title CentOS (2.6.32-431.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-431.el6.x86_64.img
default=0 //指定默認的啟動項,也就是第幾個title。這裏是編號為0的title。
timeout=5 //超時時間,5秒鐘。5秒鐘內不進行選擇,那麽將會自動啟動default所指定的title。
splashimage=(hd0,0)/grub/splash.xpm.gz //背景圖片。這個沒有什麽實質性的功能hiddenmenu //隱藏菜單,這個沒啥實質性功能,就是一個定制性的。
pasword zhou //但是這種方式是明文密碼,任何人打開grub.conf都能看到。
password --md5$1$jWNz8/$aqDO19NluYIX1zkc1SVGp. //這種是密文密碼,雖然可以修改,但是不可以被簡單破解。
下面將要開始指定title,這裏所寫出的title都會在grub的啟動列表中顯示出來。每個title即指定一個啟動,每個啟動必須包括三個元素:
1、root元素:其實就是/boot分區所在位置。有些不尋常的時候,安裝系統時,安裝介質的識別導致磁盤順序在系統中錯誤,root 元素的值在移除安裝介質後與系統/boot分區所在的位置不一致。
2、kernel元素:指定Linux的kernel文件,同時指定各屬性。具體屬性參照擴展區域,這裏實質性意義也不大,不太常用到修改kernel的參數。
3、initrd元素:指定initramfs所在的位置(6.x系列),initramfs有系統安裝時根據系統硬件選擇性編譯的驅動,所以它不具備通用性,大部分情況下安裝時產生的initramfs只能在當前系統中使用。
title CentOS (2.6.32-642.4.2.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-642.4.2.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS.UTF-8 rd_NO_MDrd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-642.4.2.el6.x86_64.img
password --md5$1$jWNz8/$aqDO19NluYIX1zkc1SVGp. //把密碼設置在這裏,意義完全不同。這裏的作用是啟動密碼,如果要啟動該內核,必須輸入密碼。這個也是拿來玩的東西。
title CentOS (2.6.32-431.el6.x86_64)
root (hd0,0)
kernel /vmlinuz-2.6.32-431.el6.x86_64 roroot=/dev/mapper/VolGroup-lv_root rd_NO_LUKS.UTF-8 rd_NO_MDrd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
initrd /initramfs-2.6.32-431.el6.x86_64.img
綜上所述,如果我們要寫一個最簡化的grub.conf,格式可以如下:
timeout 5 //這個選項最好有,否則重啟linux後不會自動進入系統,而是等待啟動項選擇。 title linux root (hd0,0) kernel /vmlinuz-2.6.32-642.4.2.el6.x86_64 ro root=/dev/sda3 initrd /initramfs-2.6.32-642.4.2.el6.x86_64.img
五、grub的排錯
linux偶爾會遇到開機無法啟動的情況,無法啟動的原因有很多,這裏簡單寫一下常見的。
1、 開機直接顯示grub shell。
其實這種是最為容易解決的。因為能出現grub shell說明正常進入了stage2,但是由於grub.conf無法找到或者grub.conf中所寫入的配置不正確,導致grub無法引導啟動。
如果是grub.conf文件的位置被修改而無法找到了,那麽在進入grub shell後可以手動查找grub.conf文件,然後
grub>configfile /grub/grub.conf.bak
如果是grub.conf配置出錯,或者不存在了。
針對這種問題,可以手動指定grub.conf中title模塊的3個元素進行啟動。
grub>root (hd0,0) grub>kernel / vmlinuz-2.6.32-431.el6.x86_64 roroot=/dev/sda3 grub>initrd /initramfs-2.6.32-431.el6.x86_64.img grub>boot
這樣就可以直接進入系統,然後針對grub.conf進行修改即可。
本文出自 “征途小站” 博客,請務必保留此出處http://doctorz.blog.51cto.com/9674137/1935097
GURB詳解(實施級)