溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

引導(dǎo)加載程序grub詳解

發(fā)布時(shí)間:2020-07-19 01:21:19 來源:網(wǎng)絡(luò) 閱讀:8673 作者:iamwhoiam2013 欄目:移動開發(fā)

上一章講到,常見的boot loader(引導(dǎo)加載程序)有LILO和grub,LILO有一大缺點(diǎn),它只能識別0-1023范圍內(nèi)的柱面構(gòu)成的分區(qū)的內(nèi)核文件,故已逐漸被grub取代。

Grub(GRand Unified Bootloader)是一個來自GNU項(xiàng)目的多操作系統(tǒng)引導(dǎo)程序,它負(fù)責(zé)加載內(nèi)核并移交控制權(quán)


1、Grub版本:

   CentOS 5、6  Grub 0.97

   CentOS 7    Grub2 1.96


2、grub程序由三段組成

   stage1: MBR(0柱面 0磁道 1扇區(qū))中

   stage1_5: MBR隨后的扇區(qū)

   stage2: 讀取grub.conf配置文件,并實(shí)現(xiàn)引導(dǎo)功能的擴(kuò)展

  MBR所給予的空間畢竟太小,容不下較大的引導(dǎo)程序,因此grub程序被分為三段:"stage 1" 被裝入磁盤的MBR中;特殊的"stage 1.5"被裝入MBR隨后的扇區(qū),它能夠識別內(nèi)核和"stage 2"所在分區(qū)的文件系統(tǒng)格式并幫助引導(dǎo)"stage 2",它是"stage 1"和"stage 2"之間的紐帶;"stage 2"位于文件系統(tǒng)上。stage 2程序和grub.conf可以與內(nèi)核文件處于不同的分區(qū)上(但必須位于同一磁盤),只要"stage 1.5"能夠驅(qū)動它們各自所在的分區(qū)。

  在linux中,與啟動相關(guān)的文件(grub、vmlinuz、initramfs)均位于boot目錄下

引導(dǎo)加載程序grub詳解


3、grub的功能

  ①提供菜單,并提供交互式接口

     e: 進(jìn)入編輯模式

  ②選擇要啟動的內(nèi)核或系統(tǒng)

     允許傳遞引導(dǎo)參數(shù)給內(nèi)核

     選擇界面可隱藏

  ③為編輯功能提供保護(hù)機(jī)制

     啟用內(nèi)核文件:

       選擇運(yùn)行指定的內(nèi)核得先輸入密碼

     傳遞參數(shù):

       使用e命令得先輸入密碼


開機(jī)后有三秒種的過渡頁面,按任意鍵可進(jìn)入菜單頁面。在菜單頁面可用上下鍵選擇所要啟動的內(nèi)核或內(nèi)核,按e鍵進(jìn)入內(nèi)核編輯模式,按c鍵進(jìn)入grub命令行模式

引導(dǎo)加載程序grub詳解


4、grub命令行接口:

    help:查看幫助,即列出命令列表

    root (DEVICE):指定哪個分區(qū)為接下來要啟動的系統(tǒng)或內(nèi)核文件所在的分區(qū),例如root (hd0,0)

      所有硬盤都被識別為hd

      不同的硬盤基于數(shù)字標(biāo)識,從0開始:如hd0, hd1等

      同一個硬盤上的不同分區(qū),也使用數(shù)字標(biāo)識,從0開始:如hd0,0  hd1,5

    find (DEVICE)/path/to/file查找文件。當(dāng)我們不確定內(nèi)核文件位于哪個分區(qū)上時(shí),可使用該命令;提示:grub支持tab補(bǔ)全

    kernel /path/to/kernel_file:指定要運(yùn)行的內(nèi)核文件,如kernel /vmlinuz-2.6.32-431.el6.x86_64。

     【注】:這里的文件路徑是相對于內(nèi)核文件所在分區(qū)而言,其開頭的“/”不是指操作系統(tǒng)的根,而是指內(nèi)核所在的分區(qū),因?yàn)間rub是直接以該分區(qū)為入口找尋內(nèi)核的。若有單獨(dú)的boot分區(qū),則不能寫成kernel /boot/vmlinuz-2.6.32-431.el6.x86_64;在指定的內(nèi)核位置后通常還指明要掛載的根分區(qū)

    initrd /path/to/kernel_file:為要運(yùn)行的內(nèi)核指定其可用的ramdisk文件,其版本必須與內(nèi)核版本保持一致

     【注】:grub無法識別邏輯卷,因此kernel與initramfs一定不能放于邏輯卷上

    boot: 啟動此前配置好的內(nèi)核或系統(tǒng)


