您好,登錄后才能下訂單哦!
上一章講到,常見的boot loader(引導加載程序)有LILO和grub,LILO有一大缺點,它只能識別0-1023范圍內的柱面構成的分區的內核文件,故已逐漸被grub取代。
Grub(GRand Unified Bootloader)是一個來自GNU項目的多操作系統引導程序,它負責加載內核并移交控制權
1、Grub版本:
CentOS 5、6 Grub 0.97
CentOS 7 Grub2 1.96
2、grub程序由三段組成:
stage1: MBR(0柱面 0磁道 1扇區)中
stage1_5: MBR隨后的扇區
stage2: 讀取grub.conf配置文件,并實現引導功能的擴展
MBR所給予的空間畢竟太小,容不下較大的引導程序,因此grub程序被分為三段:"stage 1" 被裝入磁盤的MBR中;特殊的"stage 1.5"被裝入MBR隨后的扇區,它能夠識別內核和"stage 2"所在分區的文件系統格式并幫助引導"stage 2",它是"stage 1"和"stage 2"之間的紐帶;"stage 2"位于文件系統上。stage 2程序和grub.conf可以與內核文件處于不同的分區上(但必須位于同一磁盤),只要"stage 1.5"能夠驅動它們各自所在的分區。
在linux中,與啟動相關的文件(grub、vmlinuz、initramfs)均位于boot目錄下
3、grub的功能
①提供菜單,并提供交互式接口
e: 進入編輯模式
②選擇要啟動的內核或系統
允許傳遞引導參數給內核
選擇界面可隱藏
③為編輯功能提供保護機制
啟用內核文件:
選擇運行指定的內核得先輸入密碼
傳遞參數:
使用e命令得先輸入密碼
開機后有三秒種的過渡頁面,按任意鍵可進入菜單頁面。在菜單頁面可用上下鍵選擇所要啟動的內核或內核,按e鍵進入內核編輯模式,按c鍵進入grub命令行模式
4、grub命令行接口:
help:查看幫助,即列出命令列表
root (DEVICE):指定哪個分區為接下來要啟動的系統或內核文件所在的分區,例如root (hd0,0)
所有硬盤都被識別為hd,
不同的硬盤基于數字標識,從0開始:如hd0, hd1等
同一個硬盤上的不同分區,也使用數字標識,從0開始:如hd0,0 hd1,5
find (DEVICE)/path/to/file:查找文件。當我們不確定內核文件位于哪個分區上時,可使用該命令;提示:grub支持tab補全
kernel /path/to/kernel_file:指定要運行的內核文件,如kernel /vmlinuz-2.6.32-431.el6.x86_64。
【注】:這里的文件路徑是相對于內核文件所在分區而言,其開頭的“/”不是指操作系統的根,而是指內核所在的分區,因為grub是直接以該分區為入口找尋內核的。若有單獨的boot分區,則不能寫成kernel /boot/vmlinuz-2.6.32-431.el6.x86_64;在指定的內核位置后通常還指明要掛載的根分區
initrd /path/to/kernel_file:為要運行的內核指定其可用的ramdisk文件,其版本必須與內核版本保持一致
【注】:grub無法識別邏輯卷,因此kernel與initramfs一定不能放于邏輯卷上
boot: 啟動此前配置好的內核或系統
5、grub.conf
通過grub命令行接口接入系統比較麻煩,為此,grub提供了一個配置文件/boot/grub/grub.conf(它有一個軟鏈接/etc/grub.conf),grub會讀取這個配置文件并按配置參數引導系統
參數:
default=:默認選擇第幾個title配置的內核或系統,各title從0開始編號
timeout=#:過渡頁面顯示的超時時長;
splashp_w_picpath=/path/to/some_p_w_picpath_file:指定菜單的背景圖片;此圖片只能為14bits色,xpm格式,gzip壓縮;
hiddenmenu:隱藏菜單
title TILTE STRING:顯示于菜單中的標題
root
kernel
initrd
■若由于grub.conf文件錯誤或丟失而無法自動進入系統,可通過grub命令行引導系統后再手動更改或創建這個文件
[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目錄下的內核和臨時根文件復制一份到根分區下 [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 #添加如下幾行,構成一個新的啟動項 title testCentos #新的標題 root (hd0,1) #現在根分區下也有內核和臨時根文件,根分區為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
6、grub保護機制:可防止惡意用戶隨意進入單用戶模式修改root密碼
①生成密碼:
grub-md5-crypt
②保護所有內核,需要在title之外添加
password --md5 密碼串
③保護使用某內核,則需要在內核對應的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之外可保護所有內核 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 #可保護使用指定內核 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
7、安裝grub的方式:
方法1:使用grub-install命令
grub-install [--root-directory=DIR] DEVICE
DEVICE:針對哪個磁盤安裝
--root-directory=DIR:指定grub映像文件(主要是“stage 2”)的存放位置,默認為當前系統根目錄。grub-install會在指定的目錄下創建boot/grub/的層級目錄,并將生成的“stage 2”置于DIR/boot/grub/下。因為內核與initramfs文件通常位于boot目錄下,故一般將DIR指定為boot目錄的父目錄;當然,我們也可以指定為其它目錄,但要手動編輯grub.conf文件重新指明內核文件的位置。
例如 mount /dev/sdb1 /mnt/boot
grub-install --root-directory=/mnt/ /dev/sdb
方法2:輸入grub命令進入grub命令行
root (hd0,0):相當于上面的--root-directory=DIR
setup (hd0):為哪個磁盤安裝
quit:退出
情景1:grub損壞但系統還未關閉或重啟,此時可直接使用上面的兩種方法修復
[root@node2 ~]# dd if=/dev/zero of=/dev/sda bs=400 count=1 #將MBR中的引導加載程序沖刷掉,注意不能殃及分區表 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損壞且系統已關閉,這時候可用如下兩種方式修復:
方式一:將故障磁盤掛載于其它正常主機上重裝grub
①手動將node1的磁盤的grub損毀并關機
[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上(關于 如何在不重啟的情況下識別新增硬盤 見末尾補充部分)
③掛載node1的分區并安裝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. # 注意:若這里提示找不到相應的BIOS驅動,可使用選項--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啟動即可
方式二:插入系統光盤進入救援模式修復
①將Linux安裝光盤放入光驅。硬盤的MBR損壞后,BIOS會自動從光盤引導,進入菜單頁面后,選擇進入“救援模式”
②系統會檢測硬件,引導光盤上的Linux環境,依次提示選擇救援模式下使用的語言、鍵盤以及是否需要設置網絡,可按需選擇
③接下來系統會查找根分區,出現掛載提示,硬盤的根分區將被掛載到光盤Linux環境的/mnt/sysp_w_picpath目錄下;默認選項“continue”表示掛載權限為讀寫,“Read-only”為只讀,如。此處,因為要對系統進行修復,故需要有讀寫權限,選擇“continue”。
④按提示執行“chroot /mnt/sysp_w_picpath”切換根環境并安裝grub,然后退出shell并重啟即可
chroot:切換根環境,即以指定的目錄作為根
用法:chroot /path/to/directory [SHELL]
例如 chroot /mnt/sysp_w_picpath /bin/tcsh #將sysp_w_picpath作為根目錄,并運行其中的tcsh
補充:如何實現不重啟linux而識別新增硬盤?
新增硬盤后,使用如下命令識別:
echo "scsi add-single-device w x y z" > /proc/scsi/scsi
其中:
w 是主機適配器標識,第一個適配器為零(0)
x 是主機適配器上的SCSI通道,第一個通道為零(0)
y 是設備的SCSI標識
z 是LUN號,第一個LUN為零(0)
執行上述命令前,要先查看/proc/scsi/scsi,確定新增硬盤的ID
相反,在不重啟系統的情況下將硬盤從系統中移除的命令為:
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 #可以看到,當前最大ID號為00,因此新增硬盤的ID號應為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
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。