1. 程式人生 > 實用技巧 >grub應用配置及修復

grub應用配置及修復

GRUB是一個多作業系統啟動管理器。GRUB全稱為GRand Unified Bootloader。他是系統啟動後執行的第一個程式,他是用來負載載入,傳輸控制到作業系統的核心,一旦他把核心掛載,系統引導管理器的任務也就完成。其他部分,比如設定預設啟動級別,系統初始化,關閉啟動相應的服務等都核心去完成。

1. grub legacy整個執行分為了三個階段;

第一階段,stage1,它是直接被寫入到MBR中去的,這樣機器一啟動檢測完硬體後,就將控制權交給了GRUB的程式碼。也就是上上圖所看到的前446個位元組空間中存放的是stage1的程式碼。BIOS將stage1載入記憶體中0x7c00處並跳轉執行。stage1(/stage1/start.S)的任務非常單純,僅僅是將硬碟0頭0道2扇區讀入記憶體。此時,stage1是沒有識別檔案系統的能力的。

stage1主要負責BIOS和GRUB之間的交接,載入存放於各個分割槽中的開機檔案。例如Linux下/boot/grub/..下面的一些檔案。這部分才是真正放在MBR中的bootloader。

stage1檔案的大小正好是512位元組,事實上stage1檔案其實就是MBR中bootloader的備份,而之所以是bootloader而不是MBR, 是因為這個檔案的前446位元組才是和MBR是一樣的

第二階段,1.5階段,其存放在mbr之後的扇區,讓stage1中的bootloader能識別stage2所在的分割槽上的檔案系統;給grub提供了檔案系統的驅動;

解析:GRUB開始沒有OS,也沒有檔案系統的概念。那麼GRUB是從何時開始有檔案系統的功能的呢。這就是stage1.5乾的事情,stage1.5過後,GRUB就能識別檔案系統了,就能在磁碟上識別載入檔案了怎麼做到的?start.S載入的磁碟上的那些扇區的內容,就是檔案系統的程式碼,(即start.S的彙編程式碼,有興趣的筒子可以去了解一下),將其(大概14個扇區)載入到記憶體,就具備了操作啟動裝置上面檔案的功能了,我們有了檔案系統,我們可以直接操作檔案了。那麼/boot/grub/stage2這樣的比較大的檔案可以直接操作了。此後grub才有能力去訪問/boot分割槽/boot/grub目錄下的 stage2檔案,將stage2載入記憶體並執行。

第三階段,stage2:他存放磁碟分割槽上(/boot/grub/)。

解析:讓使用者以選項的方式將作業系統載入、修改選項以及新增引數,平時開機啟動的時候看到的Grub選項、資訊,還有修改GRUB背景等功能都是stage2提供的,stage2會去讀入/boot/grub/grub.conf配置檔案。

總結:

1) BIOS將控制權交給硬碟的主引導區,即MBR。

2) MBR中的bootloader(stage1)通過內建的地址載入stage1_5;

3)bootloader通過stage1_5的內容,將分割槽中的stage2載入;

4)stage2此時就可以在檔案系統中將grub.conf檔案載入,讓使用者看到選項介面。


grub的配置檔案存放在/boot/grub/grub.conf,他還有一個連結檔案,為/etc/grub.conf,stage2及核心等通常放置於一個基本磁碟分割槽。

grub介面通過開機按C進入,如圖:

wKioL1aGflbAp-ToAAAgNrhEuWQ670.png

2.整個grub的功能主要有以下幾方面:

(1) 提供選單、並提供互動式介面

e: 編輯模式,用於編輯選單;

c: 命令模式,互動式介面;

(2) 載入使用者選擇的核心或作業系統

允許傳遞引數給核心

可隱藏此選單

(3)為選單提供了保護機制

為編輯選單進行認證

為啟用核心或作業系統進行認證


3.grub如何識別裝置:grub在boot目錄下,要看boot的目錄所在處。

