天天看點

Linux系統啟動故障修複

Linux在啟動過程中會出現一些故障,導緻系統無法正常啟動,本文列舉了幾個應用單使用者模式、GRUB指令操作、Linux救援模式的典型故障修複案例。

一、單使用者模式

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

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

案例一:硬碟扇區錯亂

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

此種問題發生,在系統啟動的時候,螢幕會顯示:

Press root password or ctrl+D:

此時輸入root密碼系統自動進入單使用者模式,輸入“fsck -y /dev/hda6”(fsck為檔案系統檢測修複指令,“-y”設定檢測到錯誤自動修複,/dev/hda6為發生錯誤的硬碟分區,請依據具體情況更改此參數),系統修複完成後,用指令“reboot”重新啟動即可。

案例二:root密碼忘記

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

1.在系統啟動過程中,按任意鍵,進入GRUB菜單選項。

若希望以後無此提示,直接進入GRUB菜單選項,删除配置檔案grub.conf中“hiddenmenu”項即可。

2.按“e”鍵編輯GRUB引導菜單選項,顯示為按“e”鍵後的GRUB螢幕。

通過箭頭鍵下移到kernel行,并按“e”鍵,:

在尾行光标處添加single,按Enter鍵傳回前一個螢幕,按“b”鍵進行引導,則系統自動進入單使用者模式,如果要改變root密碼,則執行指令:

<code>1</code>

<code>sh-3.1# passwd root</code>

更改成功後,執行指令exit退出重新開機即可。

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

1.禁用可能中止系統運作的服務

如禁用Samba服務,則執行:

<code>sh-3.1# chkconfig smb off</code>

下次系統引導就不會啟動Samba服務了。

2.更改系統預設運作級

如果X Window無法啟動或者出現故障,可以編輯/etc/inittab檔案,采用文本方式登入,更改initdefault引導級别為3:

<code>id:3:initdefault:</code>

案例三、GRUB選項設定錯誤

下圖是一個系統管理者不希望看到的控制台資訊,“Error 15”顯示系統無法找到grub.conf中指定的核心。

我們觀察發現因為打字錯誤,核心檔案的“vmlinuz”打成了“vmlinux”,是以系統無法找到核心的可執行檔案。我們可以按任意鍵回到GRUB編輯界面,修改此錯誤,回車儲存後按“b”鍵即可正常引導,當然不要忘記進入系統後修改grub.conf檔案中此處錯誤。

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

一)grub的一般情況

    1、如果沒有找到核心(vmlinuz-x.x.x檔案),

      出現Error 15:File not found

        Press any key to continue....

      說明root(hdx,x)錯誤,或核心檔案名不對,或者核心的路徑不對。這時在開機的時候,等GRUB畫面出來,按c鍵進入指令行模式;如果您用的是WINGRUB,也有這樣的模式,也按c鍵,道理是一樣的;在Linux和Windows中的GRUB,都有指令行的功能,這個功能極為有用,它不僅僅能引導系統,有時也能進行修複系統之用;再者就是Linux引導安裝;

舉例:比如 我們把vmlinz和initrd.img放在/dev/hda1中的/boot目錄中;那GRUB的指令行應該怎麼寫呢?

<a href="http://blog.51cto.com/attachment/201204/154124351.jpg" target="_blank"></a>

如果您不知道要引導的核心的名稱,隻需使用斜線(/)然後按下 tab 鍵即可。grub 會顯示核心和 initrd 映像清單。 

如我們把vmlinz和initrd.img放在/dev/hda2中的fc5目錄中;那GRUB的指令行應該怎麼寫呢?

grub&gt;kernel (hd0,1)/fc5/vmlinuz  

grub&gt;initrd (hd0,1)/fc5/initrd.img  

grub&gt;boot  

如果直接放在/dev/hda3分區下,不放在任何目錄中怎麼應該寫呢?

grub&gt;kernel (hd0,2)/vmlinuz  

grub&gt;initrd (hd0,2)/initrd.img  

       2、如果找到核心後,運作一會,

      出現kernel Panic:Not init Found,

      一般來說是沒有找到根分區(/分區)即root=/dev/xxx不對

    3、如果找到核心後,運作一會,

      出現Kernel panic: VFS: Unable to mount root fs on ...,

      一般來說可能忘了加上initrd /initrd-2.4.21-4.EL.img(大多情況發生在使用scsi硬碟)

    4、總的來說grub.conf裡面必須存在的就幾行。

    #more grub.conf

    title linux

    root (hd0,1) #/boot分區所在位置

    kernel /vmlinuz-2.4.21-4.EL ro root=/dev/TEST/root 

     #核心和根分區(/分區)位置

    (根分區可能是LVM和raid,而不僅是hdx和sdx)

    initrd /initrd-2.4.21-4.EL.img

    平時練習grub.conf菜單檔案的最好辦法是把這個檔案删掉,每次重新開機時自己使用grub的

    互動指令行就快就會對檔案裡面的内容熟悉。

二、GRUB引導故障排除

有時Linux啟動後會直接進入GRUB指令行界面(隻有“grub&gt;”提示符),此時很多使用者就選擇了重新安裝GRUB甚至重新安裝系統。其實一般而言此故障的原因最常見的有兩個:一是GRUB配置檔案中選項設定錯誤;二是GRUB配置檔案丢失(還有少數原因,如核心檔案或鏡像檔案損壞、丢失,/boot目錄誤删除等),如果是第一種情況,可以首先通過GRUB指令引導系統後修複;若是第二種情況,則要使用Linux救援模式修複了(本文後續有描述)。

