操作系統啓動失敗如下圖報錯:
故障現象:
從圖中可以看到,操作系統啓動的過程中,fsck在執行文件系統檢測時出現了錯誤,並且是在檢查/dev/mapper/VolGroup-lv_home時出錯,提示此文件不存在;
故障分析:
這是一個什麼界面,爲何會出現這個界面?
CentOS6.4的操作系統啓動的的大致過程爲:加載BootLoader-à加載kernel-àinit執行系統初始化-à用戶登錄;而在init執行系統初始化的過程中,會執行系統初始化腳本/etc/rc.d/rc.sysinit,在此腳本中即會執fsck -A進行文件系統檢測;
fsck -A會執行什麼操作呢?
fsck -A會遍歷文件/etc/fstab,檢查其中定義的所有的文件系統。fsck在做文件系統檢查前通常不會去檢查設備是否真實存在,所以如果某設備不存在,而又去做了fsck,fsck即會報錯,繼而導致啓動操作系統時會進入文件系統修復模式(file system repair mode),而中斷正常的操作系統啓動;
所以,這就是爲何會出現此界面的原因了。
解決方法:
既然是fsck執行失敗,導致操作系統無法繼續啓動,所以可以在操作系統啓動時,讓fsck跳過檢查這個有問題的/dev/mapper/VolGrouplv_home即可正常啓動操作系統;(在/etc/fstab中設置此項的第6個字段fs_passno的值設爲0,即意爲fsck不檢查此行)
但是此時文件系統修復模式下所有文件都是隻讀的,無法編輯/etc/fstab;所以此時可以選擇從系統光盤啓動,選擇進入緊急救援模式下去修改文件(因爲緊急修復模式不會執行/etc/rc.d/rc.sysinit,所以不會出現此報錯);下面3行是在緊急救援模式下的操作:
1 2 3 | bash-4.1# chroot /mnt/sysimage sh-4.1# vim /etc/fstab ##將/dev/mapper/VolGrouplv_home這一行的第6個字段設爲0 sh-4.1# reboot -r |
此時即可正常啓動系統,不過中途會看到如下界面:
此時已沒有fsck的報錯,但是mount掛載文件系統時有一個failed的信息,這是因爲在系統初始化腳本/etc/rc.d/rc.sysinit中,文件系統檢測完成後的下一步即是根據/etc/fstab文件中的定義去掛載文件系統;此時即提醒找不到/dev/mapper/VolGroup-lv_home,所以會出現上圖紅圈內的報錯;
並且從此界面可以明確的看到問題的所在了,/dev/mapper/VolGroup-lv_home不存在;雖然有此failed信息,但不影響系統可以繼續啓動;
上圖綠色圈中的是需等待SELinux自動完成重新打標,若不想等待,可以在系統啓動時禁入編輯模式,禁用SELinux的啓動即可,如下圖:
--------------------------------------------------------------------
至此操作系統已經可以啓動起來,此處需介紹下背景了,此係統安裝時是按照系統默認的分區佈局(partitioning layout),如下圖:
一塊硬盤sda,分成了sda1與sda2兩個分區,sda2做成物理卷,基於此物理卷創建的卷組名稱爲VolGroup,在此卷組上創建了3個邏輯卷,名稱分別爲lv_root、lv_home、lv_swap,並且此邏輯卷lv_root與lv_home分別掛載到了文件系統中的/目錄和/home目錄;
所以前文中/dev/mapper/VolGroup-lv_home即是此係統自動創建的掛載在/home的邏輯卷;比如由於誤操作(umount、lvremove,或是系統斷電等其他意外情況也可能會導致類似問題),刪除了此邏輯卷,然後在重啓電腦時,即會出現開篇處的報錯了。
--------------------------------------------------------------------------------------------------------------------------------------
現在操作系統已經啓動登錄,也知道問題所在了,那麼接下來如何恢復此邏輯卷呢?
此時,系統中查看此邏輯卷的確是已被刪除;
1 2 3 4 5 6 7 | [root@mysqlhost1 ~]# lvs LV VG Attr LSize Pool Origin Data% Move Log Cpy%Sync Convert lv_root VolGroup -wi-ao--- 50.00g lv_swap VolGroup -wi-ao--- 992.00m [root@mysqlhost1 ~]# ll /dev/VolGroup/ lrwxrwxrwx 1 root root 7 10月 22 20:27lv_root -> ../dm-0 lrwxrwxrwx 1 root root 7 10月 22 20:27lv_swap -> ../dm-1 |
並且由於此邏輯卷是掛載在/home目錄下,此邏輯卷丟失,那麼/home目錄下的數據,是否也是一同丟失了呢?如何恢復/home目錄下原有的數據?
lvremove刪除邏輯卷,其只是會清除LVM的部分元數據信息(metadata),真正的數據仍會被完整的保留;即雖然邏輯卷lv_home被刪除了,但是原/home下的數據仍然存在,只是現在暫且看不到;
並且默人的配置是,LVM的物理卷、卷組或是邏輯捲髮生任何改動之前,LVM的元數據信息都會自動保存至/etc/lvm/archive目錄下;
所以我們只需恢復邏輯卷lv_home被刪除前的自動備份的LVM的元數據信息,邏輯卷lv_home即可自動恢復,然後後重新掛載,即可查看到/home目錄下原有的數據了;如下操作步驟:
1 2 3 4 5 6 | ##查看和卷組VolGroup相關的元數據備份信息 [root@mysqlhost1 ~]# vgcfgrestore --list VolGroup File: /etc/lvm/archive/VolGroup_00001-560861966.vg VG name: VolGroup Description: Created *before* executing 'lvremove /dev/VolGroup/lv_home' Backup Time: Wed Oct 22 17:33:17 2014 |
此處的結果中可以看到在執行'lvremove /dev/VolGroup/lv_home'之前,卷組的元數據自動被備份到了文件/etc/lvm/archive/VolGroup_00001-560861966.vg中
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | ##從對應文件中恢復卷組VolGroup的那一刻的元數據信息 [root@mysqlhost1 ~]# vgcfgrestore -f/etc/lvm/archive/VolGroup_00001-560861966.vg VolGroup Restored volume group VolGroup ##此時即可看到此邏輯卷lv_home了 [root@mysqlhost1 ~]# lvscan ACTIVE '/dev/VolGroup/lv_root' [50.00 GiB] inherit inactive '/dev/VolGroup/lv_home' [108.54 GiB] inherit ACTIVE '/dev/VolGroup/lv_swap' [992.00 MiB] inherit ##激活此邏輯卷 [root@mysqlhost1~]# lvchange -ay /dev/VolGroup/lv_home [root@mysqlhost1 ~]# lvscan ACTIVE '/dev/VolGroup/lv_root' [50.00 GiB] inherit ACTIVE '/dev/VolGroup/lv_home' [108.54 GiB] inherit ACTIVE '/dev/VolGroup/lv_swap' [992.00 MiB] inherit |
1 2 3 4 5 6 | ##恢復/etc/fstab中剛纔做的改動 [root@mysqlhost1 ~]# vi /etc/fstab ##重新掛載 [root@mysqlhost1 ~]# mount -a ##/home目錄下原有的數據也都可以查看到了 [root@mysqlhost1 ~]# ls /home |