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.plusPAE ro root=/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必須如下設置:

title CentOS 6.7 i686  
root (hd0,0)  
kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=/dev/sda2  
initrd /initramfs-2.6.32-573.el6.x86_64.img





5.再看看grub的配置文件/boot/grub/grub.conf

wKioL1aGgsWRLYwxAAAw3gBRgFI957.png

    配置項:

        default=#: 設定默認啓動的菜單項;落單項(title)編號從0開始;

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

        splashimage=(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命令創建密碼。示例:

[root@mageedu ~]# grub-md5-crypt 
Password: 
Retype password: 
$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)尚未關機

  模擬破壞情況:

#dd if=/dev/zero of=/dev/sda bs=200 coun1=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/sysimage目錄下

  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=DIR Install-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


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