1. 程式人生 > >grub和grub2相關概念

grub和grub2相關概念

系統啟動 grub initramfs initrd grub2

一、GRUB(Boot loader)
二、Grub的命令行接口
三、/etc/grub/grub
四、進入單用戶模式
五、Grub損壞,修復
六、救援模式
七、ramdisk文件的管理和initrd
八、grub2詳解


一、GRUB(Boot loader)
Grub:GRand Unified Bootloader
Grub 0.x:grub legacy
Grub 1.x:grub2
grub legacy:
stage:mbr
stage1_5:mbr之後的扇區中,讓stage1中的bootloader能識別stage2所在的分區上的fs

//提供stage2的文件系統所需的驅動
stage2:磁盤分區之上的,提供選擇界面,供用戶選擇os
stage2及內核等通常放置於一個基本磁盤分區
配置文件:/boot/grub/grub.conf鏈接文件:/etc/grub.conf
功用:
1.提供菜單,並提供交互式接口
e:編輯模式,用於編輯菜單
c:命令模式,交互式接口
root (hd0,0) //CentOS7的,有時需要set root=
kernel /vmlinuz-x86_64 ro root=/dev/mapper/vg0-root
initrd /intramfs*.img
boot //開機即可

CentOS7:
insmod gzio
insmod part_msdos
insmod xfs
set root=(hd0,msdos1)/Centos7如何使用
linux16 /vmlinuz-3.*.x86_64 root=/dev/mapper/centos-root ro //linux取代grub的kernel
//註意vmlinuz前面的 / 不能去掉
initrd16 /initramfs-*.img
boot //重新啟動即可
註意:linux16 root=/dev/mapper/centos-root 必須指定,否則會出錯
指定root文件路徑
2.加載用戶選擇的內核或OS
允許傳遞參數給內核
可隱蔽此菜單
3.為菜單提供了保護機制
為編輯菜單進行認證
為啟用內核或os系統進行認證
二、Grub的命令行接口
help:獲取幫助列表
help root //查看root的幫助信息,設置grub的根設備
//此時os尚未啟動,但是grub有自己的fs驅動可以直接訪問
//但是grub的fs驅動是有限的,不可能太大,因此不能識別軟fs,raid,lvm等
help KEYWORD:詳細幫助信息
//boot是可以不單獨分區的,根fs如果使用基本分區的話
//但是根fs,必須能夠被grub識別才可以
//如果root直接指定根所在分區,boot文件也放在跟分區中也是可以的
//這時grub root需要指定根所在分區,並能夠識別該分區
如何標識設備:
(hd#,#) //第#塊磁盤的,第#個分區
(hd0,0) //
find (hd#,#)/vmlinuz-
root DEVICE //設置根設備 root (hd0,0)
kernel /PATH/TO/KERNEL_FILE //vmlinuz:z標識壓縮存放,設定本次啟動時用到的內核文件
//額外內核支持的很多參數
init=/paht/to/init
selinux=0
root=/dev/mapper/centos-root //根文件系統所在
ro 只讀
quiet 靜默模式
initrd /PATH/TO/INITRAMFS_FILE //設定為選定的內核提供的額外的文件的ramdisk
boot :引導啟動選定的內核

grub2命令行:
set root=
set timeout=
ls (hd1,1)/
search -f /ntldr
boot啟動
linux16 指定內核文件
initrd16 指定initrd文件

三、/etc/grub/grub.conf :Centos5,6
配置項:
default=# //哪個用來默認啟用,菜單項(title)編號從0開始
timeout=5 //指定菜單選項等待選項的時長
splashimage=(hd#,#)/PATH/TO/INITRAMFS_FILE //默認啟用的界面
//password [--md5] STRING:菜單編輯認證 //可以不用
hiddenmenu=[0/1] //隱藏菜單
title TITLE //定義菜單項“標題”
root (hd#,#):grub查找stage2及kernel文件所在的設備分區,為grub的“根”
kernel /PATH/TO/VMLINUZ_FILE [ARG] :啟動的內核
initrd /PATH/TO/INITRAMFS_FS :內核匹配的ramfs文件
//password [--md5] STRING:啟動選定到的內核或os時進行認證
加密命令:grub-md5-crypt
password --md5 jisdjfidjsifjsdiyeou
password xiaoxin //可以明文存放,但是不安全
CentOS7:
grub2-setpassword

四、進入單用戶模式
1.編輯grub菜單(e命令)
2.kernel 最後加上 single/1,s/S
3.在kernel所在行,鍵入“b”命令 //Cenetos7 ctrl+x
CentOS7:也是如此

五、Grub損壞,修復
安裝grub
//雙系統:建議先安裝windows後安裝linux
grub-install /grub2-install
安裝新的grub
mkdir /mnt/boot
mount /dev/sdb1 /mnt/boot //sdb是一個新硬盤
grub-install --root-directory=/mnt /dev/sdb
//指定root目錄/mnt只需指定mnt即可,而不是/mnt/root
grub將安裝在sdb這個硬盤上的mbr中
新加一個硬盤://當拆了第一個硬盤之後,他就變成了sda
sdb1:boot
sdb2:swap
sdb3:/
vim /mnt/boot/grub/grub.conf
default=0
timeout=5
title CentOS (EXpress)
root (hd0,0)
kernel /vmlinuz ro root=/dev/sda3 selinux=0 init=/bin/bash //
initrd /initramfs.img
cp /boot/vmlinuz* /mnt/boot/vmlinuz
cp /boot/initramfs /mnt/boot/initramfs.img
mkdir /mnt/boot/sysroot ; cd /mnt/boot/sysroot
mkdir -pv etc bin sbin lib lib64 dev proc sys tmp var usr home mnt media

ldd /bin/bash //查看bash依賴的庫
cp bash命令
chroot /mnt/sysroot/ //切換根就可以了
創建一個新的虛擬機
然後使用剛才建立的硬盤

破壞分區表:
dd if=/dev/zero of=/dev/sda bs=200 count=1 //小於446,分區表不要破壞
1.grub-install --roo-directory=/ /dev/sda
2.grub 命令模式修復
root (hd0,0) //必須有grub目錄,裏面的stage1,stage1_5都是存在的
setup (hd0) //安裝第一階段到第一塊硬盤上
exit
六、救援模式
借助於光盤實現
linux rescue //命令行鍵入,進入救援模式
默認會掛載原有的os到/mnt/sysimage上
chroot /mnt/sysimage
grub-install --root-directory=/ /dev/sda
exit //退出到光盤鏡像
reboot即可

練習:
1.新加硬盤,提供直接單獨運行bash系統
硬盤:新加硬盤-->分區-->mount--
sdb1:/mnt/boot: //sdb1掛載地 :: /mnt/boot/[vmliuz,intramfs,grub{grub.conf}] //切換目錄
sdb3:/mnt/sysroot: //sdb3掛在地 ::bin[bash],etc,sbin.. //真實的根
grub-install: /mnt
grub文件
kernel ... init=/bin/bash
註:創建grub的那臺主機,需要關機,才可以,否則kernel panic
2.破壞本機bootloader,grub stage1,在救援模式下修復
3.為grub設置保護功能

七、ramdisk文件的管理和initrd
1.mkinitrd ,Centos5,6
2.dracut,Centos6,7
mkinitrd [options] [initrd-img] kernel-versio
//為當前正在使用中的內核重新制作ramdisk文件
mkinitrd /boot/initramfs-$(uname -r).img $(uname -r)
--with=[module] //手動加載其他模塊到initrd文件中
--preload //initramfs所聽的模塊,需要預先加載的模塊
dracut 命令
//更底層,更功能更強悍
dracut /boot/initramfs-$(uname -r).img $(uname -r)
mkinitrd -v -f myinitrd.img $(uname -r)
-f指定要創建的映像文件,指定內核版本

boot loader裝入kernel, 然後kernel需要執行/sbin/init, 讀取這個文件就必須先mount根文件系統,

早期是通過啟動時的root=參數告訴內核根文件系統在哪個設備上

現在根文件系統可能位於一個網絡存儲如NFS或者raid上,比如RAID而散布於多個設備上, 可能位於一個加密設備上需要提供用戶名和密碼,這時root=參數就顯得不夠了. 為了應付這種局面, 先後出現兩種機制來作為boot loader裝載kernel到真正的/sbin/init執行這個啟動的橋梁
initrd和initramfs
相同之處:都是由內核執行其上的某個程序(initrd是/linuxrc, initramfs是/init)由這個程序決定加載什麽驅動以及如何裝載根文件系統

initrd:
ram disk是一個基於ram的塊設備,因此它占據了一塊固定的內存,而且事先要使用特定的工具比如mke2fs格式化,還需要一個文件系統
驅動來讀寫其上的文件。如果這個disk上的空間沒有用完,這些未用的內存就浪費掉了,並且這個disk的空間固定導致容量有限,要想裝入更多的文件就需要重新
格式化。由於Linux的塊設備緩沖特性, ram disk上的數據被拷貝到page cache(對於文件數據)和dentry cache(對於目錄項), 這個也導致內存浪費.

initramfs:
最初的想法是Linus提出的: 把cache當作文件系統裝載. 他在一個叫ramfs的cache實現上加了一層很薄的封裝, 其它內核開發人員編寫了一個改進版tmpfs, 這個文件系統上的數據可以寫出到交換分區, 而且可以設定一個tmpfs裝載點的最大尺寸以免耗盡內存.
initramfs就是tmpfs的一個應用.
優點:
(1)tmpfs隨著其中數據的增減自動增減容量.
(2)在tmpfs和page cache/dentry cache之間沒有重復數據.
(3)tmpfs重復利用了Linux caching的代碼, 因此幾乎沒有增加內核尺寸, 而caching的代碼已經經過良好測試, 所以tmpfs的代碼質量也有保證.
(4)不需要額外的文件系統驅動.

另外, initrd機制被設計為舊的"root="機制的前端, 而非其替代物,它假設真正的根設備是一個塊設備, 而且也假設了自己不是真正的根設備,
這樣不便將NFS等作為根文件系統, 最後/linuxrc不是以PID=1執行的, 因為1這個進程ID是給/sbin/init保留的. initrd機制找到真正的根設備後將
其設備號寫入/proc/sys/kernel/real-root-dev, 然後控制轉移到內核由其裝載根文件系統並啟動/sbin/init.

initramfs則去掉了上述假設, 而且/init以PID=1執行, 由init裝載根文件系統並用exec轉到真正的/sbin/init, 這樣也導致一個更為幹凈漂亮的設計.


initramfs制作:
1. 查看initramfs的內容
# mkdir temp ; cd temp
# cp /boot/initrd.img-2.6.24-16 initrd.img-2.6.24-16.gz
# gunzip initrd.img-2.6.24-16.gz
# cpio -i --make-directories < initrd.img-2.6.24-16

2. 創建initramfs
命令:mkinitramfs, update-initramfs

1) mkinitramfs
# mkinitramfs -o /boot/initrd.img 2.6.24-16
Note: 2.6.24-16是需要創建initramfs的kernel版本號,如果是給當前kernel制作initramfs,可以用uname -r查看當前的版本號。
提供kernel版本號的主要目的是為了在initramfs中添加指定kernel的驅動模塊。
mkinitramfs會把/lib/modules/${kernel_version}/ 目錄下的一些啟動會用到的模塊添加到initramfs中。
2)update-initramfs
更新當前kernel的initramfs
# update-initramfs -u
在添加模塊時,initramfs tools只會添加一些必要模塊,用戶可以通過在/etc/initramfs-tools/modules文件中加入模塊名稱來指定必須添加的模塊。

initrd制作:
#mkinitrd /boot/initrd.img $(uname -r)
如果需要指定哪些module在啟動時必須load,需要加上--preload=module或者 --with=module這樣的選項。 這兩者的區別在於--preload指定的module會在/etc/modprobe.d/* 裏聲明的任何SCSI模塊之前被加載,--with指定的module會在/etc/modprobe.d/* 裏聲明的任何SCSI模塊之後被加載。
另外還有一個選項需要被註意,即--builtin=module。在manual裏這個選項的解釋是:Act as if module is built into the kernel being used. mkinitrd will not look for this module, and will not emit an error if it does not exist. This option may be used multiple times.
根據上面的解釋,可以看出builtin選項另外還有一個取巧的用處。以我所用的平臺Acer Aspire One為例, 我在用mkinitrd制作RAM disk鏡像是出現一個錯誤“No module ohci-hcd found ...”,遇到這個情況,builtin選項就起作用了,用--builtin=ohci-hcd, mkinitrd就可以忽略ohci-hcd不存在這個事實了。

八、grub2詳解
GRUB2是借鑒GRUB改寫到更加安全強大到多系統引導程序,現在大部分較新的Linux發行版都是使用GRUB2作為引導程序的。
GRUB2采用了模塊化設計,使得GRUB2核心更加精煉,使用更加靈活,同時也就不需要像 GRUB那樣分為stage1,stage1_5,stage2這樣三個階段了。
GRUB2和GRUB相比具有如下一些新特征:
無 stage1 stage1.5 stage2
配置文件采用新語法,支持腳本,假如新的命令,配置文件名為 grub.cfg
配置文件 grub.cfg不可寫,由 grub2-mkconfig 自動產生,由 update2-grub 維護。
分區號不再從 0開始,而是從 1開始
支持更多到文件系統,如:ext4、hfs、ntfs,並可以直接從 lvm和raid中讀取文件/li>
grub2有更可靠的方法在磁盤上有多系統時發現文件和目標內核,可以用命令發現系統設備號或者UUID。
引入了設備模塊,使得 core 鏡像保持更小到尺寸
在啟動時沒有選擇菜單的話,按住shift即可強制顯示菜單

GRUB2主要鏡像文件:

    boot.img
    boot.img 相當與 GRUB 的 stage1 它被寫入 MBR或 boot分區,它不能識別任何文件系統,在GRUB2安裝時GRUB2內核鏡像在磁盤中到位置寫入到 boot.img 中,這就使得 boot.img 能夠在不能識別文件系統的情況下加載內核鏡像。
    cdboot.img
    當從CD引導情況下被寫入內核鏡像第一個扇區到內容,它負責加載其余的內核鏡像到內存。
    diskboot.img
    當從磁盤引導情況下被寫入內核鏡像第一個扇區到內容,它負責加載其余的內核鏡像到內存。
    pxeboot.img
    當從網絡啟動時使用到的。
    kernel.img
    此鏡像包含GRUB2運行時包含的基本工具,框架驅動、文件句柄、環境變量、安全模式命令行解析器等,他可以直接使用但是通常它會被編譯進所有的內核鏡像中使用。
    core.img
    這是GRUB2的內核鏡像,它由grub-mkimage程序將kernel.img和一些模塊動態編譯而成,一般情況下他已經包含足夠的模塊去訪問/boot/grub,模塊機制使得內核鏡像能保持很小的尺寸。在某種程度上,它可以被視為 GRUB 中的 stage2。
    *.mod
    這是一些可以動態加載的一些模塊,當我們需要時,可以將它們可以被動態加載編譯進內核鏡像,也可以使用insmod手動加載。他們就代替 GRUB 中的 stage1_5 之類到鏡像。

安裝 GRUB2
一、grub2-install 腳本

    1.安裝 GRUB 文件到 /boot/grub2
    2.復制/usr/lib/grub/i386-pc/ 目錄下的*.mod、*.lst、*.img到/boot/grub目錄下
    3.調用grub2-probe掃描計算機並收集磁盤和分區信息
    4.調用grub2-mkimage構建一個新的new.img
    5.grub2-setup把grub的boot.img寫入MBR中,把core.img寫進設備的第一個扇區

二、grub2-install 不會調用 grub2-mkconfig生成grub.cfg 我們需要手動調用。

    1.grub2-mkconfig腳本調用grub2-mkdevicemap和grub2-probe生成grub.cfg
    2.調用 grub2-set-default設置進入系統的默認內核
    3.調用 grub2-mkdevicemap生成新的device.map,grub-mkdevicemap程序可以創建
    device.map文件,在執行grub-install時會自動執行他以創建映像關系,如果文件不存在,
    則會讀取/boot/grub2/devicd.map這個文件,如果映像文件存在,
    則grub讀取他創建BIOS drives to OS drives

GRUB2配置
GRUB2不再使用 menu.list,而是使用全新的配置文件 /boot/grub2/grub.cfg,文件權限為 444,其目的就是為避免手動更新,我們可以借助 grub2-mkconfig -o /boot/grub2/grub.cfg 命令來更新。/boot/grub2 下到模塊可以按需自動加載,模塊可以在配置文件中配置,每個模塊以 ### BEGIN /etc/grub.d/module_config_name ###開始,以### END /etc/grub.d/module_config_name ### 結束,這些對應的模塊文件位於 /etc/grub.d目錄之下,次目錄下的文件名前面到數字決定了文件的執行順序,數字越小越先執行,自定義選項在40_custom中定義,這些文件必須有執行權限才會被update-grub讀取,並把配置合並到grub.cfg中。

   /etc/grub.d/00_header
    配置初始的顯示項目,如默認選項,時間限制等,一般由/etc/default/grub導入,一般不需要配置
    /etc/grub.d/05_debian_theme
    配置引導畫面,文字顏色等主題
    /etc/grub.d/10_linux
    定位當前操作系統使用中的root設備內核的位置
    30_os-prober
    用來搜索linux和其他系統,此腳本中的變量用來指定在/boot/grub/grub.cfg 和 grub2菜單中的名稱顯示方式,可以修改/etc/default/grub光比這個腳本
    40_custom
    用來加入用戶自定義的菜單樣板,將會在執行update-grub時更新至grub.cfg中
    41_custom
    判斷custom.cfg此配置文件是否存在,如果存在就加載它
    GRUB2在每次生成grub.cfg的時候,都會檢查並設置 /etc/default/grub 配置選項,我們可以通過修改/etc/default/grub來改變 GRUB2到行為。
    常用配置選項有以下這些:
    GRUB_DEFAULT
    制定默認菜單選擇項,可以是從0開始數字,也可以是 title 後面的字符串,
    當值是‘saved’時有特殊含義:默認的菜單選則項會被保存在GRUB_SAVEDEFAULT中,
    下次啟動時會從這個值啟動。當值為saved時可以用grub2-set-default和grub2-reboot來設置默認啟動項,
    grub2-set-default到下次修改前都有效,grub2-reboot下次啟動時生效
    GRUB_SAVEDEFAULT
    只有這個值是true,GRUB_DEFAULT是saved時才會生效
    GRUB_TIMEOUT
    選擇菜單的顯示時間,默認是5,值是0表示不顯示菜單選項,值是-1表示無限等待用戶選擇
    GRUB_HIDDEN_TIMEOUT
    GRUB2第一次執行時會尋找其他操作系統,如果沒有檢測到則會將菜單隱藏,
    如果有其他操作系統才會顯示菜單,如果參數大於0,則會等待響應的秒數,
    但是不會顯示菜單,可以按住shift顯示菜單。
    GRUB_DISTRIBUTOR
    菜單中的描述名稱,采用命令lsb_release判斷,應該是紅帽系列的,如果不是就歸為Debian
    GRUB_CMDLINE_LINUX
    此行將追加到所有的linux 定義內核行的後面,不論是救援模式還是一般模式
    GRUB_CMDLINE_LINUX_DEFAULT
    次選項只會追加在一般模式後面,同上
    GRUB_TERMINAL=console
    啟用console,默認不啟用
    GRUB_DISABLE_LINUX_UUID=true
    在GRUB2中指定root時可以使用UUID,默認不啟用
    GRUB_GFXMODE=640×480
    圖形化菜單的分辨率,默認不啟用
    GRUB_DISABLE_LINUX_RECOVERY=true
    禁止顯示救援模式
    This entry was written by zpz, posted on 2012 年 11 月 13 日 at 下午 12:01, filed under linux, linux系統管理, shell and tagged grub, GRUB2, grub配置. Bookmark the permalink. Follow any comments here with the RSS feed for this post. Post a comment or leave a trackback: Trackback URL.


本文出自 “黑馬騰空” 博客,請務必保留此出處http://hmtk520.blog.51cto.com/12595610/1980077

grub和grub2相關概念