Linux之grub的運行機制及grub修復

理論區:

GNU GRUBGRand Unified Bootloader簡稱“GRUB”)是一個來自GNU項目的多操作系統啓動程序。GRUB是多啓動規範的實現,它允許用戶可以在計算機內同時擁有多個操作系統,並在計算機啓動時選擇希望運行的操作系統。GRUB可用於選擇操作系統分區上的不同內核,也可用於向這些內核傳遞啓動參數。

位於磁盤的0磁頭(盤面)0磁道,1扇區位置,該位置共計有512Byte,至於前446個字節是grub

目前,grub現有兩個版本,0.x系列被稱爲是grub1,也被稱爲grub legacyCentOS5以及CentOS6上用的是0.x系列;1.x系列被稱爲是grub2,用於CentOS7;目前CentOS6依舊是企業及的主流版本,所以這裏我們主要討論Grub1的工作機制。

Grub的主要功能便是提供選擇菜單,加載內核以及轉移控制權,但是我們都知道,mbr中僅有446字節共mbr供其使用,想要實現諸多強大的功能這麼小的空間是不可能的,所以,grubCentOS上主要分爲三個步驟,stage1stage1.5stage2,突破了傳統446字節的限制。

Stage1的作用是啓動安裝在MBR中的bootloader主程序,其作用便是指向stage2,引導stage2運行;

Stage1.5作用爲讓grub程序能夠識別grub2所在的分區。或許你也已經發現,在/boot/grub目錄下有諸多以stage1_5結尾的文件,表示各種文件系統所對應的stage1_5,和stage1文件一樣,能夠讓grub識別stage2所在分區的文件不是這些,而是在系統安裝時,早已確定了stage2所在目錄的文件系統格式,並將與之對應的以stage1_5結尾的文件安裝至MBR之後的62個扇區內。

Stage2   作用:a、提供菜單、並提供交互式接口;b、加載用戶選擇的內核或操作系統,並允許傳遞參數給內核;3、提供菜單保護機制,這三項功能在後續的實驗中將得以體現。

 

首先,我們看一下grub的配置文件,其位於/boot/grub/grub.conf,或/etc/grub.conf鏈接文件:

[root@www ~]#cat /boot/grub/grub.conf
# 註釋信息省略
default=0   #設定默認引導的內核項,以title排序,第一個title爲第0項,第二個title爲第1項,以此類推;
timeout=5      #表示5秒內若不動鍵盤,grub將引導默認內核項
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz#菜單背景圖片路徑
hiddenmenu  #表示隱藏grub菜單,要求用戶操作鍵盤才顯示菜單,若省略此項表示開啓
title CentOS 6 (2.6.32-504.el6.x86_64)  #內核菜單標題
       root (hd0,0)  ##內核所在分區,特別注意,此處不是表示根分區的意思
       kernel /vmlinuz-2.6.32-504.el6.x86_64 roroot=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM.UTF-8rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root  KEYBOARDTYPE=pc KEYTABLE=us rhgbcrashkernel=auto quiet rhgb quiet 
       ##內核名稱及傳遞給內核的參數
       initrd/initramfs-2.6.32-504.el6.x86_64.img    #ramdisk名稱,版本號及發行版本號必須與內核一致


##特別注意的是,這裏的rootKernel所在的分區,並且分區標識和開機後的硬盤及分區標識不一樣,對於grub而言,沒有硬盤接口類型之分,對其來講,一切硬盤全部是以hd標識,而第一個0標識第一塊硬盤,第二個0表示第一個分區編號。如果kernel在第二塊硬盤上的第3個分區上,則表示爲(hd1,2),小括號也不可省略!

實驗區:

A進入單用戶模式的操作:

接下來我們看下開機時grub的顯示菜單:

wKiom1XpWAGzsXDzAAB4KZdy-34893.jpg

開機默認顯示這個界面,默認5秒內按下鍵盤任意鍵,便會出現如下界面:

wKioL1XpWkuzDJmxAAE3pphsfpM812.jpg

上圖所示可知,grub配置文件中的title便是在這裏顯示的白色區域標題,根據方框下部的提示可知,e鍵可編輯此內容,c鍵可進入交互式模式,a鍵可添加參數傳遞給內核,b鍵啓動,我們按e鍵看看效果:

wKiom1XpWD7iOW_fAAHSiS4fIrk125.jpg

此時,我們選中kernel項,並在此按e鍵,便可編輯內核添加參數傳遞給內核,如果我們的root密碼忘記了,或者是系統異常無法進入系統,此處我們可以編輯內核,在內核尾部添加1或者是s或者是single進入單用戶模式,如下:

wKioL1XpWnXgMwPKAAEztkRFRqA640.jpg

而後按回車鍵,接着按b鍵,便可進入單用戶模式

wKiom1XpWFvBmgGWAABCuvtLaZ8207.jpg

 

       上面我們提到過,grub提供了菜單加密功能,爲了演示效果,我編輯一下grub.conf文件,添加一個title,並添加密碼項:

       若想給菜單添加密碼,需要使用password關鍵字,可以對編輯加密,也可以對指定內核啓動加密,加密可以是明文,但是安全起見,密文密碼比較好,並且grub也提供了密碼生成工具,具體配置如下圖:

