<span style="font-family: 楷體, 楷體_GB2312, SimKai;">42.grub.md</span>
GNU GRUB(GRand Unified Bootloader簡稱“GRUB”)是一個來自GNU項目的多作業系統啟動程式。GRUB是多啟動規範的實作,它允許使用者可以在計算機内同時擁有多個作業系統,并在計算機啟動時選擇希望運作的作業系統。GRUB可用于選擇作業系統分區上的不同核心,也可用于向這些核心傳遞啟動參數。
回憶下開機流程:BIOS(POST)--> Boot Sequence(BIOS) --> Boot Loader (MBR) --> Kernel(ramdisk) --> rootfs --> switchroot --> /sbin/init -->(/etc/inittab, /etc/init/*.conf) --> 設定預設運作級别 --> 系統初始化腳本 --> 關閉和啟動對應級别下的服務 --> 啟動終端
從以上流程可以看出,grub處于系統硬體初始化完成和核心初始化開始之前的位置,grub的功能就是;基于硬體環境(就是一個基本功能完整的主機環境),提供一個菜單,允許使用者選擇要啟動的系統或不同的核心版本; 把使用者標明的核心裝載到RAM中的特定空間中、解壓、展開,而後把系統控制權移交給核心。
CentOS5,6版本用grub 0.x版本:也就是grub legacy, grub 1.x也就是grub2。目前企業應用中較為常用的系統時CentOS6,是以grub1版本是最為常用的,是以基于centos6.7,暫時介紹grub1這個版本。
grub legacy分段設計為stage1,stage2,其中還存在grub stage1.5,其差別與功用如圖:
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuMjN5k1QPtGWoRkVBFUQzE3dGF1NyVlNiFDTvl2S39CXDNzLcV0NvwFMw00LcJDMzZWe39CXt92Yu8GdjFTNuUzcvw1LcpDc0RHaiojIsJye.png)
grub配置檔案為 /boot/grub/grub.conf 由上圖可以看到,該檔案位于磁盤上,
grub的功用:功能和作用不一樣,作用是功能的必須,功能是作用的升華。
(1) 提供菜單、并提供互動式接口
e: 編輯模式,用于編輯菜單;
c: 指令模式,互動式接口;
(2) 加載使用者選擇的核心或作業系統
允許傳遞參數給核心
可隐藏此菜單
(3) 為菜單提供了兩種保護機制
為編輯菜單進行認證
為啟用核心或作業系統進行認證
grub的指令行接口(centos 6,centos7 和6很大不同)
help: 擷取幫助清單
help KEYWORD: 詳細幫助資訊
find (hd#,#)/PATH/TO/SOMEFILE #在指定裝置查找檔案
root (hd#,#) # boot檔案所在的根檔案所在裝置
kernel /PATH/TO/KERNEL_FILE # 設定本次啟動時用到的核心檔案;額外還可以添加許多核心支援使用的cmdline參數;
例如:init=/path/to/init, selinux=0 # 使用這個init作為init程式, selinux=0
root=/dev/DEVICE #指定核心根檔案系統的分區
initrd /PATH/TO/INITRAMFS_FILE #設定為標明的核心提供額外檔案的ramdisk;必須與核心版本完全比對。
boot: 引導啟動標明的核心;
如何手動在grub指令行接口啟動系統:
grub> root (hd#,#)
grub> kernel /vmlinuz-2.6.32-584.el6.x86_64 ro root=/dev/mapper/vg0-root quiet
grub> initrd /initramfs-2.6.32-584.el6.x86_64.img
grub> boot
grub 如何識别裝置:
(hd#,#):
hd#: 磁盤編号,用數字表示;從0開始編号
#: 分區編号,用數字表示; 從0開始編号
示例:(hd0,0)
說明:grub從grub2開始不用0辨別磁盤和分區第一個為:hd(1,1)辨別
配置檔案:
/boot/grub/grub.conf 有連結檔案為 /etc/grub
配置項:
default=#: 設定預設啟動的菜單項;菜單項(title)編号從0開始;
timeout=#:指定菜單項等待選項選擇的時長;
splashp_w_picpath=(hd#,#)/PATH/TO/XPM_PIC_FILE:指明菜單背景圖檔檔案路徑;
hiddenmenu:隐藏菜單;hiddenmenu會顯示讀秒而不進入菜單,回車進菜單,否則顯示菜單,等待使用者選擇;
password [--md5] STRING: 設定認證方式,菜單編輯認證;按“e”鍵的編輯的時候就會提示輸入該密碼
title TITLE:定義菜單項“标題”, title 可出現多次,進而引導不同的核心;
[縮進]root (hd#,#):grub查找stage2及kernel檔案所在裝置分區;為grub的“根”;
[縮進]kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS] root=/dev/sdb2 init=/bin/bash :啟動的核心,root指定核心rootfs根裝置位置,init指定啟動init程式位置。
init
[縮進]initrd /PATH/TO/INITRAMFS_FILE: 核心比對的ramfs檔案;
[縮進]password [--md5] STRING: 啟動標明的核心或作業系統時進行認證;
grub密碼生成工具
grub-md5-crypt工具可以生成指令,由于grub.conf是對所有使用者可見的,是以建議用--md5指定加密碼串。
grub-md5-crypt
輸入密碼:
再次輸入密碼:
進入單使用者模式:
(1) 編輯grub菜單(標明要編輯的title,而後使用e指令);
(2) 在標明的kernel後附加
1, s, S或single都可以;
(3) 光标定位在kernel所在行,鍵入“b”指令,進入單使用者模式;
恢複grub
安裝grub:
1) grub-install
grub-install --root-directory=ROOT /dev/DISK # 所有階段1、1.5、2 階段。??是否需要存在grub目錄的stage1,1_5、2檔案
dd if=/dev/zero of=/dev/sda bs=200 count=1
grub-install --root-directory=/ /dev/sda
reboot
(2) grub # 需要所有階段1、1.5、2 階段。
grub> root (hd0,0) root (hd0,0)
Filesystem type is ext2fs, partition type 0x83
grub> setup (hd0)
setup (hd0)
Checking if "/boot/grub/stage1" exists... no
Checking if "/grub/stage1" exists... no
說明:setup 會需要檢測是否存在/boot/grub/stage1setup (hd0)
Checking if "boot/grub/stage1" exits... no
Checking if "/grub/stage1" exits... yes
Checking if "/grub/stage2" exits... yes
Checking if "/grub/e2fs_stage1_5" exits... yes
Running "enbed /grub/e2fs_stage1_5 (hd0)" .. 27 sectors are enbended.successed
Runing "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf" ... succededDone