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進入,如圖:
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: 引導啟動選定的核心;
如圖:
上面的一些命令可以幫助我們在開機查詢有關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的配置。
如下圖:
如上圖:核心與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
配置項:
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的三個階段,如圖:
注意:此種方式不要求指定的根下有boot目錄,或者有grub目錄,會自動建立
方法2:使用grub命令提示符進行修復
注意:此種要求必須要指定的root的裝置上必要有一個grub目錄。stage1,stage1.5 stage2都必須存在才可以,不然無法安裝成功。
2)第二種情況,bootloader損壞,並且已經重啟主機,主機無法啟動,此時需要進入救援模式進行修復。
如下圖,重啟之後,介面無法引導,
一)此時需要使用光碟映象引導。
二)選擇救援模式:
1)使用影象介面,上下移動選擇Rescue install sysytem,進入救援模式
二)按Esc鍵,命令列模式下,看到boot 輸入:linux rescue 回車
三)通過救援模式bash切換到根檔案系統,通過grub-install進行修復
各種設定
#####選擇語言設定:
##### 鍵盤設定:
#####是否啟用網路(不需要,則No,如果選擇了Yes將要求選擇獲取IP地址的方式)
##### 正式進入救援模式,並且嘗試原有的環境,並將其根掛到在/mnt/sysp_w_picpath目錄下
##### 如何切換到原系統:
#####開啟一個shell:
(四)救援模式下的操作
##### 進入shell,切換至磁碟上的檔案系統根目錄
#####切換到已經找到的根檔案系統上,使用grub-install 修復grub
####reboot重啟系統,檢測修復情況
可見修復成功!
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