[root@www ~]#grub-md5-crypt   ##交互式MD5密碼生成器
Password:    ##在此輸入你想加密的密碼
Retype password:     ##重複輸入密碼
$1$BjkaP$JgcdSQ8V.ZMeM.VXpTFb9/  #將此處生成的字符串粘貼到password後面即可


wKioL1XpWoihU3CrAAKGD1qQN6A138.jpg

現在我們重啓進入grub菜單:

wKiom1XpWGzgiiEVAAEu1DIA7vA913.jpg

提示需要按p鍵輸入密碼才能繼續往後的設置,並且,新添加的標題也成功顯示了。我們鍵入p鍵:wKioL1XpWp2ShdYVAAE6Mfz4Aqk062.jpg

輸入密碼後,便可以對選中的內核進行編輯了。由於我們給下面的標題添加了password項,表示啓動該內核,也需要輸入相應的密碼,選中test-title回車出現如下所示:

wKiom1XpWITCDXkeAAAcQcLi1z0428.jpg

只有輸入密碼才能啓動該內核。

 

 

 

grub修復

第一種場景:磁盤無grub,通過其他方式啓動的系統,或正常啓動後不小心損壞了系統磁盤的mbr中的前446字節:

 

第一種方法:

[root@www ~]# dd if=/dev/zero of=/dev/sdabs=200 count=1     
##我將磁盤開頭的200byte用0全部覆蓋,即當前我的bootloader已被破壞
1+0 records in
1+0 records out
200 bytes (200 B) copied, 0.00829572 s,24.1 kB/s
此時,在不重啓系統的情況下,對grub進行修復
[root@www ~]# grub-install--root-directory=/ /dev/sda
##這裏的—root-directory=/表示可以在磁盤上找到/boot目錄的位置
Installation finished. No error reported.
This is the contents of the device map//boot/grub/device.map.
Check if this is correct or not. If any ofthe lines is incorrect,
fix it and re-run the script`grub-install'.
 
# this device map was generated by anaconda
(hd0)    /dev/sda

修復成功。

重啓後,便可以正常引導開機。

 

第二種方法:進入grub模式進行修復前提:/boot目錄得實現存在,並且stage文件都完好

 

[root@www ~]# grub    ##進入grub交互式界面
Probing devices to guess BIOS drives. Thismay take a long time.
 
 
   GNU GRUB  version 0.97  (640K lower / 3072K upper memory)
 
 [Minimal BASH-like line editing is supported. For the first word, TAB
  lists possible command completions. Anywhere else TAB lists the possible
  completions of a device/filename.]
grub> root (hd0,0)  
root (hd0,0)      ##指定boot分區所在位置,和grub.conf中的意義一樣
 Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)       ##指明將grub安裝到那塊磁盤上
setup (hd0)
 Checking if "/boot/grub/stage1"exists... no
 Checking if "/grub/stage1" exists...yes
 Checkingif "/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.

修復成功,重啓便可正常引導開機。

grub損壞,沒有進行修復,便重啓了,便會發生如下悲劇,無法開機:

wKioL1XpWrWDoZrMAAEltCWWqjk191.jpg

此時,需進入linux的緊急救援模式,使用U盤鏡像或光盤鏡像引導開機:

wKiom1XpWJjhFw76AAFDtFA5yd8075.jpg

物理機可忽略上一步操作;接下來,設置BIOS開機啓動順序,使用將光盤啓動調整到靠前位置,若usb鏡像,需將usb調至靠前:虛擬機開機按F2

wKiom1XpWKGS7BtWAAGe2qGh4hY791.jpg

F10保存並重啓主機:進入如下界面

wKiom1XpWOCQ8FhHAAKoHU--euU142.jpg

或者進入上述界面,按Esc鍵,進入命令行模式輸入:linux rescue並回車

wKioL1XpWzry_FJuAAA_73fq8Ww923.jpg

然後一路ok,直到詢問是否開啓網絡服務,若你修復的時候需要網絡功能,便選擇開啓,只單純修復grub便可不開啓:

wKiom1XpWTKiPB5GAABmtEEaMQA492.jpg

接下來:

 wKioL1XpW2PQBs3cAAGW__LwKoc105.jpg

引導程序會檢索磁盤是否有安裝過的系統分區,並掛載到/mnt/sysp_w_picpath目錄下,選擇continue

wKiom1XpWVHyZxxbAACw3Eb6Xgc575.jpg

系統已被找到,並掛載成功,ok繼續;

wKioL1XpW4LgxGBIAABk5qZEFBQ655.jpg

選擇啓動shell

wKiom1XpWWqwcw4HAAEsjciuHk0806.jpg

wKioL1XpW5mSkjqBAADqtSOMghE850.jpg

進入grub命令行,便可修復。

此時,將光盤移除,重啓便可正常引導系統。

 

第二種情形:開機時,只顯示grub> ,並無法正常引導開機:

wKioL1XpW6WDuJv6AACDsQiOH18230.jpg

此種情況爲grub配置文件丟失,需手動引導開機後重建grub配置文件。操作如下:

wKiom1XpWZGxz-JVAAC1McSnJg4202.jpg

使用find命令,搜索第一塊磁盤第一個分區是否有內核文件,find (hd0,0)/vmTab鍵,如果自動補全表示內核在第一塊磁盤的第一個分區上,接着進行如下操作

wKioL1XpW8Cze346AAEBJEe1Cpc853.jpg

之後,便可正常開機,進入系統後重建grub配置文件便可。

 

 

 

 


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