格式:(hd#,#)第幾個磁碟的第幾個分割槽;

hd#: 磁碟編號,用數字表示;從0開始編號

#: 分割槽編號,用數字表示; 從0開始編號

一般情況為(hd0,0):第一個磁碟的第一個主分割槽

4.grub有自己的命令列介面,選項如下:

help: 獲取幫助列表

help KEYWORD: 詳細幫助資訊

find (hd#,#)/PATH/TO/SOMEFILE:定位某檔案是否存在

root (hd#,#)把哪一個磁碟分割槽設為根裝置

kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的核心檔案;額外還可以新增許多核心支援使用的cmdline引數;指明核心檔案的路徑;z表示壓縮格式

例如:init=/path/to/init, selinux=0

initrd /PATH/TO/INITRAMFS_FILE: 設定為選定的核心提供額外檔案的ramdisk;

boot: 引導啟動選定的核心;

如圖:

wKiom1aGf0HjolFjAAA4EkpLLgg328.png

上面的一些命令可以幫助我們在開機查詢有關grub相關資訊。

我們可以假設以下幾種情況:

1)假設一個系統的grub設定出現問題(原因:不正確地修改grub 配置檔案,安裝另一個作業系統,硬體上或 BIOS內的改動引致設定的排序不相同),導致grub不能找到它的配置檔案,你可能會面對 grub 的開機提示符而無從著手。一般來說,第一步是要找出grub配置檔案的位置。

grub的 find 指令可以為你效勞

grub>find/grub/grub.conf
find/grub/grub.conf
(hd0,2)(hd1,2)

這裡告訴我們我們有兩個boot分割槽,有可能源自不同的作業系統。頭一個位於第一個硬碟的第三個分割槽,另一個位於第二個硬碟的第三個分割槽,假若要將第一個專案的grub設定重新安裝到MBR;方法如下:

grub>root(hd0,2)
grub>setup(hd0)


2)或者直接去查詢stage1所在也可,如圖所示:

grub>find/boot/grub/stage1
(hd0,5)

grub>root(hd0,5)
grub>kernel/boot/vmlinuz-2.6.18-238.19.1.el5.centos.plusPAEroroot=/dev/sda6
grub>initrd/boot/initrd-2.6.18-238.19.1.el5.centos.plusPAE.img
grub>boot



3)如果你安裝了其它 Linux 版本,比如說Ubuntu,它只有 menu.lst配置而沒有grub.conf,但由於 CentOS利用連結把 menu.lst指向 grub.conf,因此在這兩個系統上尋找 menu.lst也是可以的:

grub>find/grub/grub.conf
find/grub/grub.conf
(hd0,0)
grub>find/grub/menu.lst
find/grub/menu.lst
(hd0,0)(hd0,1)

由此可見,這裡有兩個/boot分割槽,第一位於硬碟的第一個分割槽,很可能是centos,而另一個linux的唯一第一個硬碟的的第二個分割槽;

這時候要檢視grub.conf及menu.1st的內容,可以使用cat,

grub>cat(hd0,0)/grub/grub.conf
...顯示檔案內容...
grub>cat(hd0,1)/grub/menu.lst
...顯示檔案內容...


4)要是第一次嘗試找不到檔案,很可能/boot 分割槽並不存在,而grub被安裝在主目錄內。可以嘗試:

grub>find/boot/grub/grub.conf
(hd0,0)(hd1,4)

如上所示,這個例子裡有兩個grub。第一個在第一個硬碟的第一個分割槽,而另一個在第二個硬碟的第五個分割槽 —— 亦即首個擴充套件分割槽。

如果要撤消第二個專案並將GRUB的開機程式安裝在第一個硬碟的 MBR 上:

grub>root(hd1,4)
grub>setup(hd0


4)如果不清楚主目錄的位置時,可以嘗試尋找 /etc 內的一個檔案。例如:

grub>find/etc/fstab
(hd0,1)

由此我們得知 / 位於第一個硬碟的第二個分割槽上 —— 採用 SCSI 或 SATA 等於 /dev/sda2,而採用 PATA 等於/dev/hda2。


手動在grub命令列介面啟動系統:

grub> root (hd#,#)

grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE

grub> initrd /initramfs-VERSION-RELEASE.img

grub> boot

以上幾個完成grub的配置。

如下圖:

wKioL1aGgQqj-WgvAAAWEoePvtQ153.png

如上圖:核心與init的路徑指定與/boot目錄是否被單獨分割槽有關;

1)如boot單獨分割槽,同時安裝在第一塊硬碟,那麼可以入上圖填寫;

2)如boot不是單獨分割槽,前面需要指定boot路徑, 如/boot/...等;

3)如不是第一塊硬碟,或許是(hd#,#);

4)因centos6,7版本 /預設被安裝為LVM格式,建議boot單獨分割槽。

舉例:/boot 的分割槽是 /dev/sda1,或 hd(0,0)。/ 的分割槽是 /dev/sda2,或hd(0,1),那麼/boot/grub/grub.conf必須如下設定:

titleCentOS6.7i686
root(hd0,0)
kernel/vmlinuz-2.6.32-573.el6.x86_64roroot=/dev/sda2
initrd/initramfs-2.6.32-573.el6.x86_64.img





5.再看看grub的配置檔案/boot/grub/grub.conf

wKioL1aGgsWRLYwxAAAw3gBRgFI957.png

配置項:

default=#: 設定預設啟動的選單項;落單項(title)編號從0開始;

timeout=#:指定選單項等待選項選擇的時長;

splashp_w_picpath=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明選單背景圖片檔案路徑;

hiddenmenu:隱藏選單;

password [--md5] STRING: 選單編輯認證;

title TITLE:定義選單項“標題”, 可出現多次;