5、grub.conf

  通過grub命令行接口接入系統(tǒng)比較麻煩,為此,grub提供了一個配置文件/boot/grub/grub.conf(它有一個軟鏈接/etc/grub.conf),grub會讀取這個配置文件并按配置參數(shù)引導(dǎo)系統(tǒng)

  參數(shù):

   default=:默認(rèn)選擇第幾個title配置的內(nèi)核或系統(tǒng),各title從0開始編號

   timeout=#:過渡頁面顯示的超時(shí)時(shí)長;

   splashp_w_picpath=/path/to/some_p_w_picpath_file:指定菜單的背景圖片;此圖片只能為14bits色,xpm格式,gzip壓縮;

   hiddenmenu:隱藏菜單

   title TILTE STRING:顯示于菜單中的標(biāo)題

      root

      kernel

      initrd

  ■若由于grub.conf文件錯誤或丟失而無法自動進(jìn)入系統(tǒng),可通過grub命令行引導(dǎo)系統(tǒng)后再手動更改或創(chuàng)建這個文件

[root@node2 ~]# cat /boot/grub/grub.conf
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE:  You have a /boot partition.  This means that
#          all kernel and initrd paths are relative to /boot/, eg.
#          root (hd0,0)
#          kernel /vmlinuz-version ro root=/dev/sda2
#          initrd /initrd-[generic-]version.img
#boot=/dev/sda
default=0
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-431.el6.x86_64)
	root (hd0,0)
	kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=aa0330af-3681-428c-98e2-ccf2e6f0f686 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
	initrd /initramfs-2.6.32-431.el6.x86_64.img
[root@node2 ~]# ll /etc/grub/conf
ls: cannot access /etc/grub/conf: No such file or directory
[root@node2 ~]# ll /etc/grub.conf
lrwxrwxrwx. 1 root root 22 Aug  6 04:44 /etc/grub.conf -> ../boot/grub/grub.conf
[root@node2 ~]# cp /boot/{vmlinuz-2.6.32-431.el6.x86_64,initramfs-2.6.32-431.el6.x86_64.img} /    #將boot目錄下的內(nèi)核和臨時(shí)根文件復(fù)制一份到根分區(qū)下
[root@node2 ~]# ls /
bin   dev  home                                 lib    lost+found  misc  net  proc  sbin     srv  tmp  var
boot  etc  initramfs-2.6.32-431.el6.x86_64.img  lib64  media       mnt   opt  root  selinux  sys  usr  vmlinuz-2.6.32-431.el6.x86_64
[root@node2 ~]# vim /etc/grub.conf
...
default=0
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=aa0330af-3681-428c-98e2-ccf2e6f0f686 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-431.el6.x86_64.img
#添加如下幾行,構(gòu)成一個新的啟動項(xiàng)
title testCentos  #新的標(biāo)題
        root (hd0,1)  #現(xiàn)在根分區(qū)下也有內(nèi)核和臨時(shí)根文件,根分區(qū)為sda2,故寫成(hd0,1)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=/dev/sda2
        initrd /initramfs-2.6.32-431.el6.x86_64.img

引導(dǎo)加載程序grub詳解


6、grub保護(hù)機(jī)制:可防止惡意用戶隨意進(jìn)入單用戶模式修改root密碼

  ①生成密碼:

   grub-md5-crypt

  ②保護(hù)所有內(nèi)核,需要在title之外添加

   password --md5 密碼串

  ③保護(hù)使用某內(nèi)核,則需要在內(nèi)核對應(yīng)的title之下添加

   password --md5 密碼串

