GRUB加密、修復和破解密碼實戰指南
GRUB(Boot Loader)
-
從系統啟動流程可以得知,在BIOS讀取相關信息之后,接下來是去第一個可以啟動的設備當中的MBR中讀取Boot Loader信息,Boot Loader提供具有菜單功能、直接加載內核信息,以及相關的控制權轉交功能。所以說系統啟動必須要有Boot Loader,然后才能去加載內核。
-
Boot Loader存儲于MBR當中,MBR只有512bytes,其中446bytes存儲Boot Loader,但是Boot Loader功能很強大,所以446bytes是遠遠不夠的,所以就用到了grub,并將Boot Loader的程序運行與配置項加載分成三個階段(stage)來運行。
grub: GRand Unified Bootloader
一、版本如下:
grub 0.x: grub legacy
grub 1.x: grub2
二、grub legacy:
1.分為三個階段
⊙ stage1: 運行Boot Loader主程序,這個程序必須要安裝在啟動區,即MBR中。因為MBR空間有限,因此在MBR當中僅安裝Boot Loader的最小程序,并沒有安裝Boot Loader的相關配置文件;
⊙ stage1_5: 在MBR隨后的扇區中存放,讓stage1中的bootloader能識別stage2所在的分區上的文件系統(相當于文件系統的驅動);
⊙ stage2:通過Boot Loader加載所有配置文件及相關的環境變量參數信息,這些配置文件及相關的環境參數都存放于磁盤分區上的/boot/grub目錄下。
2.配置文件:
/boot/grub/grub.conf<–/etc/grub.conf
3.stage2及內核等通常放置于一個基本磁盤分區(boot分區)
⊙ boot單獨分區是用來存放與linux系統啟動有關的程序,比如,內核文件、啟動引導裝載程序,啟動菜單配置文件等;
⊙ boot作為一個單獨的分區,也就意味著這個單獨分區下有一個grub,因為grub剛啟動的時候,操作系統還沒有啟動(真正的根文件系統還沒有被加載),所以,不能通過訪問/boot/grub來實現,但是我們又需要訪問這個文件來執行stage2 階段。所以,grub中就有一個root命令,指明的就是把stage2 階段直設為根,而grub自帶有文件系統驅動(stage 1.5),所以就可以直接訪問分區及根下的所有文件即kernel,initrd等來選擇內核啟動;
⊙ boot目錄,有沒有單獨分區(或者說引導分區是不是一個獨立的分區),決定了在grub中的訪問路徑是否一樣。而grub中的root命令,指明的就是這個根分區是誰,如果boot被單獨分區了,那么就直接指向這個新分區,訪問路徑就直接把boot給去掉了;如果boot沒有被單獨分區,就是掛在根分區上,那就意味著/boot目錄是繞不過去的,訪問的時候只能先訪問根,在訪問根下的boot。
⊙ grub要想訪問某一分區,這個分區必須是基本磁盤分區,不可能是提供了非常復雜的驅動程序(如RAID,LVM)。如果想把根做的復雜些(比如LVM)但又不對boot做單獨分區,那把邏輯卷往分區上一放,就找不到grub中的stage2階段了,所以,要想把根做的復雜,就只能把boot作為一個單獨的基本磁盤分區;
⊙ 如果不使用邏輯卷,boot是可以不用單獨分區的。
4.grub功用:
-
提供啟動菜單、并提供交互式接口;
e: 編輯模式,用于編輯菜單
c: 命令模式,交互式接口
-
加載用戶選擇的內核或操作系統;
允許傳遞參數給內核
可隱藏啟動菜單
-
為菜單提供了保護機制;
為編輯啟動菜單進行認證
為啟用內核或操作系統進行認證
5.識別硬盤設備:
(hd#,#) 表示第幾塊磁盤的第幾塊分區
-
硬盤代號以小括號()括起來
-
hd#: 磁盤編號,用數字表示;從0開始編號;
-
#: 分區編號,用數字表示; 從0開始編號;
如:(hd0,0)表示 第一塊硬盤,第一個分區
6.grub的命令行接口
-
help: 獲取幫助列表
-
help KEYWORD: 詳細幫助信息
-
find (hd#,#)/PATH/TO/SOMEFILE:
-
root (hd#,#)
-
kernel /PATH/TO/KERNEL_FILE: 設定本次啟動時用到的內核文件;額外還可添加許多內核支持使用的cmdline參數
例如:max_loop=100 selinux=0 init=/path/to/init
-
initrd/PATH/TO/INITRAMFS_FILE: 設定為選定的內核提供額外文件的ramdisk;
-
boot: 引導啟動選定的內核
-
cat /proc/cmdline 內核參數
-
內核參數文檔:/usr/share/doc/kernel-doc-2.6.32/Documentation/kernel-parameters.txt
7.手動在CentOS 6 grub命令行接口啟動系統:
-
grub> root (hd#,#) 這里的根為grub的根,而非根文件系統的根(真正的文件系統還沒有加載)
-
grub> kernel /vmlinuz-VERSION-RELEASE ro root=/dev/DEVICE (文件系統的跟)
-
grub> initrd/initramfs-VERSION-RELEASE.img
-
grub> boot # 啟動
如果每次都手動編輯,并不是所有人都能夠完成的,所以就加了一個菜單項,菜單上顯示的內容其實也就是grub配置文件中的設置,如下所示:
三、grub legacy:配置文件
1.查看配置文件/boot/grub/grub.conf如下:
1 # grub.conf generated by anaconda 2 # 3 # Note that you do not have to rerun grub after making changes to this file 4 # NOTICE: You have a /boot partition. This means that 5 # all kernel and initrd paths are relative to /boot/, eg. 6 # root (hd0,0) 7 # kernel /vmlinuz-version ro root=/dev/mapper/vg0-root 8 # initrd /initrd-[generic-]version.img 9 #boot=/dev/sda 10 default=0 11 timeout=5 12 splashimage=(hd0,0)/grub/splash.xpm.gz 13 hiddenmenu 14 title CentOS 6 (2.6.32-642.el6.x86_64) 15 root (hd0,0) 16 kernel /vmlinuz-2.6.32-642.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun 16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto 17 initrd /initramfs-2.6.32-642.el6.x86_64.img |
2.每行含義如下:
-
default=#: 設定默認啟動的菜單項;假如同時裝有多個操作系統,0表示定義的第一個title系統,1表示定義的第二個title系統,以此類推;
-
timeout=#:表示可供選擇的等待時間,如果超出5秒,則使用默認的啟動條目default定義的;
-
splashimage=(hd#,#)/PATH/TO/XPM_FILE:菜單背景圖片文件路徑;
-
hiddenmenu:隱藏菜單,默認是不顯示菜單信息,如果要想顯示菜單,可以將該配置信息注釋即可;
-
password [–md5] STRING: 啟動菜單編輯認證
-
title TITLE:定義菜單項“標題”(操作系統名稱), 可出現多次,用來引導不同的操作系統或內核;
◎root (hd#,#):grub查找stage2及kernel文件所在設備分區;為grub“根”。也就是說,表示的是內核文件的存放位置,這里指的是分區位置,而非根目錄;
◎kernel /PATH/TO/VMLINUZ_FILE [PARAMETERS]:內核的名稱,以及一些啟動時的核心參數。由于啟動過程中需要掛載根目錄,因此就需要指定根目錄所在的分區。rhgb表示色彩顯示,quiet表示靜默模式加載內核。
◎initrd/PATH/TO/INITRAMFS_FILE: 內核匹配的ramfs文件,虛擬文件系統;
◎password [–md5] STRING: 啟動選定的內核或操作系統時進行認證。
=================================================================================
3.生成密碼的命令:
grub-md5-crypt
openssl passwd -1
[實驗1:為編輯啟動菜單進行認證;為啟用內核或操作系統進行認證]
操作步驟及過程如下:
1)復制一份內核文件,改名為Tao Linux,并分別在第一個title之前和第二個title之后添加生成的加鹽密碼,保存并退出,并重啟系統;
2)重啟系統之后發現要為進行編輯啟動菜單的認證,效果如下:
3)按“p”鍵輸入密碼之后,可以發現原來的提示信息又回來了,這是我們就可以編輯了
4)選擇第二個內核作為啟動程序,按回車鍵發現要想啟動內核,要輸入密碼認證,說明我們為內核設置的密碼,起作用了。
4.破解root口令:
啟動系統時,設置其運行級別1
5.進入單用戶模式:
-
編輯grub菜單(選定要編輯的title,而后使用e命令);
-
在選定的kernel后附加1, s, S或single都可以然后按回車鍵;
-
在kernel所在行,鍵入“b”命令,進入單用戶模式
[實驗2]:單用戶模式下修改密碼:
2)因為我們在編輯啟動菜單前設置了認證,所以需要輸入密碼,按“p”輸入密碼后進入編輯菜單,然后選定要啟動的內核,按“e”鍵進入編輯模式,如下演示:
3)選定好要啟動的kernel后,按“e”鍵進入,然后在選定的內核后添加1, s, S或single,然后按回車鍵,緊接著在kernel所在行輸入“b”進入單用戶模式,如下演示:
6.安裝grub的兩種方法:
1)使用grub-install命令直接修復
安裝grub stage1和stage1_5到/dev/DISK磁盤上,并復制GRUB相關文件到DIR/boot目錄下,命令如下:
grub-install --root-directory=DIR /dev/DISK
2)使用grub進入命令提示符下的接口進行修復:
grub> root (hd#,#)
grub> setup (hd#)
注意:
法一:不要求指定的根下有boot目錄,以及下面的grub,stage1,stage1.5,stage的文件,他會自動檢測,裝好并修復;
法二:要求在指明的root設備上必須要存在有一個grub目錄,并且其下的stage1,stage1.5,stage2 這些文件必須 存在才可以修復。
[實驗3破壞grub的第一階段,并修復grub,完成啟動](以CentOS 6 為例)
實驗步驟如下:
1)為了防止意外,我們首先將bootloader備份,如下:
[root@CentOS6 ~]# dd if=/dev/sda of=/root/mbr.bak count=1 bs=512 1+0 records in 1+0 records out 512 bytes (512 B) copied, 0.000406463 s, 1.3 MB/s
2)接著把grub的第一階段破壞了(注意不要把分區表給破壞了),如下:
[root@CentOS6 ~]# dd if=/dev/zero of=/dev/sda bs=200 count=1 # 破壞grub第一階段 1+0 records in 1+0 records out 200 bytes (200 B) copied, 0.00909061 s, 22.0 kB/s [root@CentOS6 ~]# sync #同步到磁盤
3)其實到這里,如果重啟系統的話已經啟動不起來了,因為把bootloader的第一階段破壞了,后面的所有啟動流程都將無法進行,連啟動菜單都沒有。只能通過在救援模式的環境下進行修復,因為在這里,我們沒有重啟,所以可以直接手動修復,方法如下:
方法一:
[root@CentOS6 ~]# 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@CentOS6 ~]# sync # 修復完成,并同步到磁盤
方法二:grub命令,進入其命令提示符的接口下進行修復
[root@CentOS6 ~]# grub # 使用grub命令修復 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, TAB lists possible command completions. Anywhere else TAB lists the possible completions of a device/filename.] 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... yes # 查找stage1/1.5/2文件是否存在 Checking if "/grub/stage2" exists... yes Checking if "/grub/e2fs_stage1_5" exists... yes Running "embed /grub/e2fs_stage1_5 (hd0)"... 27 sectors are embedded. succeeded Running "install /grub/stage1 (hd0) (hd0)1+27 p (hd0,0)/grub/stage2 /grub/grub.conf"... succeeded # 提示安裝成功 Done. grub> quit #退出 quit [root@CentOS6 ~]# sync # 同步到磁盤
[實驗4救援模式下怎樣修復grub]
如上實驗是在不重啟的情況下進行修復的,那怎樣在重新啟動是進行修復grub呢?那就要采用救援模式了,方法如下:
步驟如下:
1)首先破壞grub的第一階段,重新啟動
[root@CentOS6 ~]# dd if=/dev/zero of=/dev/sda bs=200 count=1 # 破壞grub第一階段 1+0 records in 1+0 records out 200 bytes (200 B) copied, 0.00909061 s, 22.0 kB/s [root@CentOS6 ~]# sync #同步到磁盤
可以看到,系統已經徹底歇菜,啟動不起來了!
2)這個時候我們就需要掛載系統安裝光盤,進入緊急救援模式,如下,選擇第三項即可,或者按esc鍵,在命令行模式下輸入 # linux rescue 就可進入救援按模式
3)進入救援模式會提示要選擇的相關信息。首先,選擇要使用的語言:
選擇要使用的鍵盤
這里提示我們要不要啟動網絡功能,如果我們需要通過上網下載文件來修復就選擇啟動網絡服務,這里我們不需要,選擇NO
這里主要是提示我們,救援模式會嘗試去尋找硬盤上是否有操作系統,如果有的話會掛載到/mnt/sysimage 下,可以到這個里面尋找所需要的文件。這里我們選擇continue
搜索并提示我們系統找到了,并且已經掛載至/mnt/sysimage 下,如果要使用的話可以使用 chroot /mnt/sysimage 命令把根切換過去。選擇OK
提示我們系統已經掛載到/mnt/sysimage 目錄下
提示我們是否開啟一個shell腳本,這里選擇OK
4)上面這些信息選擇好以后就進入到了救援模式下,并打開了一個shell提示符,我們執行如下操作即可:
5)成功啟動,并登陸:
總結:GRUB啟動故障排除案例
1.MBR中grub損壞,1_5階段的數據損壞,2階段的grub損壞
2.initramfs*.img文件損壞,內核文件損壞
3./boot/grub/grub.conf文件丟失
4./etc/fstab丟失,無法掛載根等文件系統
5./boot 目錄全部的文件丟失
解決方法(都是在救援模式下)
1. MBR中grub損壞,1_5階段的數據損壞,2階段的grub損壞
救援模式,
-
chroot /mnt/sysimage 切根,改變磁盤根目錄
-
grub-install /dev/sda 安裝grub引導程序到磁盤/dev/sda的MBR扇區
2. initramfs*.img文件損壞,內核文件損壞
1)initramfs*.img文件損壞,解決方法:
# chroot=/mnt/sysimage # mkinitrd /boot/initramfs-$(uname -r).img $(uname -r) #創建
2)內核文件損壞
救援模式下
mkdir /mnt/cdrom
mount /dev/cdrom /mnt/cdrom 掛載光盤
進入/mnt/cdrom/Packages/ 目錄下覆蓋安裝kernel包,
rpm -ivh–replacepkgs kernel-VERSION.rpm –root=/mnt/sysimage –force安裝完成后會在/boot目錄下自動生成相應版本的vmlinuz文件.
(前提是內核版本未更新, 和光盤中的內核版本一致)
3. /boot/grub/grub.conf文件丟失
這個新建一個寫上引導等信息就行,詳見實驗3,實驗4
4. /etc/fstab丟失,無法掛載根等文件系統
同樣新建一個/etc/fatab、填寫上掛載信息
lvm 的話需要激活lvm邏輯卷
5. /boot 目錄全部的文件丟失
結合上面,先MBR修復,然后內核文件修復和initramfs*.img文件 修復
原創文章,作者:zhumengxiaotao,如若轉載,請注明出處:http://www.www58058.com/47754