首先,我們需要了解GRUB啟動系統的引導過程,grub.conf檔案中主要的配置選項如下(注意,GRUB配置檔案為/boot/grub/grub.conf, /etc/grub.conf隻是此檔案的軟連結):

<code>title Fedora Core (2.6.18-1.2798.fc6)</code>

<code>2</code>

<code>    </code><code>root (hd0,0)</code>

<code>3</code>

<code>    </code><code>kernel /boot/vmlinuz-2.6.18-1.2798.fc6 ro root=LABEL=/ rhgb quiet</code>

<code>4</code>

<code>    </code><code>initrd /boot/initrd-2.6.18-1.2798.fc6.img</code>

其中“title”段指定了GRUB引導的系統;“root”段指定了/boot分區所在的位置;“kernel”段指定了核心檔案所在位置,核心加載時權限屬性為隻讀(“ro”)以及指定根分區所在位置(root=LABEL=/);initrd指定了鏡像檔案所在位置。是以GRUB在引導時順序為首先加載/boot分區,然後依次載入核心與鏡像檔案。

案例:“title Fedora Core (2.6.18-1.2798.fc6)”段被誤删除

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

1、查找/boot/grub/grub.conf檔案所在分區

<code>GRUB&gt; find /boot/grub/grub.conf</code>

<code>           </code><code>(hd0,0)</code>

2、檢視grub.conf檔案錯誤

<code>GRUB&gt;cat (hd0,0)/boot/grub/grub.conf</code>

建議系統安裝設定好後,要将grub.conf檔案備份,如果有備份檔案如grub.conf.bak,則此時可以檢視備份檔案,與目前檔案比較,發現錯誤:

<code>GRUB&gt;cat (hd0,0)/boot/grub/grub.conf.bak</code>

3、确認錯誤後,先通過指令行方式完成GRUB引導,進入系統後再行修複grub.conf檔案錯誤:

1)指定/boot分區

<code>root (hd0,0)</code>

2)指定核心加載

<code>kernel /boot/vmlinuz-2.6.18-1.2798.fc6 ro root=LABEL=/ rhgb quiet</code>

3)指定鏡像檔案所在位置

<code>initrd /boot/initrd-2.6.18-1.2798.fc6.img</code>

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

4、從/boot分區啟動

<code>boot (hd0,0)</code>

指令行模式可以在GRUB菜單模式中通過按“c”鍵調用,也可以用于測試新編譯的核心(設定kernel、initrd引導新核心及鏡像檔案)。增加對GRUB引導以及Linux系統引導知識的了解将對此類故障排除大有幫助。

三、Linux救援模式應用

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

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

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

3、接下來系統将試圖查找根分區:

預設在救援模式,硬碟的根分區将挂載到CD光牒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指令如下: 

<code>sh-3.1# </code><code>chroot</code> <code>/mnt/sysimage</code>

2、将根目錄切換到硬碟系統的根目錄中,然後執行grub-install指令重新安裝GRUB:

<code>sh-3.1# grub-install /dev/hda</code>

“/dev/hda”為硬碟名稱,如使用SCSI硬碟或Linux安裝在第二塊IDE硬碟,此項設定要做相應調整。

3、然後依次執行exit指令,退出chroot模式及救援模式(執行兩次exit指令):

<code>sh-3.1# </code><code>exit</code>

系統重新開機後,将恢複GRUB引導的雙系統啟動。

案例二:系統配置檔案丢失修複

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

1、有備份檔案的恢複辦法

進入救援模式,執行chroot指令後,如果有此檔案的備份(強烈建議系統中的重要資料目錄,如/etc、/boot等要進行備份),直接将備份檔案拷貝回去,退出重新開機即可。如果是配置檔案修改錯誤,如比較典型的/boot/grub/grub.conf及/etc/passwd的檔案修改錯誤,也可以直接修正恢複。假設有備份檔案/etc/inittab.bak,則在救援模式下執行:

<code>sh-3.1# cp /etc/inittab.bak /etc/inittab</code>

2、沒有備份檔案的恢複辦法

如果一些配置檔案丢失或軟體誤删除,且無備份,可以通過重新安裝軟體包來恢複,首先查找到/etc/inittab屬于哪一個RPM包(即便檔案丢失,因為存在RPM資料庫,一樣可以查找到結果):

<code>sh-3.1# rpm -qf /etc/inittab</code>

<code>initscripts-8.45.3-1</code>

退出chroot模式:

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

<code>sh-3.1# mount /dev/hdc /mnt/source</code>

Fedora系統的RPM包存放在CD光牒Fedora/RPMS目錄下,其他Linux存放位置大同小異,這裡不一一列舉;另外,因為要修複的硬碟系統的根目錄在/mnt/sysimage下,需要使用--root選項指定其位置。覆寫安裝/etc/inittab檔案所在的RPM包:

<code>sh-3.1# rpm -ivh --replacepkgs --root /mnt/sysimage /mnt/source/Fedora/RPMS/ initscripts-8.45.3-1.i386.rpm</code>

其中的rpm指令選項“--replacepkgs”表示覆寫安裝,執行完成後,即已經恢複了此檔案。

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

<code>sh-3.1# rpm2cpio /mnt/source/Fedora/RPMS/initscripts-8.45.3-1.i386.rpm | cpio -idv ./etc/inittab</code>

<code>sh-3.1# cp etc/inittab /mnt/sysimage/etc</code>

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

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

在尾行光标處添加single,按Enter鍵傳回前一個螢幕,按“b”鍵進行引導,則系統自動進入單使用者模式,如果要改變root密碼,則執行指令:

本文轉自 deng304749970 51CTO部落格,原文連結:http://blog.51cto.com/damondeng/754430,如需轉載請自行聯系原作者

繼續閱讀