linux內核啟動修復
首先看一下linux內核重要文件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/sda2 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 #如果有多個菜單,默認選擇的菜單為0 timeout=5 #菜單選項欄等待5s splashimage=(hd0,0)/grub/splash.xpm.gz #/dev/sda1即/boot下開機啟動圖片 hiddenmenu #影藏菜單 title CentOS 6 (2.6.32-696.el6.x86_64) #標題為CentOS 6 (2.6.32-696.el6.x86_64),此標題不能沒有 root (hd0,0) #第一塊磁盤,第1個分區,指的是/boot kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=9ca5bdac-ce61-410e-a9fb-19a7877163cc rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSF ONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet # kernel相對於/boot的路徑,此處根值/boot,kenrl后面跟有系統啟動相關參數 rhgb 圖形化工具(轉圈圈),刪除rhgb直接到正常啟動界面 quiet默認隱藏內核的啟動過程 initrd /initramfs-2.6.32-696.el6.x86_64.img title CentOS 6 (2.6.32-696.el6.x86_64) #標題為CentOS 6 (2.6.32-696.el6.x86_64),此標題不能沒有 kernel (hd0,0)/vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=9ca5bdac-ce61-410e-a9fb-19a7877163cc rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSF ONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet # 沒有定義根,后面不能調用只能在前面添加(hd0,0) initrd (hd0,0)/initramfs-2.6.32-696.el6.x86_64.img
一 刪除/boot/grub/*下所有文件,只保留grub.conf配置文件,系統能否正常啟動修復?
系統能夠正常啟動
stage2階段就是一個grub.conf配置文件,其它文件都不起到直接的作用
此時重新啟動系統只會在一開始報一個沒有啟動圖片的錯誤,此錯誤不影響系統的正常啟動(可忽略),/boot/grub下的所有文件只做暫時備份使用即stage1 stage1_5階段的備份文件,只有當1和1.5階段出現故障的時候 可以通過一些命令進行修復,修復的時候會用到此處的備份文件
二 破壞MBR的前446字節的信息,修復(stage1階段修復)
[root@Centos6 ~]# dd if=/dev/zero of=/dev/sda bs=1 count=4426
破壞stage1階段
此時發現系統重啟進入光盤界面

重啟系統直接進入光盤界面,也就是光盤上的MBR沒有啟動代碼
選擇第三項進入救援模式
修復步驟
1.切根 chroot /mnt/sysiamge
此時所處的位置並不是磁盤上的根,真正的根位於/mnt/sysimage下
起因:在救援模式自身是不提供grub-install的只有切根才可以



2.grub-install /dev/sda
修復grub,此過程stage[1,1.5,2]都可以修復
此時出現分區別標簽的錯誤,不用管,此步驟容易出現故障
3.sync
同步設置到磁盤,確保磁盤已經寫入進去了
此時不僅修復了mbr還修復了grub里面不同stage的文件
4.退出shell,重新啟動
總結:此時stage1階段的恢復完成,主要通過grub-install進行恢復
-------------------------------補充關閉selinux---------------------------
1、重啟系統按c鍵,直接進入grub
grub> kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2 selinux=0
grub> initrd /initramfs-2.6.32-696.el6.x86_64.img
grub> boot
2、通過修改/etc/sysconfig/selinux 把selinux=disabled
三 破壞512字節之后的內容進行修復(stage1.5階段過程)
dd if=/dev/zero of=/dev/sda bs=1 count=10240 seek=512
此時會發現菜單都看不到
stage1.5出故障使用光盤引導
修復步驟:
1.按Esc鍵進入光盤引導界面
2.選擇第三項進入救援模式
3.切根 chroot /mnt/sysimage
4.grub-install或者使用grub命令
sh-4.1# grub

grub>root (hd0,0) #表示boot在第一塊磁盤第1個分區

setup (hd0) #此步驟依賴於/boot/grub/*下面的文件
--------------------------------------------------------------------------------------------------------
表示把grub按在哪個硬盤上,沒有寫分區的原因在於有一部分是裝在MBR里面的即boot分區里面,boot里面有一個目錄名為grub,告訴各個路徑在什么地方
-------------------------------------------------------------------------------------------------------------
5.sync #設置同步到磁盤
6.reboot #退出shell,重啟系統方可恢復
四 在“三”的基礎上在重新做“一”的操作,再啟動會出現報錯,狀態碼為Error 15

修復方案:
如把stage2文件復制到/boot/grup目錄下,系統可以重新啟動
解釋
重啟系統,此時可以知道重新安裝grub以后stage2並不是起備份作用了,“一”中之所以成功是通過磁盤上別的空間來讀取數據,可以明白stage1.5階段已經成功了

title CentOS 6 (2.6.32-696.el6.x86_64) #標題為CentOS 6 (2.6.32-696.el6.x86_64),此標題不能沒有 kernel vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=9ca5bdac-ce61-410e-a9fb-19a7877163cc rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSF ONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet # 沒有定義根,后面不能調用只能在前面添加(hd0,0) initrd initramfs-2.6.32-696.el6.x86_64.img

#此時只能進入救援模式切根修改文件 title CentOS 6 (2.6.32-696.el6.x86_64) #標題為CentOS 6 (2.6.32-696.el6.x86_64),此標題不能沒有 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=9ca5bdac-ce61-410e-a9fb-19a7877163cc rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSF ONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet # 沒有定義根,后面不能調用只能在前面添加(hd0,0) initrd /initramfs-2.6.32-696.el6.x86_64.img
六 如果在默認文件中去掉root (hd0,0)一行系統啟動會出現的情況
title CentOS 6 (2.6.32-696.el6.x86_64) kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=9ca5bdac-ce61-410e-a9fb-19a7877163cc rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSF ONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-696.el6.x86_64.img
title CentOS 6 (2.6.32-696.el6.x86_64) initrd /initramfs-2.6.32-696.el6.x86_64.img kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=9ca5bdac-ce61-410e-a9fb-19a7877163cc rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSF ONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
解釋:直接報錯,大概意思是linux kernel必須在initrd之前加載,否則系統無法啟動
只有加載kernel才會知道操作系統的根,找到根了才會找到內存用戶驅動

修復步驟
修復方法,顯示刪除initrd添加一新行,在編輯新行grub> initrd /initramfs-2.6.32-696.el6.x86_64.img






八 單用戶模式下可以輕易破解口令,如何明文加密口令?
加上密碼口令並不影響啟動,只是不能菜單編輯
在title的上一行加上passwd
密碼 此時驗證的時候不知道都不會成功
password zangfans


驗證會出現
Failed
修復方案
在hidddenmenu上方和initrd下方各插入一行
# 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/sda2 # initrd /initrd-[generic-]version.img #boot=/dev/sda default=0 timeout=5 splashimage=(hd0,0)/grub/splash.xpm.gz password centos6 #編輯菜單項輸入密碼 hiddenmenu title CentOS 6 (2.6.32-696.el6.x86_64) root (hd0,0) kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=9ca5bdac-ce61-410e-a9fb-19a7877163cc rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSF ONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet initrd /initramfs-2.6.32-696.el6.x86_64.img title CentOS 6 (2.6.32-696.el6.x86_64) kernel (hd0,0)/vmlinuz-2.6.32-696.el6.x86_64 ro root=UUID=9ca5bdac-ce61-410e-a9fb-19a7877163cc rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSF ONT=latarcyrheb-sun16 crashkernel=auto KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet # initrd (hd0,0)/initramfs-2.6.32-696.el6.x86_64.img password centos6 #啟動輸入密碼



九 如何通過密文設置加密口令
使用加密算法對口令進行加密,可以使用MD5.SHA512
明文加密
1、使用grub-md5-crypt設置密碼
[root@Centos6 ~]# grub-md5-crypt Password: Retype password: $1$Z.gAn/$Xd647hXfPj/sJ.i8A0By8.
進入/boot/grub/grub.conf文件使用vim編譯器的功能

輸入密碼和驗證,即可生成一段md5加密的字符串
password --md5 $1$V1hAn/$hSLRXWfIZWwVtYz4th5rg1
密文加密
2、使用grub-crypt及sha512進行加密
[root@Centos6 ~]# grub-crypt Password: Retype password: $6$jkKAT.eUrv3d4bfM$f41lkKlqQk3fAPqNwgy93J6Wi6bVF.zB5b.24V1QPwAGXkVVmwk2MGdi1UxzStHBaPWarW20AppaOvwheNRRj.
修改/boot/grub/grub.conf文件
password --encrypted $6$ndPVD/LnVhjBwHaG$XlSiTmJfRJrWufrmH0tLzle/zlmCB.Zyi/WClkcL8G43NDpXlKuQPvsw4AiIJqT1fJrb2Kh8DgZLY68pIAKFI0
圖片像素和格式是有要求的
使用convert工具對圖片像素進行設置
首先得安裝convert命令所提供的包
[root@Centos6 ~]# which convert /usr/bin/convert [root@Centos6 ~]# rpm -qf `which convert` ImageMagick-6.7.2.7-6.el6.x86_64 [root@Centos6 ~]# convert -resize 640x480 -colors 14 zf.jpg zf.xpm #此命令必須在zf.jpg位置使用,使用less zf.xpm可以在頭部看到相關信息 [root@Centos6 ~]# cp zf.xpm /boot/grub [root@Centos6 grub]# vim grub.conf splashimage=(hd0,0)/grub/zf.xpm
進入grub界面就能看到設置的背景圖片
查看內核啟動參數內核參數
[root@Centos6 ~]# cat /proc/cmdline ro root=UUID=9ca5bdac-ce61-410e-a9fb-19a7877163cc rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16 KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
十二 刪除grub.conf文件,啟動修復
環境:/boot/grub 目錄下只有stage2文件,刪除原有的grub.conf文件
重啟系統進入如下界面

解釋:stage1、stage1.5沒有問題主要stage2有問題,連菜單都進不去,直接跳到grub
修復方案:

grub支持交互式輸入,如果沒有grub.conf文件可以手動輸入
十三 刪除/boot/grub整個目錄,如何修復?
[root@Centos6 ~]# rm -rf /boot/grub
重啟進入如下界面

修復方案:
1、進入救援模式
2、chroot /mnt/sysimage 切根
3、使用grub-install /dev/sda
4、sync同步磁盤,此時grub目錄已經修復好了

5、寫一個grub.conf文件
因為修復時並沒有grub.conf文件必須手寫

#必須寫三項分別是title kernel initrd default 0 timeout 3 title Centos6 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2 #方便的小技巧,防止手敲出錯 initrd /initramfs-2.6.32-696.el6.x86_64.img


使用UUID也是可以的

注:r!blkid|grep /dev/sda2 #UUID后面注意去掉引號
十四 刪除/boot下所有文件如何修復?
環境:
[root@Centos6 ~]# ls /boot config-2.6.32-696.el6.x86_64 initramfs-2.6.32-696.el6.x86_64.img System.map-2.6.32-696.el6.x86_64 efi lost+found vmlinuz-2.6.32-696.el6.x86_64 grub symvers-2.6.32-696.el6.x86_64.gz [root@Centos6 ~]# rm -rf /boot rm: cannot remove `/boot': Device or resource busy [root@Centos6 ~]# ls /boot [root@Centos6 ~]#
修復分析:
主要修復/boot里面的內核,虛擬文件系統,grub。
內核:可以在光盤里面找或者去其它相同系統的機子上拷一份
修復方案:
1、進入救援模式
2、chroot /mnt/sysimage 切根
3、掛載光盤 mount /dev/sr0 /mnt
4、cd /mnt/selinux/
vmlinuz 大小和剛開始文件系統大小是一樣的,說明內核是一個固定不變的東西
5、cp vmlinuz /boot 復制內核到/boot下
6、mkinitrd /boot/initramfs.img `uname -r`
7、grub-install /dev/sda
8、在/boot/grub目錄下新建一個grub.conf文件
default o
timeout 3
title Centos6
kernel /vmlinuz ro root=/dev/sda2
initrd /initramfs.img
9、重啟恢復正常
十五 誤刪除/sbin/init,無法進入系統如何修復?
[root@Centos6 ~]# mv /sbin/init ~/

恢復方案;
1、進入grub
2、按a鍵在后面添加 init=/bin/bash #指定不用系統默認的init,使用/bin/bash來代替

用bash來作為計算機的第一個進程,bash內置了一些內部命令
4、回車之后進入如下界面,可以輸入一些命令

5、查看/sbin/bash命令來自哪個包
bash-4.1# rpm -qf /sbin/init #upstart包提供

此時掛載是只讀掛載,不能安裝此包
6、重新掛載根,默認只讀掛載
bash-4.1# mount -o remount,rw /

7、安裝upstart包
注意此時光盤已經掛載,安裝包要覆蓋安裝,--force選項,upstart包畢竟已經安裝過了
#默認光盤已經掛載在/mnt bash-4.1# cd /mnt bash-4.1# rpm -ivh /Packages/upstart-xxxxxx --force

8、同步到磁盤
bash-4.1# sync
9、檢查一下可以看到/sbin/bin

總結:/sbin/bin文件誤刪除后,不需要進入救援模式就可以直接通過命令進行修復,過程中發現根是只讀掛載的,必須重新掛載才能安裝upstart包
十六 根文件系統放在邏輯卷上,若誤操作刪除/fstab,/boot/*文件該如何恢復?
[root@Centos6-LVM ~]# mv /etc/fstab /root [root@Centos6-LVM ~]# rm -rf /boot/*
此時boot里面的內核文件已經刪除了,所以不能通過手寫恢復,只有通過救援模式
重啟直接進入grub
修復分析:boot分區是不能放在邏輯卷上的,那么有多快邏輯卷如何區分哪塊邏輯卷是根?
恢復方案:
1、進入救援模式
2、創建一個臨時目錄 mkdir /mnt/tmp
3、激活邏輯卷 vgchage -ay #當前邏輯卷狀態處於非活動狀態,必須激活才可以

4、根據我的機器我從里面文件的結構和大小了解到,Vo100,Vo101app,Vo102分別為root、app、swap
5、掛載/dev/vg_centos6lvm/LogVo100到/mnt/tmp
mount /dev/vg_centos6lvm/LogVo100 /mnt/tmp
6、新建fstab文件
touch /mnt/tmp/etc/fstab
7、對fstab文件添加掛載信息
vi /mnt/tmp/etc/fstab

8、重啟系統,掛載一下分區,然后進入救援模式
9、切根 chroot /mnt/sysimage
到此步不能用第十四題思路對grub解題
10、重新安裝內核
rpm -ivh /mnt/Packege/kernel-xxxxx.rpm --force
這里不同於“十四”,重新安裝內核,“十四”是通過復制光盤的文件到/boot,重寫grub.conf進行恢復
11、重寫grub.conf文件
#必須寫三項分別是title kernel initrd default 0 timeout 3 title Centos6_lvm kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/vg_centos6lvm/LogVo100 selinux=0 initrd /initramfs-2.6.32-696.el6.x86_64.img
12、重啟系統,恢復正常
十七 誤刪除/etc/fstab文件和/boot下的所有文件如何修復?
[root@Centos6 ~]# rm -rf /etc/fstab [root@Centos6 ~]# rm -rf /boot
重啟后進入如下界面

修復分析:進入救援模式怎么區分/boot,/,/swap?
可以通過掛載分區,進入掛載目錄里面,查看內容,以區分區掛載目錄
bash-4.1# mkdir /mnt/tmp #創建 bash-4.1# mount /sda1 /mnt/tmp #掛載到臨時文件 bash-4.1# ls /mnt/tmp #查看里面的內容,此處可以看到沒有任何文件可以判斷為/boot 通過以上方法就可以知道每個分區到底是什么
恢復方案:
1、進入救援模式
2、chroot /mnt/sysimage #切根
3、mkdir /mnt/tmp
4、mount /dev/sda2 /mnt/tmp
5、touch /mnt/tmp/etc/fstab #創建刪除的文件
6、vi /mnt/tmp/etc/fstab
/dev/sda1 /boot ext4 defaults 0 0
/dev/sda2 / ext4 defaults 0 0
/dev/sda5 swap swap defaults 0 0
錯誤一:擴展內存加上了/

錯誤二:文件系統類型為ext4

注:此處是一個大坑,稍有出錯會導致在救援系統里面無法掛載光盤
7、重啟系統進入救援模式
8、切根掛載光盤
chroot /mnt/sysimage/
mount /dev/cdrom /mnt
9、重新安裝內核
rpm -ivh /mnt/Packege/kernel-xxxxx.rpm --force
這里不同於“十四”,重新安裝內核,“十四”是通過復制光盤的文件到/boot,重寫grub.conf進行恢復
10、此時/boot會生成一些新文件 (看教程使用在強制安裝kernel后在做grub-instlal /dev/sda,通過我的操作過程我了解在重新安裝內核會自動生成grub目錄里面的內容)
11、新建grub.conf文件
#必須寫三項分別是title kernel initrd default 0 timeout 3 title Centos6 kernel /vmlinuz-2.6.32-696.el6.x86_64 ro root=/dev/sda2 initrd /initramfs-2.6.32-696.el6.x86_64.img
12、重啟系統,恢復正常