[root@node2 ~]# grub-md5-crypt   #生成密碼
Password: 
Retype password: 
$1$oWUbV$Sb/PsrhmkE5bUJPMJGn871
[root@node2 ~]# vim /etc/grub.conf
...
default=0
timeout=5
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
password --md5 $1$oWUbV$Sb/PsrhmkE5bUJPMJGn871   #添加于title之外可保護(hù)所有內(nèi)核
title CentOS (2.6.32-431.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=aa0330af-3681-428c-98e2-ccf2e6f0f686 rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
        initrd /initramfs-2.6.32-431.el6.x86_64.img
title testCentos
password --md5 $1$oWUbV$Sb/PsrhmkE5bUJPMJGn871   #可保護(hù)使用指定內(nèi)核
        root (hd0,1)
        kernel /vmlinuz-2.6.32-431.el6.x86_64 ro root=UUID=aa0330af-3681-428c-98e2-ccf2e6f0f686
        initrd /initramfs-2.6.32-431.el6.x86_64.img

引導(dǎo)加載程序grub詳解


7、安裝grub的方式:

  方法1:使用grub-install命令

    grub-install [--root-directory=DIR] DEVICE 

      DEVICE:針對哪個磁盤安裝

      --root-directory=DIR:指定grub映像文件(主要是“stage 2”)的存放位置,默認(rèn)為當(dāng)前系統(tǒng)根目錄。grub-install會在指定的目錄下創(chuàng)建boot/grub/的層級目錄,并將生成的“stage 2”置于DIR/boot/grub/下。因?yàn)閮?nèi)核與initramfs文件通常位于boot目錄下,故一般將DIR指定為boot目錄的父目錄;當(dāng)然,我們也可以指定為其它目錄,但要手動編輯grub.conf文件重新指明內(nèi)核文件的位置。

    例如  mount /dev/sdb1 /mnt/boot

         grub-install --root-directory=/mnt/ /dev/sdb

 

  方法2:輸入grub命令進(jìn)入grub命令行

    root (hd0,0):相當(dāng)于上面的--root-directory=DIR

    setup (hd0):為哪個磁盤安裝

    quit:退出


  情景1:grub損壞但系統(tǒng)還未關(guān)閉或重啟,此時(shí)可直接使用上面的兩種方法修復(fù)

[root@node2 ~]# dd if=/dev/zero of=/dev/sda bs=400 count=1   #將MBR中的引導(dǎo)加載程序沖刷掉,注意不能殃及分區(qū)表
1+0 records in
1+0 records out
400 bytes (400 B) copied, 0.000324129 s, 1.2 MB/s
[root@node2 ~]# rm -f /boot/grub/stage2   #將"stage 2"也刪除
[root@node2 ~]# grub-install /dev/sda      #使用grub-install的方式安裝grub
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 of the lines is incorrect,
fix it and re-run the script `grub-install'.

# this device map was generated by anaconda
(hd0)     /dev/sda
[root@node2 ~]# ll /boot/grub/stage2   #已重新生成"stage 2"
-rw-r--r-- 1 root root 126100 Oct 28 22:19 /boot/grub/stage2

[root@node2 ~]# dd if=/dev/zero of=/dev/sda bs=400 count=1
1+0 records in
1+0 records out
400 bytes (400 B) copied, 0.000368562 s, 1.1 MB/s
[root@node2 ~]# grub
Probing devices to guess BIOS drives. This may 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)
 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
 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.
grub> quit
quit


  情景2:grub損壞且系統(tǒng)已關(guān)閉,這時(shí)候可用如下兩種方式修復(fù):

  方式一:將故障磁盤掛載于其它正常主機(jī)上重裝grub

   ①手動將node1的磁盤的grub損毀并關(guān)機(jī)

[root@node1 ~]# dd if=/dev/zero of=/dev/sda bs=400 count=1
1+0 records in
1+0 records out
400 bytes (400 B) copied, 0.000164892 s, 2.4 MB/s
[root@node1 ~]# shutdown -h now

   ②將node1的磁盤移除并添加到node2上(關(guān)于 如何在不重啟的情況下識別新增硬盤 見末尾補(bǔ)充部分)

   ③掛載node1的分區(qū)并安裝grub,安裝完后卸載

[root@node2 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   30G  0 disk 
├─sda1   8:1    0  200M  0 part /boot
├─sda2   8:2    0   10G  0 part /
└─sda3   8:3    0    2G  0 part [SWAP]
sdb      8:16   0   30G  0 disk   #node1的硬盤在node2上被識別為sdb
├─sdb1   8:17   0  200M  0 part 
├─sdb2   8:18   0   10G  0 part 
└─sdb3   8:19   0    2G  0 part 
sr0     11:0    1  4.2G  0 rom  
[root@node2 ~]# mkdir /mnt/boot
[root@node2 ~]# mount /dev/sdb1 /mnt/boot
[root@node2 ~]# grub-install --root-directory=/mnt /dev/sdb
/dev/sdb does not have any corresponding BIOS drive.
# 注意:若這里提示找不到相應(yīng)的BIOS驅(qū)動,可使用選項(xiàng)--recheck重新檢查磁盤,如下:
[root@node2 ~]# grub-install --root-directory=/mnt --recheck /dev/sdb
Probing devices to guess BIOS drives. This may take a long time.
Installation finished. No error reported.
This is the contents of the device map /mnt/boot/grub/device.map.
Check if this is correct or not. If any of the lines is incorrect,
fix it and re-run the script `grub-install'.

