下面我來講下grub,grub在編輯的時候可以進入一種模式就是單用戶模式,就是當grub.conf文件未寫入密碼時,普通用戶將直接忽略系統密碼進入系統,所以這可以稱為一個捷徑,也可以成為一個漏洞,當然linux的前輩們不可能連這個都想不到,他們也有自己的辦法,這就是我們grub的兩層加密機制,在選定登陸界面之前可以設置一次,啟動內核時也可以設置一次,密碼也可以采取加密算法,這樣就可以為我們系統提供雙層保險。好了說了那么多,讓我么你做一個簡單的練習。
-
破解root口令,并為grub設置保護功能
這個問題再簡單不過了,在登陸選定內核界面按e進入grub的編輯界面,然后按‘b’登陸即‘boot’之意,這樣就破解了root的密碼了。
-
破壞本機grub stage1,而后在救援模式下修復之
下面我來講下stage1這個步驟是存在MBR前512字節里的,將之破壞的方式可以是這樣:dd if=/dev/zero of=/dev/sd# ,#表示grub所在磁盤,這里假設我們已經將MBR進行破壞,我們只需在進入RESCUE模式時重新安裝grub即可。grub-install –root-directory /dev/sd# 當然我這是切根后的安裝,不然救援模式下是沒有grub-install這個命令的。
-
刪除vmlinuz和initramfs文件,無法啟動,恢復之
下面我來講下這兩個文件一個是內核文件,一個是虛擬文件系統文件,都是grub的核心文件,我們在編寫grub.conf這個配置文件的時候其他的都可以不寫,但是這兩個文件卻不能省略。initramfs 文件可以在救援模式使用
mkinitrd命令進行生成,mkinitrd initramfs-`uname -r`.img `uname -r`
下面我來講下幾種解決上述問題的方法。
1、有網絡時,因為一般公司里的主機里的內核文件及文件系統文件的版本都是同一種,所以我們可以聯通上特定的主機,使用scp這個命令將缺失的文件拷貝過來,前提是得有這個主機的密碼。
2、當沒有網絡時我們可以進入救援模式,安裝內核文件中的/boot目錄,當然如果不嫌麻煩可以將內核全部重新安裝一遍,不過命令是這樣的
rpm -ivh ~kernel…. +路徑 –force,內核會自己判斷哪些缺失文件,這樣也節省了不少時間。
3.這種方法就是掛載光盤文件找到 isolinux目錄找到vmlinuz、initramfs文件進行復制到、boot目錄即可。
好的如果你覺得這些還不夠,后面還有猛料哦
-
刪除/etc/fstab和/boot 目錄的所有文件,并恢復之
其實這個也不復雜,就是進入救援模式重新安裝內核,前提是得先掛載光盤
chroot=/mnt/sysimage rpm -ivh ~Packages/kernel~ --force| replacepkgs然后進而重新安裝grub文件。 grub-install --root-directory=/ /dev/sd#安裝完成后重新編輯grub.conf文件。 啟動后對/etc/fstab文件進行修復。
-
增加新硬盤,在其上制作能單獨運行kernel和bash的系統
這里假設我們原來的硬盤在/dev/sda上面,我們這里新加一塊/dev/sdb 接下來我們對其進行分區及格式化、fdisk /dev/sdb 分出200M大的一塊/dev/sdb1磁盤 然后在對其進行格式化,mkfs.ext3 /dev/sdb1 完成后我們在/mnt目錄里新建/sysroot 來模擬一個根文件系統, 我們在/sysroot里新建根目錄的那些文件夾,這里使用如下腳本調入我們需要引入的命令,在執行的時候我們將根寫為/mnt/sysroot即可。 ``` shell#!/bin/bashRead -p ‘ Please input your root dirname’ rootdir ch_root="$rootdir"[ ! -d $ch_root ] && mkdir $ch_rootbincopy() {if which $1 &>/dev/null; then local cmd_path=`which --skip-alias $1` local bin_dir=`dirname $cmd_path` [ -d ${ch_root}${bin_dir} ] || mkdir -p ${ch_root}${bin_dir} [ -f ${ch_root}${cmd_path} ] || cp $cmd_path ${ch_root}${bin_dir} return 0 else echo "Command not found." return 1 fi}libcopy() { local lib_list=$(ldd `which --skip-alias $1` | grep -Eo '/[^[:space:]]+') for loop in $lib_list;do local lib_dir=`dirname $loop` [ -d ${ch_root}${lib_dir} ] || mkdir -p ${ch_root}${lib_dir} [ -f ${ch_root}${loop} ] || cp $loop ${ch_root}${lib_dir} done} read -p "Please input a command or quit: " command while [ "$command" != "quit" ];do if bincopy $command ;then libcopy $command fi read -p "Please input a command or quit: " commanddone
執行完成后我們將/bin/bash 拷貝到/mnt/sysroot/bin目錄中作為我們系統啟動后的第一個初始化程序運行,然后我們將/boot目錄整個復制到/mnt/sysroot目錄中,這里我們重新編寫一下/mnt/sysroot/boot/grub/grub.conf文件,我們注意更改一些grub的根和文件系統的根即可。好了,小伙伴們準備好了嗎,趕緊去試一試吧,這里我就不貼圖了。
-
6、 下面我這里對上述問題再深化了一下,因為就是喜歡折騰,根本停不下來,原來我們的boot目錄是在根文件系統下面,我們這里新加一塊硬盤,讀入
echo '—-' /sys/class/scic_host/host2/scan 將它進行重新分區,假設我們這邊的根文件系統的磁盤是/dev/sda,我們這里新加的磁盤是/dev/sdb,我們將之新加一個分區/dev/sdb1,格式化為ext3,,這里我們將/boot文件目錄下的文件先已到/tmp目錄下,然后將它解掛載到/dev/sdb1,這里我們進入救援模式,在輸入chroot =/mnt/sysimage后,我們輸入捕獲1.PNG
注意這里的安裝目錄寫原來的根文件系統所在目錄,這里我們容易混淆,接下來我們重啟進入硬件啟動,我們輸入
捕獲2.PNG
然后我們繼續輸入
捕獲3.PNG
然后輸入
捕獲4.PNG
進入文件系統后重新編寫/boot/grub/grub.conf文件即可。
-
下面我們做個實驗
-
實驗目的:
-
使用linux recuse模式修復Linux系統
-
實驗步驟:
-
一、人為刪除系統關鍵文件
-
登陸linux系統之后,依次執行以下命令人為破壞當前linux系統:
-
#cd /#umount /boot ---卸載/boot分區#rm -rf /boot ---刪除/boot目錄(boot目錄下包含所有GRUB有關的文件)#rm -rf /etc/inittab ---刪除init表(此文件定義了系統運行級別和腳本)#rm -rf/etc/rc.d/rc.sysinit ---刪除init運行級別腳本文件#rm -rf/etc/rc.d/rc.local ---刪除開機腳本文件#mv /etc/fstab/etc/fstab.bak ---備份系統掛載表fstab文件(此文件記錄了linux分區信息)
-
sync —將系統緩沖區的內容寫入硬盤(在Linux系統中,當數據需要存入磁盤時,通常會先放到緩沖區內,等到適當的時刻再寫入磁盤,如此可提高系統的執行效率)
-
reboot
-
經過這一番蹂躪之后,系統肯定是掛了的。。。。。最后一條reboot命令已經無法正常執行了。。。手動重啟系統也是無法進入系統了的。。。。。。但是,只要根分區沒有被格式化,就可以進入linux修復模式恢復該linux系統。
二、修復linux系統 -
思路:恢復fstab文件找到分區à修復引導里的內核文件à修復grub –>還原init相關文件
1.進入修復模式 -
通過RHEL5光盤引導進入安裝會話,輸入linux rescue或按F5鍵進入rescue修復模式。
-
-
進入修復模式之后,系統會提示選擇語言Language和鍵盤類型Keyboard,直接回車就行了。
系統會再次詢問是否配置網絡,選擇No,因為修復系統不需要用到網絡。。然后會提示如下: -
Rescue程序將查找當前硬盤上是否有已安裝的linux系統,如果找到了的話,就自動掛載到/mnt/sysimage下。選擇”Continue”繼續,rescue程序會搜索硬盤是否存在已安裝過的linux和硬盤分區,最終結果如下圖:
-
-
搜索結果顯示,找不到Linux分區,因為/etc/fstab文件被刪除了,所以導致系統無法讀取Linux分區,但是如果找到了,就將它掛到/mnt/sysimage里面,可以讀寫。選擇”OK”確定之后,系統會進入到修復模式的shell下。
-
-
2.還原fstab文件
-
根據上面步驟得知,rescue程序無法找到硬盤分區,所以現在要做的事情就是恢復linux分區——也就是fstab文件(這個fstab文件在刪除之前,有做過備份/etc/fstab.bak)。
-
fdisk -l 查看磁盤分區
-
-
根據fdisk –l輸出,得到系統分區有兩個/dev/sda1和/dev/sda2。可使用e2label命令查看這兩個分區的卷標,
-
-
由上圖可得知/dev/sda1是/boot分區,而/dev/sda2無法查看,因為sda2是LVM分區。
使用命令激活LVM分區#lvm vgchange-ay 這個命令的作用就是告訴系統建立相關的device-mapper,這樣就可以看到/dev下建立了/dev/mapper/VGname-LVname和/dev/VGname/LVname的設備文件和鏈接文件. -
-
使用ls /dev/mapper命令可以看到VolGroup00-LogVol00(就是/根分區)和VolGroup00-LogVol01(就是swap分區)
接下來,要掛載/根分區,并恢復fstab文件。 -
mkdir test —建立一個空目錄用于掛載分區
-
mount -t ext3 /dev/VolGroup00/LogVol00 /test —掛載包含根分區的LVM分區到test目錄下
-
-
將系統原來的/根分區掛載到/test目錄之后,就可以還原fstab.bak到fstab了!
-
-
#cp /test/etc/fstab.bak /test/etc/fstab ----還原fstab文件#reboot ----重啟系統
-
3.修復內核和grub
-
重啟之后,按ESC鍵選擇CDROM引導,輸入linux rescue再次進入到修復模式。
此時再次進入到修復模式時,rescue程序將會找到fstab文件,也就是會找到linux分區!并且把損壞的原linux系統掛載到/mnt/sysimage下。并且rescue程序會提示你,可以使用#chroot(changeroot修改根目錄)修改根目錄,進入到原系統中。如下圖所示: -
選擇OK之后,系統已經全部掛載到了/mnt/sysimage,如果想進去,敲入#chroot/mnt/sysimage,修改根目錄為/mnt/sysimage,使用ls命令可以查看原系統里的文件和目錄。使用exit可以退回rescue程序下,再次使用ls命令可以比較一下區別。
-
一般把處于resuce模式的系統稱為偽系統,把#chroot/mnt/sysimage后看到的稱為真正的系統。
接下來要修復內核文件: -
#exit ---退回到resecu模式下#mount /dev/hdc /mnt/source ---掛載光驅cdrom到/mnt/source目錄#rpm -ivh /mnt/source/Server/kernel-2.6.18-164.e15.i686.rpm--root=/mnt/sysimage/ --force
-
(需要修復的三個內核文件在系統盤server目錄下kernel-2.6.18.rpm軟件包里,所以要掛載光盤之后并安裝kernel軟件包)
-
此時,內核已修復完成!再繼續修復grub程序。。。
-
#chroot /mnt/sysimage 進入到已損壞的linux系統中#grub-install /dev/sda 安裝grub程序到/dev/sda#ls /boot/grub 查看grub目錄下是否存在grub.conf文件。如果沒有就手動編輯一個。#vim /boot/grub/grub.conf
-
手動編輯grub.conf配置文件內容如下:
-
-
保存退出。。。grub修復完成!
-
4、修復/etc/inittab等文件
-
#rpm -qf /etc/inittab 查詢包含inittab文件的軟件包#rpm -qf /etc/rc.d/rc.sysinit 查詢包含rc.sysinit文件的軟件包#rpm -qf /etc/rc.d/rc.local 查詢包含rc.local文件的軟件包
-
-
經過rpm –qf查詢命令可得知,要修復的文件都包含在initscripts-8.45.rpm這個軟件包里面。
下一步,要把文件從這個RPM里面分離出來,并還原到/etc目錄下. -
#exit#cp /mnt/source/Server/initscripts-8.45.30-2.el5.i386.rpm /mnt/sysimage/tmp#chroot /mnt/sysimage#cd tmp/#ls#rpm2cpio initscripts-8.45.30-2.el5.i386.rpm |cpio -imd 解壓軟件包到當前目錄#ls 兩個ls命令注意比較區別#cd etc/#ls#cp inittab /etc/#cp rc.sysinit /etc/rc.d/#cp rc.local /etc/rc.d/
-
最后只需要reboot就可以正常進入到linux系統了!?。?! OVER!
原創文章,作者:sjfbjs,如若轉載,請注明出處:http://www.www58058.com/45277