1. 程式人生 > >首先看linux內核重要文件grub

首先看linux內核重要文件grub

x86 背景圖片 lsi 標題 flow 登錄 position which fst

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階段修復)

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用戶無需密碼驗證就可以登錄 技術分享圖片

十一 設置啟動背景圖片

圖片像素和格式是有要求的 使用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包

十六 誤刪除/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、重啟系統,恢復正常

十七 根文件系統放在邏輯卷上,若誤操作刪除/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、重啟系統,恢復正常

首先看linux內核重要文件grub