GURB詳解(實施級)

一、什麼是grub

    GRand Unified Bootloader,由名字就能看出,這是一個多重開機管理系統。目前在centos 6.xlinux發行版上使用的是0.97版本,在centos 7系列用的是grub2。這裏先討論一下grub0.97版本,grub2的機制已經變了,後續討論。

二、grub引導的三個階段

    Centos 6.8中在/boot/grub目錄下,有如下文件:

wKiom1k_5nnRam_1AABd8WPNbgw640.png

 其中,有stage1stage2以及若干個stage1.5

看字面意思,其啓動順序就是stage1àstage1.5àstage2

 

    stage1執行系統啓動,其目的是加載stage2,並將控制權轉移到stage2中。stage1.5的作用是連接stage1stage2

     stage2階段,將會讀取grub.conf配置文件,根據配置進行設置和顯示操作系統選擇界面。Stage2包含了除自引導之外的所有功能,是整個grub引導的核心。

 

  首先說stage1stage1可以看作是booloader的備份,但是又不盡相同,注意,千萬不可以將stage1直接覆蓋bootloader

  磁盤的第一個扇區,大小爲512Bbootloader安裝在這個扇區中,佔用前446B。然後64B是分區表,接着2BMagic Number。也就是446+64+2=512


使用dd命令導出磁盤第一個扇區

dd if=/dev/sda of=./mbr bs=512 count=1

    

hexdump打開

wKioL1k_5oeRv3MaAADu8Iy9mXI900.png


紅色部分爲bootloader,藍色部分爲partation table分區表,黃色部分爲Magic Number

備份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被放在00道的第1扇區,start.S被放在00道的第2扇區,而與boot分區相關的文件系統的xxfs_stage1_5被放在00道第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.5stage2,然後將stage1寫入mbr

四、grub的設置

在這裏,首先可以瞭解一下grub.conf的結構。

 

default=0
timeout=5
splashp_w_picpath=(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。

splashp_w_picpath=(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.conftitle模塊的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進行修改即可。

         

六、擴展信息

linux系統下與grub相關的命令

  • 1、grub

進入grub shell,可以在其中進行title塊的元素指定。包括root、kernel、initrd、configfile,也可以使用find命令進行簡單文件查找。

  • 2、grub-crypt

爲grub密碼進行加密,支持md5、sha-256、sha-512。

參數:

    --md5

    --sha-256

    --sha-512     這個是默認參數,默認以sha-512進行加密。

  • 3、grub-md5-crypt

爲grub密碼進行md5加密,同grub-crypt --md5

  • 4、grub-terminfo

修改grub所適配的不同終端類型,默認爲vt100-compatible,不常用。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章