導致linux無法啟動的原因有很多,常見的原因有如下幾種:
文件系統配置不當,比如/etc/inittab文件、/etc/fstab文件等配置錯誤或丟失,導致系統錯誤,無法啟動。
非法關機,導致root文件系統破壞,也就是linux根分區破壞,系統無法正常啟動
Linux內核崩潰,從而無法啟動
系統引導程序出現問題,比如grub丟失或者損壞,導致系統無法引導啟動。
硬件故障,比如主板、電源、硬盤等出現問題,導致linux無法啟動。
從這些常見的故障可知,導致系統無法啟動的主要有兩個問題,硬件原因和操作系統原因,對于硬件出現的問題,只需通過更換硬件設備,即可解決,而對于操作系統出現的問題,雖然出現的問題可能千差萬別,不過在多數情況下都可以用相對簡單統一的一些方法來恢復系統,下面我們就針對上面提出的幾個問題,結合Redhat Linux系統環境,給出一些常用的、普遍的解決問題的方法。
1./etc/fstab文件丟失,導致系統無法啟動
/etc/fstab文件存放了系統中文件系統的相關信息,如果正確的配置了該文件,那么在linux啟動時,系統會讀取此文件,自動掛載linux的各個分區,如果此文件配置錯誤,或者丟失,就會導致系統無法啟動,具體的故障現象是在檢測mount partition時出現:
starting system logger
此后系統啟動就停止了。
針對這個問題,我們的第一思路就是想辦法恢復/etc/fstab這個文件的信息,只要恢復了此文件,系統就能自動掛載每個分區,正常啟動。可能很多讀者首先想到的是將系統切換到單用戶模式下,然后手動掛載分區,最后結合系統信息,重建/etc/fstab文件。
但是這種方法是行不通的,因為fatab文件丟失導致linux無法掛載任何一個分區,即使linux還能切換到單用戶下,那么此時的系統也只是一個read-only的文件系統,無法向磁盤寫入任何信息。
我們介紹另外一個方法,就是利用linux rescue修復模式登錄系統,進而獲取分區和掛載點信息,重構/etc/fstab文件。
這里以rhel5為例,首先將系統第一章光盤放入光驅,設置BOIS從光驅啟動,這樣系統就從光驅引導,然后在boot后輸入:linux rescue,如圖1所示:
圖1設置linux進入修復模式
接著系統自動開始引導,進入圖2所示畫面:
圖2 選擇語言
這里是選擇模式使用的語言,可以按照自己需要設定,我們這里選擇“English“,然后按tab鍵,選中“ok”,回車進入下一步。
下面進入的是鍵盤選擇界面,如圖3所示,這里選擇默認的“us”即可。
圖3 選擇鍵盤類型
下面進入網絡配置界面,如圖4所示:
圖4 是否啟用網絡
這里是選擇是否啟用網絡,由于系統已經無法啟動,我們已經在linux系統上進行操作了,啟用網絡與否都無所謂。這里選擇不啟用。
下面到了最關鍵的步驟了,如圖5所示,修復模式會自動將系統的所有分區掛載到/mnt/sysimage目錄下,選擇“Continue”,則修復環境進入到read-write狀態下,可以對分區進行讀寫操作,選擇“Read-Only”,修復環境進入到只讀模式,由于我們要重建fstab文件到/etc目錄下,因此選擇“Continue”進入可讀寫模式下。
圖5 選擇修復模式的啟動方式
下面是一個友情提示界面,如圖6所示,由于fstab文件丟失,修復模式找不到任何可掛載的分區,從這里可知,修復模式在這里也讀取/etc/fstab文件,回車,進入下一步。
圖6 無法掛載系統任何分區
下面就進入了修復環境下,可以進行操作了。如圖7所示
圖7 修復模式命令行
上面詳細演示了如何進入linux的修復模式,其實很多情況下,linux無法啟動時,都可以通過這個方式登錄系統進行修復和更改操作。
下面是恢復/etc/fstab文件的詳細過程:
首先查看一下系統分區情況,如下所示:
sh-3.1# fdisk -l
Disk /dev/sda: 42.9 GB, 42949672960 bytes
255 heads, 63 sectors/track, 5221 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Device Boot Start End Blocks Id System
/dev/sda1 * 1 25 200781 83 Linux
/dev/sda2 26 1300 10241437+ 83 Linux
/dev/sda3 1301 1682 3068415 83 Linux
/dev/sda4 1683 5221 28427017+ 5 Extended
/dev/sda5 1683 1873 1534176 83 Linux
/dev/sda6 1874 2064 1534176 83 Linux
/dev/sda7 2065 2255 1534176 83 Linux
/dev/sda8 2256 2382 1020096 83 Linux
/dev/sda9 2383 2484 819283+ 82 Linux swap / Solaris
/dev/sda10 2485 5221 21984921 83 Linux
因為分區并沒有損壞,通過fdisk命令可以查看到系統分區的完整信息,但是每個分區對應的label name信息我們還不知道,下面通過e2label命令查看每個分區對應的label name:
sh-3.1# e2label /dev/sda1
/boot
sh-3.1# e2label /dev/sda2
/usr
sh-3.1# e2label /dev/sda3
/
sh-3.1# e2label /dev/sda5
/var
sh-3.1# e2label /dev/sda6
/tmp
sh-3.1# e2label /dev/sda7
/home
sh-3.1# e2label /dev/sda8
/opt
sh-3.1# e2label /dev/sda10
/webdata
這樣,就得到了所有分區的掛載點信息,接下來就可以構造一個fstab文件了。
小技巧:可以參考其它系統中fstab文件的格式,結合本系統的分區和掛載點信息,構造出自己的fstab文件來。
由于fstab文件是存放在系統根目錄下的,因此需要掛載原來系統的根分區,從上面可知根分區對應的設備名為/dev/sda3,接著在修復模式創建的臨時根分區下創建一個掛載點,然后掛載原來系統的根分區。操作過程如下所示:
sh-3.1# pwd
/
sh-3.1# mkdir temp
sh-3.1# mount /dev/sda3 /temp
sh-3.1# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev 515644 0 515644 0% /dev
/tmp/loop0 79872 79872 0 100% /mnt/runtime
/dev/sda3 2972268 259916 2558932 10% /temp
這樣以來,原有根分區的文件全部掛載到了/temp目錄下,接著就可以創建我們需要的fatab文件了。
sh-3.1# vi /temp/etc/fstab
LABEL=/ / ext3 defaults 1 1
LABEL=/boot /boot ext3 defaults 1 2
LABEL=/cicro /cicro ext3 defaults 1 2
devpts /dev/pts devpts gid=5,mode=620 0 0
tmpfs /dev/shm tmpfs defaults 0 0
LABEL=/home /home ext3 defaults 1 2
LABEL=/opt /opt ext3 defaults 1 2
proc /proc proc defaults 0 0
sysfs /sys sysfs defaults 0 0
LABEL=/tmp /tmp ext3 defaults 1 2
LABEL=/usr /usr ext3 defaults 1 2
LABEL=/var /var ext3 defaults 1 2
LABEL=SWAP-sda9 swap swap defaults 0 0
配置完畢,保存退出,然后重啟系統。
sh-3.1#reboot
2、root文件系統破壞,導致系統無法啟動
Linux下普遍采用的是ext3文件系統,ext3是一個具有日志記錄功能的日志文件系統,可以進行簡單的容錯和恢復,但是在一個高負荷讀寫的ext3文件系統下,如果突然發生掉電,就很有可能發生文件系統內部結構不一致,導致文件系統破壞。
Linux在啟動時,會自動去分析和檢查系統分區,如果發現文件系統有簡單的錯誤,會自動修復,如果文件系統破壞比較嚴重,系統無法完成修復時,系統就會自動進入單用戶模式下或者出現一個交互界面,提示用戶介入手動修復,現象類似下面所示:
checking root filesystem
/dev/sdb5 contains a file system with errors, check forced
/dev/sdb5:
Unattached inode 68338812
/dev/sdb5: UNEXPECTED INCONSISTENCY; RUN fsck MANUALLY
(i.e., without -a or -p options)
FAILED
/contains a file system with errors check forced
an eror occurred during the file system check
****dropping you to a shell;the system will reboot
****when you leave the shell
Press enter for maintenance
(or type Control-D to continue):
give root password for maintenance
從這個錯誤可以看出,系統根分區文件系統出現了問題,系統在啟動時無法自動修復,然后進入到了一個交互界面,提示用戶進行系統修復。
這個問題發生的機率很高,引起這個問題的主要原因就是系統突然掉電,引起文件系統結構不一致。一般情況下解決此問題的辦法是采用fsck命令,進行強制修復。
根據上面的錯誤提示,當按下“Control-D”組合鍵后系統自動重啟,當輸入root密碼后進入系統修復模式,在修復模式下,可以執行fsck命令,具體操作過程如下:
[root@localhost /]#umount /dev/sdb5
[root@localhost /]#fsck .ext3 -y /dev/sdb5
e2fsck 1.39 (29-May-2006)
/ contains a file system with errors, check forced.
Pass 1: Checking inodes, blocks, and sizes
Pass 2: Checking directory structure
Pass 3: Checking directory connectivity
Pass 4: Checking reference counts
Inode 6833812 ref count is 2, should be 1. Fix<y>? yes
Unattached inode 6833812
Connect to /lost+found<y>? yes
Inode 6833812 ref count is 2, should be 1. Fix<y>? yes
Pass 5: Checking group summary information
Block bitmap differences: -(519--529) -9273
Fix<y>? yes
…… ……
/: ***** FILE SYSTEM WAS MODIFIED *****
/: 19/128520 files (15.8% non-contiguous), 46034/514048 blocks
上面就是fsck修復受損文件系統的過程,fsck詳細用法在本書第四章有詳細的講述,這里不在多講。需要注意的是,在執行fsck的時候,一定要先卸載要修復的分區,然后再執行修復操作,切記!
三、其它故障的一般解決方案
如果是linux的引導程序出現問題,那么也可以通過光盤引導的方式進入linux修復模式,然后修改對應的引導程序或者重新安裝引導程序。
如果linux內核崩潰或者丟失,同樣可以先進入linux rescue下,然后加載root分區,最后重新編譯內核。
如果出現了最壞的情況,文件系統破壞嚴重,同時內核也崩潰,那么此時重新安裝系統反而比較容易,在這種情況下可以先將linux上有用的數據和文件備份轉移到其它設備,然后對整個文件系統進行全新安裝。
在這里我們不可能對每個出現的問題,都給出詳細的解決方案,問題都是千差萬別的,每個問題的處理都不盡相同,本書要傳授給大家的是當linux系統出現問題后,解決問題的一般思路和通用策略,熟練掌握了這些技巧,處理任何linux問題都能游刃有余。