Linux系統故障排查和解決方法

來源:文萃谷 2.12W

Linux系統在啟動過程中會出現一些故障,導致系統無法正常啟動,我在這裡寫了幾個應用單使用者模式、GRUB命令操作、Linux救援模式的故障修復案例幫助大家瞭解此類問題的解決。

Linux系統故障排查和解決方法

(一)單使用者模式

Linux系統提供了單使用者模式(類似Windows安全模式),可以在最小環境中進行系統維護。在單使用者模式(執行級別1)中,Linux引導進入根shell,網路被禁用,只有少數程序執行。單使用者模式可以用來修改檔案系統損壞、還原配置檔案、移動使用者資料等。

以下列舉了幾個單使用者模式修復系統故障的典型案例:

案例一:root密碼忘記

在單使用者模式中,Linux不需要root密碼(Red Hat系統不需要root密碼,但SuSe則需要,不同Linux系統稍有差別,本文以Fedora Core6為例講解),這使更改root密碼非常容易。瞭解當系統引導進入多使用者模式失敗時,如何進入單使用者模式,非常重要。

1、在系統啟動過程中,會出現開始介面,按任意鍵,進入GRUB選單選項。(若希望以後無此提示,直接進入GRUB選單選項,刪除配置檔案中“hiddenmenu”項即可。)

2、按“e”鍵編輯GRUB引導選單選項,按“e”鍵後的GRUB螢幕。通過箭頭鍵下移到kernel行,並按“e”鍵。

3、在尾行游標處新增single,按回車鍵返回前一個螢幕,按“b”鍵進行引導,則系統自動進入單使用者模式,如果要改變root密碼,則執行命令:sh-3.1#passwd root

更改成功後,執行命令exit退出重啟即可。

大家可以在單使用者模式中去糾正阻止系統正常啟動的很多問題,比如:

1、禁用可能中止系統執行的服務如禁用Samba服務,則執行:sh-3.1#chkconfig smb off下次系統引導就不會啟動Samba服務了。

2、更改系統預設執行級如果X Window無法啟動或者出現故障,可以編輯/etc/inittab檔案,採用文字方式登入,更改initdefault引導級別為3:id:3:initdefault:

案例二:硬碟扇區錯亂

在啟動過程中最容易遇到的問題就是硬碟可能有壞道或扇區錯亂(資料損壞)的情況,這種情況多由於異常斷電、不正常關機導致。

此種問題發生,在系統啟動的時候,螢幕會顯示:Press root password or ctrl+D:

此時輸入root密碼系統自動進入單使用者模式,輸入:fsck-y/dev/hda6

(fsck為檔案系統檢測修復命令,“-y”設定檢測到錯誤自動修復,/dev/hda6為發生錯誤的硬碟分割槽,請依據具體情況更改此引數)

系統修復完成後,用命令“reboot”重新啟動即可。

案例三、GRUB選項設定錯誤

“Error 15”顯示系統無法找到中指定的核心。

GRUB引導錯誤資訊,我們觀察發現因為打字錯誤,核心檔案的“vmlinuz”打成了“vmlinux”,所以系統無法找到核心的可執行檔案。

我們可以按任意鍵回到GRUB編輯介面,修改此錯誤,回車儲存後按“b”鍵即可正常引導,當然不要忘記進入系統後修改檔案中此處錯誤。

這是很多初學Linux的使用者在修改GRUB設定時很容易犯的錯誤,出現此黑屏提示時注意觀察報錯資訊,即可針對性修復。

(二)GRUB引導故障排除

我發現有時Linux啟動後會直接進入GRUB命令列介面(只有“grub>”提示符),此時很多使用者就選擇了重新安裝GRUB甚至重新安裝系統。

其實一般而言此故障的原因最常見的有兩個:

一是GRUB配置檔案中選項設定錯誤;

二是GRUB配置檔案丟失(還有少數原因,如核心檔案或映象檔案損壞、丟失,/boot目錄誤刪除等)

如果是第一種情況,可以首先通過GRUB命令引導系統後修復;若是第二種情況,則要使用Linux救援模式修復了。