root (hd#,#):grub查詢stage2及kernel檔案所在裝置分割槽;為grub的“根”;

kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:啟動的核心

initrd /PATH/TO/INITRAMFS_FILE: 核心匹配的ramfs檔案;

password [--md5] STRING: 啟動選定的核心或作業系統時進行認證;

可以使用grub-md5-crypt命令建立密碼。示例:

[[email protected]~]#grub-md5-crypt
Password:
Retypepassword:
$1$LduMa$b.xr5xXjzmcTWx/cpqCXa.

然後將密碼寫在配置檔案裡

password --md5$1$LduMa$b.xr5xXjzmcTWx/cpqCXa. 縮排寫入配置檔案。

可以對選單進行編輯認證或者對啟動的核心進行認證設定。



6. 進入grub的單使用者模式可以幫我們修改忘記root之後的密碼,進入的單使用者模式的方法:

(1) 編輯grub選單(選定要編輯的title,而後使用e命令);

(2) 在選定的kernel後附加,1, s, S或single都可以;

(3) 在kernel所在行,鍵入“b”命令;


7.如果bootloader檔案損壞,那麼就只能進入救援模式;或者把硬碟拆下來,放到其他的主機上修復。如果grub損壞,如何重新安裝grub?


1)尚未關機

模擬破壞情況:

#ddif=/dev/zeroof=/dev/sdabs=200coun1=1

方法1:grub-install直接修復安裝,可以安裝grub的三個階段,如圖:

wKiom1aGho3yNM72AAActe6a0Ag926.png


注意:此種方式不要求指定的根下有boot目錄,或者有grub目錄,會自動建立

方法2:使用grub命令提示符進行修復

wKiom1aGh37Bn_LGAAAuj1Icb_4619.png

注意:此種要求必須要指定的root的裝置上必要有一個grub目錄。stage1,stage1.5 stage2都必須存在才可以,不然無法安裝成功。


2)第二種情況,bootloader損壞,並且已經重啟主機,主機無法啟動,此時需要進入救援模式進行修復。

如下圖,重啟之後,介面無法引導,

wKiom1aGnhHSE02UAAALu7pDNb8174.png

一)此時需要使用光碟映象引導。

wKioL1aGnq2zU7JVAAAkFbIqiVg931.png

二)選擇救援模式:

1)使用影象介面,上下移動選擇Rescue install sysytem,進入救援模式

wKiom1aGn3CjpXgWAALoeq8_Wuk949.png

二)按Esc鍵,命令列模式下,看到boot 輸入:linux rescue 回車

wKioL1aGoAvieKJ0AAAB1LdEOFY227.png

三)通過救援模式bash切換到根檔案系統,通過grub-install進行修復

各種設定

#####選擇語言設定:

wKiom1aGoRXje_BOAAAUMhEPq1c390.png

##### 鍵盤設定:

wKiom1aGoVvCoKBEAAARthMmL3I474.png

#####是否啟用網路(不需要,則No,如果選擇了Yes將要求選擇獲取IP地址的方式)

wKiom1aGob-DL7jMAAAJUckHoss778.png

##### 正式進入救援模式,並且嘗試原有的環境,並將其根掛到/mnt/sysp_w_picpath目錄下

wKioL1aGopjSptyBAAJG4zvmVvc750.jpg

##### 如何切換到原系統:

wKiom1aGotDAS1OFAAEphUIdF0c122.jpg

#####開啟一個shell:

wKiom1aGovniNhVaAACJ4qYhOtE469.jpg

(四)救援模式下的操作

##### 進入shell,切換至磁碟上的檔案系統根目錄

wKiom1aGpBbwAcP7AAAESTGWAOo838.png

#####切換到已經找到的根檔案系統上,使用grub-install 修復grub

wKioL1aGpa7D_z-KAAAUdXaCmRI507.png

####reboot重啟系統,檢測修復情況

wKiom1aGpiDwi8z1AAAI3_Cgm6Y766.png

可見修復成功!



8.關於新版grub2

新版的grub-install命令指定安裝目錄時不再使用--root-directory選項,改為 --boot-directory選項,安裝檔案不是安裝在指定目錄的/boot/grub下,而是安裝在指定目錄的/grub下,具體用法為:

grub-install--boot-directory=DIRInstall-Device

舉個例子說明,如果 /boot分割槽為 sda7,/ 分割槽為sda8,在使用救援模式修復grub2到mbr時使用的命令為:

#如果是以前的grub2,必須先掛載系統的/分割槽,再把系統的/boot分割槽掛載到系統/分割槽下
mount/sda8/mnt
mount/sda7/mnt/boot
grub-install--boot-directory=/mnt/boot/dev/sda

#而對於只有/分割槽(假設為/dev/sda7),沒有/boot單獨分割槽的,使用命令為
mount/dev/sda7/mnt
grub-install--boot-directory=/mnt/boot/dev/sda


轉載於:https://blog.51cto.com/niefeifly/1730880