Linux系統啓動流程之(2)grub
Linux啓動流程中在引導bootloader時會檢查出磁盤的前446字節,從而找出/boot/grub下的相應的配置,來去掛載假根文件系統來解壓內核來完成根切換。
回顧啓動流程:
POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs--> switchroot--> /sbin/init-->(/etc/inittab, /etc/init/*.conf) --> 設定默認運行級別--> 系統初始化腳本rc.sysinit--> 關閉或啓動對應級別的服務--> 啓動終端
vgrub: GRandUnified Bootloader
grub 0.x: grub legacy
grub 1.x: grub2
grub legacy:
stage1: mbr
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 #等待用戶選擇的超時時長,單位是秒 splashimage=(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中的信息自定義菜單:
1、修改文件配置
#查看源文件信息:
[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啓動。
2、進入系統後,可以查看剛纔設置的內核是否已經生效
#查看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和調整迴環設備最大映射數:
3、加密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密碼了。