首先,我們需要了解GRUB啟動系統的引導過程,檔案中主要的配置選項如下:

(注意,GRUB配置檔案為/boot/grub/,/etc/只是此檔案的軟連結)

title Fedora Core(6)

root(hd0,0)

kernel/boot/6 ro root=LABEL=/rhgb quiet initrd/boot/

其中:

“title”段指定了GRUB引導的系統:

“root”段指定了/boot分割槽所在的位置:

“kernel”段指定了核心檔案所在位置,核心載入時許可權屬性為只讀(“ro”)以及指定根分割槽所在位置(root=LABEL=/);

“initrd”指定了映象檔案所在位置。

所以GRUB在引導時順序為首先載入/boot分割槽,然後依次載入核心與映象檔案。

案例

“title Fedora Core(6)”段被誤刪除

此時,系統啟動後會自動進入“GRUB>”命令列,為排除故障我們可以依次做如下操作:

1、查詢/boot/grub/檔案所在分割槽GRUB>find/boot/grub/(hd0,0)

2、檢視檔案錯誤GRUB>cat(hd0,0)/boot/grub/建議系統安裝設定好後,要將檔案備份,如果有備份檔案如,則此時可以檢視備份檔案,與當前檔案比較,發現錯誤:GRUB>cat(hd0,0)/boot/grub/

3、確認錯誤後,先通過命令列方式完成GRUB引導,進入系統後再行修復檔案錯誤:

1)指定/boot分割槽root(hd0,0)

2)指定核心載入kernel/boot/6 ro root=LABEL=/rhgb quiet

3)指定映象檔案所在位置initrd/boot/

提示:GRUB支援tab鍵命令補全功能

4、從/boot分割槽啟動boot(hd0,0)

命令列模式可以在GRUB選單模式中通過按“c”鍵呼叫,也可以用於測試新編譯的核心(設定kernel、initrd引導新核心及映象檔案)。增加對GRUB引導以及Linux系統引導知識的瞭解將對此類故障排除大有幫助。

(三)Linux救援模式應用

當系統連單使用者模式都無法進入時或出現GRUB命令列也不能解決的引導問題,我們就需要使用Linux救援模式來進行故障排除了。

步驟如下:

1、將Linux安裝光碟(如果使用CD光碟,則放入第一張引導光碟)放入光碟機,設定韌體CMOS/BIOS為光碟引導,當Linux安裝畫面出現後,在“boot:”提示符後輸入“linux rescue”回車進入救援模式。(想了解救援模式詳細資訊,還可以按F5鍵檢視)

2、系統會檢測硬體,引導光碟上的Linux環境,依次提示你選擇救援模式下使用的語言(建議選擇預設的英文即可,根據筆者測試,部分Linux系統選擇中文會出現亂碼);鍵盤設定用預設的“us”就好;網路設定可以根據需要,大部分故障修復不需要網路連線,可不進行此項設定,選擇“No”。

3、接下來系統將試圖查詢根分割槽,出現掛載提示,設定預設在救援模式,硬碟的根分割槽將掛載到光碟Linux環境的/mnt/sysimage目錄下,預設選項“continue”表示掛載許可權為讀寫:“Read-only”為只讀,如果出現檢測失敗可以選擇“skip”跳過。此處,因為要對系統進行修復,所以需要有讀寫許可權,一般選擇預設選項“continue”。

進入下一步後,系統提示執行“chroot/mnt/sysimage”命令,可以將根目錄掛載到我們硬碟系統的根目錄中去。

案例一:雙系統啟動修復

當我們安裝雙系統環境,先安裝Linux再安裝Windows;或者已經安裝好雙系統環境的Windows損壞,在重新安裝Windows後,儲存GRUB的MBR(Master Boot Record,主引導記錄)會被Windows系統的自舉程式NTLDR所覆蓋,造成Linux系統無法引導。

1、如果要恢復雙系統引導,首先用上述方法進入救援模式,執行chroot命令如下:sh-3.1# chroot/mnt/sysimage

