Linux系統啓動流程之(2)grublinux
Linux啓動流程中在引導bootloader時會檢查出磁盤的前446字節,從而找出/boot/grub下的相應的配置,來去掛載假根文件系統來解壓內核來完成根切換。算法
回顧啓動流程:shell
POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs--> switchroot--> /sbin/init-->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別--> 系統初始化腳本rc.sysinit--> 關閉或啓動對應級別的服務--> 啓動終端vim
vgrub: GRandUnified Bootloader安全
grub 0.x: grub legacybash
grub 1.x: grub2ide
grub legacy:工具
stage1: mbroop
stage1_5: mbr以後的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統測試
stage2:磁盤分區(/boot/grub/)
grub legacy說明:
配置文件:/boot/grub/grub.conf <---- /etc/grub.conf
stage2及內核等一般放置於一個基本磁盤分區
grub的功能:
(1)提供啓動菜單、並提供交互式接口
a:內核參數
e:編輯模式,用於編輯菜單
c:命令模式,交互式接口
(2)加載用戶選擇的內核或操做系統
容許傳遞參數給內核
可隱藏啓動菜單
(3)爲菜單提供了保護機制
爲編輯啓動菜單進行認證
爲啓動內核或操做系統進行認證
文件例子展現CentOS下:
grub主配置文件案例格式解析:
default=0 #設定默認啓動的title編號,從0開始 timeout=5 #等待用戶選擇的超時時長,單位是秒 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz #grub菜單的背景圖片文件路徑 hiddenmenu #隱藏菜單 password redhat #定義grub明文密碼,編輯grub時須要輸入密碼 password --md5 $1$6u/1v$4Jd.5YSDf9.5v1AnfJFRe0 #定義加密密碼 title Mylinux #內核菜單標題,通常爲操做系統名稱、字符串,可自由修改 root (hd0,0) #grub查找stage2及kernel文件所在的設備分區;爲/boot kernel /vmlinuz-2.6.18-308.el5 #內核文件路徑,及傳遞給內核的參數 initrd /initrd-2.6.18-308.el5.img #內核匹配的ramfs文件 password --md5 $1$6u/1v$4Jd.5YSDf9.5v1AnfJFRe0 #給內核加密碼
注意:這裏的(hd0,0)表示第1塊磁盤的第一個分區,通常找內核所在分區會以此格式來指定。
識別硬盤設備:
(hd#,#)
hd#:磁盤編號,用數字表示;從0開始編號
#:分區編號,用數字表示;從0開始編號
解析:那麼上面的gurb樣板格式裏的(hd0,0)表示第一塊硬盤,第一個分區
安裝grub的兩種方式:
第一種:交互式設置
前提:須要事先判斷grub在哪一個磁盤
#輸入grub命令進入交互式
[root@mzf ~]# grub grub> root (hd0,0) #使用 root (hd0,0)檢查磁盤0的第一個分區是否有文件系統 root (hd0,0) #顯示出文件系統類型,可使用find命令查看此目錄文件是否對應 grub> setup (hd0,0) #肯定安裝在此分區 .............. grub>quit #在系統裏操做完成後退出,在救援模式使用boot啓動
第二種方式:
grub-install --root-directory=/path/to/boot’s+parent_dir /PATH/TO/DEVICE
如:
[root@mzf ~]# grub-install --root-directory=/ /dev/sda 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-directory=指明的是boot目錄的父目錄,第二個參數表示在哪一個磁盤的前446字節安裝grub及(bootloader)。
案例1:修改grub中的信息自定義菜單:
一、修改文件配置
#查看源文件信息:
[root@mzf ~]# vim /boot/grub/grub.conf
#添加對應條目,設置標題等信息
解析:這裏標題裏沒有設置root (hd#,#),及指定root分區在哪一個磁盤的分區上,全部能夠直接使用(hd#,#)來表示root文件系統的路徑而後後面跟boot目錄下的對應文件路徑。
#保存後重啓啓動機器
[root@mzf ~]# reboot
#進入系統讀秒時按任意鍵,進入grub菜單
解析:進入grub菜單發現新增了一個剛剛在grub.conf配置文件中定義的title(MengTianba Linux),同時在菜單的下發顯示了一些grub的相關操做介紹:
按上↑或下↓鍵能夠來調整選擇哪一個grub引導入口,選擇後按回車表示從該條目引導。
按 e 鍵表示對選擇的條目進行編輯
按 a 鍵表示修改選擇條目的內核參數
按 c 鍵進入命令行交互界面
#此時能夠選擇按enter回車鍵直接進入剛纔添加的入口,這裏按e鍵來進行編輯
解析:這裏又進入了一個子菜單,而這個菜單是顯示剛纔選擇grub 條目中的信息,也就是grub.conf文件中定義的那行信息。同時這裏能夠也提示了一些關鍵鍵:
按e編譯內核參數
按c進入對應的子項交互編輯界面
按o表示追加一個新行,按O即是插入一個新行
按d刪除指定行
按b表示本身啓動引導
#這裏一樣可使用對kernel項按e或者按c,因而按e鍵
說明:這時能夠對此行進行編輯了,因而在root=/dev/sda2(指定系統所在分區)的後面加入一些參數,好比:selinux=0(關閉selinux功能)、max_loop=100(指定loop設備最大映射值)。因而添加以下:
解析:在後面添加本身想添加的內核參數後,發現上面提示有按ESC鍵能夠取消這次編輯不保存而回到上個子菜單,而按回車鍵會臨時保存內核參數,因而按回車回到子菜單。
解析:由於內核參過長所全部沒有徹底顯示,這裏按b鍵就可讓gurb按照設置好的內核參數來進行加載系統。,因而按b鍵--> boot啓動。
二、進入系統後,能夠查看剛纔設置的內核是否已經生效
#查看selinux安全上下文件功能是否已經被禁用
[root@mzf ~]# getenforce Disabled
#查看本地迴環設備是最大數量是否已經被修改到了100個
[root@mzf ~]# ls /dev/loop*
解析:如今能夠此時本地迴環設備以及提供了100個映射點,固然這只是測驗,真實中是用不到這麼多的本地迴環設備映射的。
#那麼剛纔設置的這些參數又被臨時保存到哪一個映射文件呢
[root@mzf ~]# cat /proc/cmdline ro root=/dev/sda2 selinux=0 max_loop=100
注:這裏的顯示的參數只是對於內核加載後生效的並設置的參數,只是臨時在內存中,重啓機器後就會失效。所以仍是須要修改grub.conf文件來使其永久生效:
#再次修改grub.conf文件,加入剛纔設置的禁用selinux和調整迴環設備最大映射數:
三、加密Grub,設置密碼
(1)生成口令
固然若是不想讓人隨意來編輯此grub條目,能夠設置對此設置密碼
爲了安全性,應使用加密的密碼,因而可使用下面命令來生成加密口令:
#使用專門用於生成grub中md5加密算法的grub-md5-crypt工具:
[root@mzf ~]# grub-md5-crypt << EOF > token.txt 2> /dev/null > 123456 > 123456 > EOF
#而後查看token.txt文件中保存的密鑰:
[root@mzf ~]# tail -n 1 token.txt $1$3jizv$jY.3FSjDvDkv0cpntbqvg/
(2)加密MengTianba單個title項
#而後進入vim界面來將剛纔的加密密鑰加入指定的 title條目中
可使用垂直分屏顯示模式同時打開token.txt和 grub.conf文件
[root@mzf ~]# vim -O token.txt /boot/grub/grub.conf
#而後對應修改,對MengTianba條目內核設置密碼
注意:口令的前面必需要password --md5參數來表示此字段爲設置此條目須要的安全口令。
(3)給grub引導加密
#一樣編輯grub.conf文件
[root@mzf ~]# vim /boot/grub/grub.conf
說明:在第一個title菜單選項行前面插入一行。
#而後進入末行模式,輸入命令讀取加密的文本讀入到此行
#按回車,發現口令已經被讀入此行
#此時保存文件退出,重啓機器測試,按按任意鍵進入 grub菜單
注意:此時發現雖然能進入grub菜單,可是下面的提示卻變了,只能按上下鍵選擇選擇後者按p鍵進入對應的grub引導,因而選擇自定義添加的那一行,按p鍵:
解析:這裏輸入的密碼爲grub菜單設置的加密口令。輸入口令後回車將再次顯示此菜單,可是下面的提示將回到正常狀態。
#這時選擇MengTianba按ENTER回車,系統今後引導入口來加載對應的系統
解析:這時輸入的密碼就是title對應的MengTianba下設置的加密口令,輸入正確後進入系統。
可是若是這裏咱們選到MengTiana LInux按c使用交互式模式調整此引導條目信息:
說明:編輯好指定的內核參數以及initrd調用後輸入boot回車表示以上面設置的grub信息來進入引導。
注意:這裏有一個問題,這裏若是使用能經過grub交互式界面裏提供的find命令來慢慢查找內核目錄裏的文件來判斷系統或boot所在的分區及文件路徑,那麼只要使用c來進入交互式grub直接跳過條目中的加密設置來進入指定的grub引導。固然前提是要記住grub編輯界面的密碼口令,若是不能進入編輯模式,那麼想直接跳過grub自身加密是不可行的。
案例2:進入單用戶模式來破解root口令
在生產環境中,不少時候由於人員的調度或者常常更改root管理員用戶口令,致使在真正使用的時候而忘記root密碼,這時能夠利用linux中提供的單用戶模式來跳過login交互式用戶驗證模塊直接進入對應的shell界面,而後進行命令操做修改root口令。
下面假設忘記了boot用戶,能夠經過進入grub而後通知內核以單用戶模式進入系統
#進入可編輯模式(爲加密或者已經輸入密碼的)的grub菜單
#而後按e鍵編輯MengTianba Linux引導項
#而後再次按e來編輯 kernel項參數
說明:在最後跟上1或者s或者single都表示爲單用戶模式及進入1級別引導系統。
#最後按b鍵進行啓動系統,系統啓動完成,會直接跳過login交互登陸提示,直接以root身份進入系統:
解析:這樣就能夠直接修改root密碼了。