1. 程式人生 > >Linux故障處理(一)系統啟動類故障

Linux故障處理(一)系統啟動類故障

侯良金 啟動故障 mbr修復 grub修復

Linux故障處理(一)系統啟動類故障

Linux系統的啟動過程中,涉及MBR主引導記錄、GRUB啟動菜單、系統初始化配置文件等各方面,其中任何一個環節出現故障都可能會導致系統啟動的失常,因此一定要註意做好相關文件的備份工作。(本實驗環境為RHEL6

一、MBR扇區故障

MBR引導記錄位於物理硬盤的第一個扇區(512B),該扇區又稱為主引導扇區(MBR扇區),除了包含系統引導程序的部分數據以外,還包含了整個硬盤的分區表記錄。當主引導扇區發生故障時,將可能無法進入引導菜單,或者因無法找到正確的分區位置而無法加載系統,通過該硬盤引導主機很可能進入黑屏狀態。

1、備份MBR扇區數據

由於MBR扇區中包含了整個硬盤的分區表記錄,因此該扇區的備份文件必須存放到其他的存儲設備中,否則在恢復時將無法讀取到備份文件。

下面將添加一塊/sdb硬盤,將MBR扇區備份到/sdb1分區中(掛載到/hlj目錄下)

[root@localhost ~]# mkdir  /hlj
[root@localhost ~]# mount  /dev/sdb1  /hlj
[root@localhost ~]# dd if=/dev/sda of=/hlj/sda.mbr.bak bs=512 count=1
記錄了1+0 的讀入
記錄了1+0 的寫出
512字節(512 B)已復制,0.000180294 秒,2.8 MB/秒


2、模擬MBR扇區故障

這裏使用dd命令,人為地將MBR扇區的記錄覆蓋,以便模擬MBR扇區被破壞的故障情況(切記要做好備份,而且將備份文件存放到其他硬盤)。例如,執行以下操作可以從設備文件

zero中讀取512字節的數據,將其覆蓋到第1塊硬盤(sda),從而破壞MBR扇區中的數據。

[root@localhost ~]# dd  if=/dev/zero  of=/dev/sda  bs=512  count=1


完成上述命令之後重啟系統,這是將會出現“Operating system not found”的提示信息,表示無法找到可用的操作系統,因此無法啟動主機。

技術分享圖片


3、從備份文件中恢復MBR扇區數據

由於MBR扇區被破壞以後,已經無法再從該硬盤啟動系統,所以需要使用其它硬盤中的操作系統進行引導,或者直接使用RHLH6系統中的安裝光盤進行引導。不管使用哪種方法,目的都是相同的,獲得一個可以執行命令的

Shell環境,以便從備份文件中恢復MBR扇區中的數據。

接下來以RHEL6安裝光盤引導為例,當出現安裝向導界面,選擇“Rescue installed system,將以“急救模式”引導光盤中的Linux系統。

技術分享圖片

之後依次按Enter鍵接受默認的語言、鍵盤格式,提示是否配置網卡時一般選擇“NO”,然後系統會自動查找硬盤中的Linux分區並嘗試將其掛載到“/mnt/sysimage”目錄(選擇“Continue”確認並繼續)。接下來會出現rescue窗口,單擊“ok”按鈕。

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片

技術分享圖片


最後,進入到帶“bash-4.1#”提示符的Bash Shell環境,只要執行相應的命令掛載保存有備份的硬盤分區(sdb1),並將數據恢復到硬盤“/dev/sda”中即可。當前使用的系統環境是光盤中的Linux目錄結構。

技術分享圖片


因為MBR損壞,已經無法獲得有效的分區列表,所以新建一個目錄hou,將“sdb1”掛載到目錄“/hou”下。

bash-4.1# mkdir   /hou
bash-4.1# mount /dev/sdb1  /hou


使用dd命令再把sdb1中的MBR備份文件寫入到被破壞的sda中。

bash-4.1# dd if=/dev/hou/sda.mbr.bak of=/sda


完成後,執行“reboot”重新啟動系統。


二、GRUB引導故障

1.修復grub.conf文件丟失或損壞

GRUB是大多數Linux系統默認使用的引導程序,可以通過啟動菜單的方式選擇進入不同的操作系統。當配置文件/boot/grub/grub.conf丟失,或者關鍵配置出現錯誤,或者MBR記錄中的引導程序遭到破壞時,Linux主機啟動後只能出現“grub>”的提示符,無法完成進一步的系統啟動過程。

這裏需要把grub.conf文件提前備份好,如果沒有備份則只能重寫一份grub.conf文件

[root@localhost ~]#mkdir /hlj

[root@localhost ~]#mount /dev/sdb1 /hlj

[root@localhost ~]# cp /boot/grub/grub.conf /hlj/grub.conf

[root@localhost ~]# rm -rf /boot/grub/grub.conf

[root@localhost ~]# reboot


技術分享圖片

若在該提示符後可以進行編輯,則通過輸入對應的引導命令(可參考其他相同版本RHEL系統中/boot/grub/grub.conf文件的引導語句),然後在執行“boot”命令即可正常引導Linux系統。

grub>root (hd0,0)
grub>kernel /vmlinuz-2.6.32-71.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_LVM_LV=VolGroup/lv_root 
      rd_LVM_LV=VolGroup/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us crashke
     rnel=auto rhgb quiet
grub>initrd /initramfs-2.6.32-71.el6.i686.img
grub>boot


之後的啟動過程與正常啟動RHEL6系統的過程是一樣的。登錄進入系統以後,需要找到配置文件/boot/grub/grub.conf,並修復其中的錯誤,或者直接重建該文件。具體內容可以參考其他正常主機中的同名文件。

RHEL6中,執行以下命令可以查看GRUB配置文件的grub.conf的默認內容。

[root@localhost ~]# grep -v "^#" /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-71.el6.i686)
      root (hd0,0)
      kernel /vmlinuz-2.6.32-71.el6.i686 ro root=/dev/mapper/VolGroup-lv_root rd_LVM_LV=VolGroup/lv_root rd_LVM_LV=VolGroup/lv_swap rd_NO_LUKS rd_NO_MD rd_NO_DM.UTF-8 KEYBOARDTYPE=pc KEYTABLE=us crashkernel=auto rhgb quiet
      initrd /initramfs-2.6.32-71.el6.i686.img


其中,各主要配置項含義如下。

title:指定在啟動菜單中顯示的操作系統名稱。

root 指定包含內核等引導文件的/boot分區所在的位置。

kernel:指定內核文件所在的位置,內核加載時權限只讀“ro”,並通過“root=”指定根分區的設備文件位置。

initrd 指定啟動內核所使用的臨時系統鏡像文件所在的位置。

由於在“grub>”環境中使用的命令較為復雜,而且一般也難以記住相關的命令選項、內核加載參數等,因此用戶可以采用另一種修復辦法,同樣使用RHEL6的安裝光盤引導進入急救模式(參考上面修復MBR),若分區表未被破壞,則急救模式將會找到硬盤中的Linux根分區,並將其掛載到光盤目錄結構中的/mnt/sysimage/文件夾中。

進入“bash-4.1#”的Shell環境以後,執行“chroot /mnt/sysimage”命令可以將目錄結構切換到待修復的Linux系統中,然後重寫(或通過之前備份的文件恢復)grub.conf配置文件即可。

技術分享圖片

2.MBR中的grub引導程序損壞

如果是MBR扇區中的引導程序出現損壞,可能在重建grub.conf配置文件後仍然無法成功啟動系統,這時候可以通過RHEL6救援模式的Shell環境重新安裝grub引導程序。切換到待修復的Linux系統根環境,執行“grub-install /dev/sda”命令可以重新將grub引導程序安裝到第一塊硬盤(sda)的MBR扇區。(grub.conf文件丟失或損壞此方式不可用)

技術分享圖片


上述方法同樣適用於在Linux主機中重裝windows系統(不覆蓋Linux系統)後導致Linux系統無法啟動的情況。因為對於適用雙操作系統的主機後,安裝的Windows系統將適用自己的引導數據覆蓋MBR扇區中的記錄,導致開機後不再出現GRUB菜單從而無法進入Linux系統。如果是後安裝的Linux系統,GRUB程序將會自動識別硬盤中的Windows系統並將其加載到GRUB菜單配置中。

Linux故障處理(一)系統啟動類故障