2、將根目錄切換到硬碟系統的根目錄中,然後執行grub-install命令重新安裝GRUB:sh-3.1# grub-install/dev/hda“/dev/hda”為硬碟名稱,如使用SCSI硬碟或Linux安裝在第二塊IDE硬碟,此項設定要做相應調整。

3、然後依次執行exit命令,退出chroot模式及救援模式(執行兩次exit命令):sh-3.1# exit系統重啟後,將恢復GRUB引導的雙系統啟動。

案例二:系統配置檔案丟失修復

系統在引導期間,很重要的一個過程就是init程序讀取其配置檔案/etc/inittab,啟動系統基本服務程式及預設執行級別的服務程式完成系統引導,如果/etc/inittab誤刪除或修改錯誤,Linux將無法正常啟動。此時,只有通過救援模式才可以解決此類問題。

/etc/inittab檔案丟失引導錯誤示例

1、有備份檔案的恢復辦法進入救援模式,執行chroot命令後,如果有此檔案的備份(強烈建議系統中的重要資料目錄,如/etc、/boot等要進行備份),直接將備份檔案拷貝回去,退出重啟即可。

如果是配置檔案修改錯誤,如比較典型的/boot/grub/及/etc/passwd的檔案修改錯誤,也可以直接修正恢復。

假設有備份檔案/etc/,則在救援模式下執行:sh-3.1#chroot/mnt/sysimage sh-3.1# cp/etc/

2、沒有備份檔案的恢復辦法如果一些配置檔案丟失或軟體誤刪除,且無備份,可以通過重新安裝軟體包來恢復。

首先查詢到/etc/inittab屬於哪一個RPM包(即便檔案丟失,因為存在RPM資料庫,一樣可以查詢到結果):

sh-3.1#chroot/mnt/sysimage sh-3.1#rpm-qf/etc/inittab initscripts-8.45.3-1

退出chroot模式:

sh-3.1#exit

掛載存放RPM包的安裝光碟(在救援模式下,光碟通常掛載在/mnt/source目錄下):

sh-3.1#mount/dev/hdc/mnt/source

Fedora系統的RPM包存放在光碟Fedora/RPMS目錄下,其他Linux存放位置大同小異,我在這裡不一一列舉;

另外,因為要修復的硬碟系統的.根目錄在/mnt/sysimage下,需要使用——root選項指定其位置。

覆蓋安裝/etc/inittab檔案所在的RPM包:

sh-3.1#rpm-ivh——replacepkgs——root/mnt/sysimage/mnt/source/Fedora/RPMS/

其中的rpm命令選項“——replacepkgs”表示覆蓋安裝,執行完成後,即已經恢復了此檔案。

如果想只提取RPM包中的/etc/inittab檔案進行恢復,可以在進入救援模式後,執行命令:

sh-3.1#rpm2cpio/mnt/source/Fedora/RPMS/|cpio-idv ./etc/inittab sh-3.1#cp etc/inittab/mnt/sysimage/etc

注意此命令執行時不能將檔案直接恢復至/etc目錄,只能提取到當前目錄下,且恢復的檔名稱所在路徑要寫完整的絕對路徑。提取檔案成功後,將其複製到根分割槽所在的/mnt/sysimage目錄下相應位置即可。

救援模式是維護Linux的有力武器,本文以上述兩個例子講解了它的應用方法,希望能夠給讀者一點啟示。解決Linux系統啟動的故障,必須充分理解Linux的引導過程,才能夠對故障進行有效的判斷和處理。

擴充套件:使用Linux系統常見的問題

1、在不登入情況下,獲得root許可權

如果沒有設定GRUB密碼,那我們可以使用最簡單的方法,首先啟動電腦,等待GRUB選單,如果GRUB選單隱藏,可以按Esc調出,選擇Ubuntu,kernel 2.6.12-*-*(recovery mode),也就是“恢復模式”按Enter啟動就可以了。

另外一個辦法是用Ubuntu安裝盤獲得root許可權,用Ubuntu安裝盤啟動電腦,當顯示“boot:”時,輸入“rescue”

boot:rescue

按螢幕提示操作就可以了。

2、通過改變核心啟動引數獲得根許可權

