1、初識grub所扮演的角色linux
GNU GRUB(GRand Unified Bootloader)是一個來自GNU項目的多操做系統啓動程序。GRUB是多啓動規範的實現,它容許用戶能夠在計算機內同時擁有多個操做系統,並在計算機啓動時選擇但願運行的操做系統。GRUB可用於選擇操做系統分區上的不一樣內核,也可用於向這些內核傳遞啓動參數。因而可知它功能的強大。如今去看看這個傳說中的多操做系統啓動程序到底長什麼樣子。shell
[root@www ~]# grubvim
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, TABapp
lists possible command completions. Anywhere else TAB lists the possibleide
completions of a device/filename.]測試
grub> ui
grub> this
經過登陸grub界面,不難,看出當前的grub的版本是0.97。時至今日其實grub的版本已經有1.x的版本。可是有點其實須要說明的。Grub的0.x和1.x版本之間區別很大,大到能夠認爲1.0以後的版本,是從新編寫的。
二、進一步剖析grub
在啓動系統的時候,須要去加載grub,那麼在加載grub的過程中,首先stage1先實現加載MBR。而MBR存儲在磁盤的第一個扇區,公共512個字節。其中MBR只佔據446個字節。其餘64被分區表佔據。最後兩個字節表示分區列表的結束符55AA。
stage1_5;mbr以後的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;stage2:磁盤分區(/boot/grub/)等一般放置於一個基本磁盤分區上;
功能:
(2)加載用戶選擇的內核或操做系統
容許傳遞參數給內核
可隱藏此菜單
(3)位菜單提供了保護機制
未編輯菜單進行認證
未啓用內核或操做系統進行認
Grub程序正常狀況下回存儲在磁盤上。存儲的形式以下:
(hd0,0)這裏我以一塊磁盤爲例。(grub0.x版本下)
Hd0: 磁盤編號,用數字表示;從0開始編號
0: 分區編號,用數字表示; 從0開始編號
而在grub1.x以後,從1開始。
接下來去看看當登陸linux系統的時候,所需經歷的grub的過程以下:
當登陸上面的界面的時候,不難發現,下面有一些提示信息。經過這些提示信息,能夠很好對其進行操做。其中e:編輯模式,用於編輯菜單;c:命令模式,交互式接口。
當按C鍵的時候,直接進入grub交互接口。你能夠在grub裏面選擇你的root啓動內核,選擇啓動你想要的內核版本。以下:
經過輸入如上這些信息,就可以登陸linux系統。因爲內核版本信息不同。因此須要的一些信息也不一樣。簡單的說主須要注入以下這些信息便可。
grub> root (hd#,#)
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE
grub> initrd /initramfs-VERSION-RELEASE.img
grub> boot引導選擇好的內核
但其實若是你在登陸grub以後,若是不知如何操做還以經過help尋求幫助。接下來我列出一些我的認爲比較經常使用的命令
grub> help
boot cat FILE
clear module FILE [ARG ...]
configfile FILE device DRIVE DEVICE
find FILENAME initrd FILE [ARG ...]
對於其餘的一些使用方法,你們能夠自行去了解一下。我的以爲仍是比較簡單
三、具體瞭解grub的詳情。
接下來去了解grub的配置文件,這樣可以更加直觀的瞭解grub的配置文件。使得你們可以更好的瞭解使用grub。Grub.conf的配置文件有兩處能夠進入配置修改。
[root@www ~]# ll /boot/grub/grub.conf
-rw-------. 1 root root 1154 Sep 5 2015 /boot/grub/grub.conf
[root@www ~]# ll /etc/grub.conf
lrwxrwxrwx. 1 root root 22 Aug 14 13:11 /etc/grub.conf -> ../boot/grub/grub.conf
說是兩處其實就一處,etc目錄下的是boot下的grub.conf的鏈接文件。其實配置文件裏面所配置的文字不多,很好理解。其配置文件以下:
[root@www ~]# vim /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/mapper/vg0-root
# initrd /initrd-[generic-]version.img
其實grub文件內部已經提供模板,對於初學者來講,仍是頗有幫助的。
#boot=/dev/sda———提示說明boot在哪塊硬盤上
default=0——設備默認啓動菜單項,
timeout=5——菜單被選擇的等待時間默認五秒;
splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz——:指明菜單背景圖片文件路徑;
Hiddenmenu——默認啓動隱藏菜單,再啓動系統的時候,若是不起啓動,不會顯示;
title CentOS 6 (2.6.32-504.el6.x86_64)——定義菜單項「標題」,可出現屢次;
root (hd0,0)——grub查找的stage2及其kernel文字所存儲的分區。
kernel /vmlinuz-2.6.32-504.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet——指定內核的版本信息及其,掛載根文件系統的模式,默認以只讀形式啓動。指定語言格式,還有才是合做根式建立分區。而且以靜默形式輸出文件系統。
initrd /initramfs-2.6.32-504.el6.x86_64.img——指定init的版本,注意init的版本必須和內核的版本保存一致。
此外在這個配置文件當中,能夠加入密碼的設置選項,這樣能必定程度的保障grub的安全性,避免隨意被破壞。格式以下:
Password——md5——採起MD5的方式進行加密。
同時還能夠給選定的內核和init叫上密碼保護。
可是這個時候有人就會好奇,既然可以加密,若是採用命名的方式加密。那麼密碼泄露的概率很大。這樣設置密碼的意義就是去了。由於設計者,有特地編寫了加密程序。加密格式以下:
[root@www ~]# grub-md5-crypt
Password:
Retype password:
$1$Wc3lO$6GQUBBT2YJEzd7x06dcrs.
這樣就生成一個加密過的密碼,而後把它添加至grub.conf中去:格式以下
password --md5 $1$Wc3lO$6GQUBBT2YJEzd7x06dcrs.
把這條命令也在須要選擇啓動的內核後面加上便可。以後重啓系統能夠測試
重啓啓動系統的時候會提須要輸入密碼才能操做,這樣才必定程度上保護系統。
四、grub的損壞修復方式。
對於grub的保護只管重要,一旦grub損壞。那麼系統也就被損壞了,只能經過修復grub。讓grub正常跑起來。接下來介紹幾種修復grub的方式。首先破壞了grub。對於grub你們都知道,主要就是磁盤分區最開始的第一扇區的446個字節。你們在破壞的時候儘可能別去破壞512個字節。否則連分區表一塊損壞,否則這就啓動不了。建議在測試的時候,儘可能備份一MBR。接下演示破話及其修復過程。
[root@www ~]# dd if=/dev/sda of=/tmp/mbr.bak bs=512 count=1
1+0 records in對grub進行備份
1+0 records out
512 bytes (512 B) copied, 0.000163604 s, 3.1 MB/s
[root@www ~]# dd if=/dev/zero of=/dev/sda bs=300 count=1
1+0 records in破壞MBR表。
1+0 records out
300 bytes (300 B) copied, 0.000267628 s, 1.1 MB/s
[root@www ~]# sync同步到磁盤,如今grub已經被損壞,若是重啓系統,確定啓動不了,連grub都進入不了
接下里演示若是可以修復grub
[root@www ~]# grub-install --root-directory=/ /dev/sda ——指明安裝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@www ~]# sync
除了能夠經過上面的方式修改其實還能夠切花到grub下,去修復grub程序。
執行上面三步便可。出去上面兩種方法還能夠經過系統光盤進行修復grub。而且這種方法是必需要掌握的一種,接下來演示如何修復grub。
先破話MBR表,仍是使用上面的方法;
[root@www ~]# dd if=/dev/zero of=/dev/sda bs=300 count=1
1+0 records in破壞MBR表。
1+0 records out
300 bytes (300 B) copied, 0.000267628 s, 1.1 MB/s
接下來去重啓系統,會發現系統MBR已經被破壞了
接下來演示若是經過光盤修復grub:
當選擇光盤啓動的時候,選擇啓用救援模式進行修復grub,而後回車,而後會進入下面這個界面。接下來的這不和下一步都選擇默認安裝便可。
而後會彈出讓你選擇是否啓動網絡服務,這一步我建議不選擇啓動網絡服務。
借來下一步系統會提你對於救援一些所須要的注意的幫助信息須要作選擇,選擇繼續continue便可。
接下來的幾步都默認選項便可:在選擇的時候,須要注意一點,光盤有提示若是可以切換到以前的系統上去。以下
接下來光盤須要讓你選擇模式,須要shell模式便可,而後就會進入文字就沒模式下
接下來進入救援模式,而後切花到系統模式下進行修復grub
而後執行第一種修復方式就能修復grub。而後退出救援模式重啓便可
對於grub的講解到這裏差很少,有些地方沒有詳盡說明,保持歉意!!!