1. 程式人生 > >GURB詳解(實施級)

GURB詳解(實施級)

linux grub

一、什麽是grub

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

二、grub引導的三個階段

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

技術分享

其中,有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打開

技術分享


紅色部分為

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
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.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進行修改即可。


本文出自 “征途小站” 博客,請務必保留此出處http://doctorz.blog.51cto.com/9674137/1935097

GURB詳解(實施級)