啟動電腦,等待GRUB選單,如果GRUB選單隱藏,可以按Esc調出,如果設定了GRUB密碼,按p來解鎖,比如我們選擇了Ubuntu,kernel 2.6.12-8-386,按e在啟動前編輯啟動引數,選擇kernel/boot/vmlinuz-2.6.12-8-386 root=/dev/hda 2ro quiet splash,按e編輯選定的啟動菜單項,在引數最後新增rw init=/bin/bash,即改為如下命令列:

grub edit>kernel/boot/vmlinuz-2.6.12-8-386 root=/dev/hda2 ro quiet splash rw init=/bin/bash

按b啟動即可。

3、忘記了root使用者/主使用者密碼

按照第一項:在不登入情況下,獲得root許可權後,在命令列輸入:

passwd root

按照提示,輸入兩次密碼就可以設定root使用者密碼了,

要更改主使用者密碼:

passwd system_main_username

按照提示,輸入兩次密碼就可以了。

4、忘記了GRUB選單密碼

在命令列輸入

grub

等提示符變為grub>後,輸入:

md5crypt

這是計算密碼的md5值,也就是加密值,然後在提示Password:後,輸入新密碼:

Password:******(ubuntu)

系統會計算出加密值:

Encrypted:$1$ZWnke0$1fzDBVjUcT1Mpdd4u/T961

按quit退出,

quit

然後備份並編輯檔案:

sudo cp/boot/grub/_backup

sudo gedit/boot/grub/

找到

...

password --md5 $1$gLhU0/$aW78kHK1QfV3P2b2znUoe/

...

替換為

password --md5 $1$ZWnke0$1fzDBVjUcT1Mpdd4u/T961(這是我們上面計算出的加密值)

儲存檔案即可。

5、在安裝Windows後恢復GRUB啟動選單

經常出現的情況是,我們想重灌一下windows系統,但是重灌會把啟動Linux的選單沖掉,這是個讓人頭疼的問題,我們這樣來解決它:

首先按照第一項,用Ubuntu安裝盤獲得root許可權,我們假定/dev/hda為/boot所在分割槽,然後在提示符輸入:

#grub-install/dev/hda

這樣grub-install程式會為我們安裝grub選單。

6、在Windows中讀取Linux分割槽(ext2,ext3)

我們用軟體Ext2fs可以在Windows中讀取Linux分割槽,軟體官方首頁:,下載地址是:_1_程式

7、開機時,某些服務啟動太慢

比如Configuring network interfaces...和Synchronizing clock to ...可能要長時間才能啟動,對於這些服務,我們可以用Ctrl+C在啟動時暫時跳過一些服務的啟動

也可以執行服務設定:系統->系統管理->服務,清除勾選“時鐘同步服務(ntpdate)”等服務,然後 確定。

8、把系統時間從UTC(GMT)改回來

如果你裝linux系統時,設定啟用UTC(GMT),那麼每當重啟到了我的windws分割槽,系統時間總是和本地時間有N小時的誤差。在Ubuntu下我這樣解決這個問題呢。

編輯檔案/etc/default/rcS,在命令列輸入:

sudo cp/etc/default/rcS/etc/default/rcS_backup

sudo gedit/etc/default/rcS

找到

...

UTC=yes

...

替換為

UTC=no

儲存檔案,在系統->系統管理->日期和時間中,設定為正確的日期和時間,

在命令列輸入下面的命令重啟時間:

sudo/etc/init.d/ restart

9、給Flash配置聲音

如果你播放Flash是沒有聲音,在命令列輸入這個命令:

sudo ln -fs/usr/lib/.0/usr/lib/.1

10、強制清空回收站

如果你點了清空回收站,但還是有垃圾的話,你可以執行這個命令:

sudo rm -fr $HOME/h/

Ubuntu Linux的回收站就是一個隱藏資料夾,在主目錄的h/下,rm-fr命令的意思是強制、遞迴的刪除。

11、清除GNOME選單中的重複項

如果選單中出現重複項,不能像windows裡一樣,直接刪去,我們要啟動Applications Menu Editor:應用程式->系統工具->Applications Menu Editor,逐個刪除重複項即可

熱門標籤