(fd0)	/dev/fd0
(hd0)	/dev/sda
(hd1)	/dev/sdb
[root@node2 ~]# umount /mnt/boot

   ④從node2上移除node1的硬盤后再裝回node1啟動即可


  方式二:插入系統(tǒng)光盤進(jìn)入救援模式修復(fù)

   ①將Linux安裝光盤放入光驅(qū)。硬盤的MBR損壞后,BIOS會自動從光盤引導(dǎo),進(jìn)入菜單頁面后,選擇進(jìn)入“救援模式”

引導(dǎo)加載程序grub詳解

   ②系統(tǒng)會檢測硬件,引導(dǎo)光盤上的Linux環(huán)境,依次提示選擇救援模式下使用的語言、鍵盤以及是否需要設(shè)置網(wǎng)絡(luò),可按需選擇

   ③接下來系統(tǒng)會查找根分區(qū),出現(xiàn)掛載提示,硬盤的根分區(qū)將被掛載到光盤Linux環(huán)境的/mnt/sysp_w_picpath目錄下;默認(rèn)選項(xiàng)“continue”表示掛載權(quán)限為讀寫,“Read-only”為只讀,如。此處,因?yàn)橐獙ο到y(tǒng)進(jìn)行修復(fù),故需要有讀寫權(quán)限,選擇“continue”。

引導(dǎo)加載程序grub詳解

   ④按提示執(zhí)行“chroot /mnt/sysp_w_picpath”切換根環(huán)境并安裝grub,然后退出shell并重啟即可

     chroot:切換根環(huán)境,即以指定的目錄作為根

     用法:chroot /path/to/directory [SHELL]

     例如 chroot /mnt/sysp_w_picpath /bin/tcsh   #將sysp_w_picpath作為根目錄,并運(yùn)行其中的tcsh

引導(dǎo)加載程序grub詳解

引導(dǎo)加載程序grub詳解


補(bǔ)充:如何實(shí)現(xiàn)不重啟linux而識別新增硬盤?

 新增硬盤后,使用如下命令識別:

    echo "scsi add-single-device w x y z" > /proc/scsi/scsi

    其中:

       w 是主機(jī)適配器標(biāo)識,第一個適配器為零(0)
       x 是主機(jī)適配器上的SCSI通道,第一個通道為零(0)
       y 是設(shè)備的SCSI標(biāo)識
       z 是LUN號,第一個LUN為零(0)

 執(zhí)行上述命令前,要先查看/proc/scsi/scsi,確定新增硬盤的ID


 相反,在不重啟系統(tǒng)的情況下將硬盤從系統(tǒng)中移除的命令為:

    echo "scsi remove-single-device w x y z" > /proc/scsi/scsi

 使用該命令前需確保該硬盤已卸載

[root@node2 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   30G  0 disk 
├─sda1   8:1    0  200M  0 part /boot
├─sda2   8:2    0   10G  0 part /
└─sda3   8:3    0    2G  0 part [SWAP]
sr0     11:0    1  4.2G  0 rom
[root@node2 ~]# cat /proc/scsi/scsi
Attached devices:
Host: scsi0 Channel: 00 Id: 00 Lun: 00
  Vendor: VMware,  Model: VMware Virtual S Rev: 1.0 
  Type:   Direct-Access                    ANSI  SCSI revision: 02
Host: scsi2 Channel: 00 Id: 00 Lun: 00
  Vendor: NECVMWar Model: VMware IDE CDR10 Rev: 1.00
  Type:   CD-ROM                           ANSI  SCSI revision: 05
#可以看到,當(dāng)前最大ID號為00,因此新增硬盤的ID號應(yīng)為01
[root@node2 ~]# echo "scsi add-single-device 0 0 1 0" > /proc/scsi/scsi
[root@node2 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   30G  0 disk 
├─sda1   8:1    0  200M  0 part /boot
├─sda2   8:2    0   10G  0 part /
└─sda3   8:3    0    2G  0 part [SWAP]
sdb      8:16   0   30G  0 disk   #新增硬盤已被識別出來
├─sdb1   8:17   0  200M  0 part 
├─sdb2   8:18   0   10G  0 part 
└─sdb3   8:19   0    2G  0 part 
sr0     11:0    1  4.2G  0 rom
[root@node2 ~]# echo "scsi remove-single-device 0 0 1 0" > /proc/scsi/scsi   #移去該硬盤
[root@node2 ~]# lsblk
NAME   MAJ:MIN RM  SIZE RO TYPE MOUNTPOINT
sda      8:0    0   30G  0 disk 
├─sda1   8:1    0  200M  0 part /boot
├─sda2   8:2    0   10G  0 part /
└─sda3   8:3    0    2G  0 part [SWAP]
sr0     11:0    1  4.2G  0 rom


向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI