linux內核啓動修復

linux內核啓動修復

首先看一下linux內核重要文件grub.conflinux

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 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階段修復)

1
[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---------------------------
一、重啓系統按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
二、經過修改/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命令
1
sh-4.1 # grub
 
1
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的位置會出現以下報錯

1
2
3
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
 
1
2
3
4
#此時只能進入救援模式切根修改文件
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)一行系統啓動會出現的狀況

1
2
3
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調換順序,開機啓動狀況?

1
2
3
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    密碼     此時驗證的時候不知道都不會成功
1
password zangfans
 
 
驗證會出現Failed
 
修復方案
在hidddenmenu上方和initrd下方各插入一行
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
# 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
明文加密
一、使用grub-md5-crypt設置密碼
1
2
3
4
[root@Centos6 ~] # grub-md5-crypt
Password:
Retype password:
$1$Z.gAn/$Xd647hXfPj /sJ .i8A0By8.
 
進入/boot/grub/grub.conf文件使用vim編譯器的功能
輸入密碼和驗證,便可生成一段md5加密的字符串
1
password --md5 $1$V1hAn/$hSLRXWfIZWwVtYz4th5rg1
 
 
密文加密
二、使用grub-crypt及sha512進行加密
1
2
3
4
[root@Centos6 ~] # grub-crypt              
Password:
Retype password:
$6$jkKAT.eUrv3d4bfM$f41lkKlqQk3fAPqNwgy93J6Wi6bVF.zB5b.24V1QPwAGXkVVmwk2MGdi1UxzStHBaPWarW20AppaOvwheNRRj.
 
修改/boot/grub/grub.conf文件
1
password --encrypted $6$ndPVD /LnVhjBwHaG $XlSiTmJfRJrWufrmH0tLzle /zlmCB .Zyi /WClkcL8G43NDpXlKuQPvsw4AiIJqT1fJrb2Kh8DgZLY68pIAKFI0

 

十 若是忘記root帳號口令,如何修復?

修復方案:
能夠經過救援模式刪除口令
 
刪除口令以後進入系統直接輸入root用戶 無需密碼驗證就能夠登陸
 

十一 設置grub背景圖片

圖片像素和格式是有要求的
使用convert工具對圖片像素進行設置
首先得安裝convert命令所提供的包
1
2
3
4
5
6
7
8
[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界面就能看到設置的背景圖片
查看內核啓動參數內核參數
1
2
[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文件
重啓系統進入以下界面
解釋:stage一、stage1.5沒有問題主要stage2有問題,連菜單都進不去,直接跳到grub
修復方案:
grub支持交互式輸入,若是沒有grub.conf文件能夠手動輸入
 

十三 刪除/boot/grub整個目錄,如何修復?

1
[root@Centos6 ~] # rm -rf /boot/grub
 
重啓進入以下界面
 
修復方案:
一、進入救援模式
二、chroot /mnt/sysimage 切根
三、使用grub-install /dev/sda
四、sync同步磁盤,此時grub目錄已經修復好了
五、寫一個grub.conf文件
由於修復時並無grub.conf文件必須手寫
1
2
3
4
5
6
#必須寫三項分別是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下全部文件如何修復?  

環境:
1
2
3
4
5
6
7
8
[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。內核:能夠在光盤裏面找或者去其它相同系統的機子上拷一份
修復方案:
一、進入救援模式
二、chroot /mnt/sysimage  切根
三、掛載光盤    mount /dev/sr0  /mnt
四、cd /mnt/selinux/
vmlinuz  大小和剛開始文件系統大小是同樣的,說明內核是一個固定不變的東西
五、cp vmlinuz /boot  複製內核到/boot下
六、mkinitrd /boot/initramfs.img `uname -r`
七、grub-install /dev/sda
八、在/boot/grub目錄下新建一個grub.conf文件
default o
timeout 3
title Centos6
kernel  /vmlinuz ro root=/dev/sda2
initrd    /initramfs.img
九、重啓恢復正常
 

十五 誤刪除/sbin/init,沒法進入系統如何修復?

1
[root@Centos6 ~] # mv /sbin/init ~/
 
 
恢復方案;
一、進入grub
二、按a鍵在後面添加 init=/bin/bash  #指定不用系統默認的init,使用/bin/bash來代替
用bash來做爲計算機的第一個進程,bash內置了一些內部命令
四、回車以後進入以下界面,能夠輸入一些命令
 
五、查看/sbin/bash命令來自哪一個包
1
2
bash -4.1 # rpm -qf /sbin/init
#upstart包提供
 
此時掛載是隻讀掛載,不能安裝此包
 
六、從新掛載根,默認只讀掛載
1
bash -4.1 # mount -o remount,rw /
 
 
七、安裝upstart包
注意此時光盤已經掛載,安裝包要覆蓋安裝,--force選項,upstart包畢竟已經安裝過了
1
2
3
#默認光盤已經掛載在/mnt
bash -4.1 # cd /mnt
bash -4.1 # rpm -ivh /Packages/upstart-xxxxxx  --force
 
 
八、同步到磁盤
1
bash -4.1 # sync
 
 
九、檢查一下能夠看到/sbin/bin
總結:/sbin/bin文件誤刪除後,不須要進入救援模式就能夠直接經過命令進行修復,過程當中發現根是隻讀掛載的,必須從新掛載才能安裝upstart包
 

十六 根文件系統放在邏輯捲上,若誤操做刪除/fstab,/boot/*文件該如何恢復?

1
2
[root@Centos6-LVM ~] # mv /etc/fstab /root
[root@Centos6-LVM ~] # rm -rf /boot/*
 
此時boot裏面的內核文件已經刪除了,因此不能經過手寫恢復,只有經過救援模式
重啓直接進入grub
修復分析:boot分區是不能放在邏輯捲上的,那麼有多快邏輯卷如何區分哪塊邏輯卷是根?
恢復方案:
一、進入救援模式
二、建立一個臨時目錄   mkdir /mnt/tmp
三、激活邏輯卷  vgchage -ay    #當前邏輯卷狀態處於非活動狀態,必須激活才能夠
 
四、根據個人機器我從裏面文件的結構和大小了解到,Vo100,Vo101app,Vo102分別爲root、app、swap
五、掛載/dev/vg_centos6lvm/LogVo100到/mnt/tmp
mount /dev/vg_centos6lvm/LogVo100 /mnt/tmp
六、新建fstab文件
touch /mnt/tmp/etc/fstab
七、對fstab文件添加掛載信息
vi /mnt/tmp/etc/fstab
八、重啓系統,掛載一下分區,而後進入救援模式
九、切根 chroot /mnt/sysimage
到此步不能用第十四題思路對grub解題
十、從新安裝內核
rpm -ivh /mnt/Packege/kernel-xxxxx.rpm --force
這裏不一樣於「十四」,從新安裝內核,「十四」是經過複製光盤的文件到/boot,重寫grub.conf進行恢復
十一、重寫grub.conf文件
1
2
3
4
5
6
#必須寫三項分別是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
十二、重啓系統,恢復正常
 

十七 誤刪除/etc/fstab文件和/boot下的全部文件如何修復?

1
2
[root@Centos6 ~] # rm -rf /etc/fstab
[root@Centos6 ~] # rm -rf /boot
 
重啓後進入以下界面
修復分析:進入救援模式怎麼區分/boot,/,/swap?能夠經過掛載分區,進入掛載目錄裏面,查看內容,以區分區掛載目錄
 
1
2
3
4
bash -4.1 # mkdir /mnt/tmp   #建立
bash -4.1 # mount /sda1 /mnt/tmp   #掛載到臨時文件
bash -4.1 # ls /mnt/tmp    #查看裏面的內容,此處能夠看到沒有任何文件能夠判斷爲/boot
經過以上方法就能夠知道每一個分區究竟是什麼
 
恢復方案:
一、進入救援模式
二、chroot /mnt/sysimage   #切根
三、mkdir /mnt/tmp
四、mount /dev/sda2 /mnt/tmp
五、touch /mnt/tmp/etc/fstab   #建立刪除的文件
六、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
注:此處是一個大坑,稍有出錯會致使在救援系統裏面沒法掛載光盤
七、重啓系統進入救援模式
八、切根掛載光盤
chroot /mnt/sysimage/
mount /dev/cdrom /mnt
九、從新安裝內核
rpm -ivh /mnt/Packege/kernel-xxxxx.rpm --force
這裏不一樣於「十四」,從新安裝內核,「十四」是經過複製光盤的文件到/boot,重寫grub.conf進行恢復
十、此時/boot會生成一些新文件  (看教程使用在強制安裝kernel後在作grub-instlal /dev/sda,經過個人操做過程我瞭解在從新安裝內核會自動生成grub目錄裏面的內容)
十一、新建grub.conf文件
1
2
3
4
5
6
#必須寫三項分別是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
 

 十二、重啓系統,恢復正常算法

相關文章
相關標籤/搜索