linux系統無法正常啟動,故障排查恢復


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階段已經成功了
注:如果后期沒有更改時間,grub.conf文件時間就是安裝操作系統的時間
在grub.conf文件下kernel沒有寫 /boot分區是因為boot是一個 獨立分區,此文件是相對於boot分區,/=/boot
如果沒有指定root的位置必須指定kernel,initrd的位置及在前面加上(hd0,0),即為/boot
 

五  如果沒有root(hd0,0)且kernel,initrd不指定/boot的位置會出現如下報錯

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
 
開頭出現下面的提示,但是 系統能夠正常的啟動
 
 

七 調換kernel和initrd調換順序,開機啟動情況?

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 

 

十 如果忘記root賬號口令,如何修復?

修復方案:
可以通過救援模式刪除口令
 
刪除口令之后進入系統直接輸入root用戶 無需密碼驗證就可以登錄
 

十一 設置grub背景圖片

圖片像素和格式是有要求的
使用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、重啟系統,恢復正常


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM