Linux系統在啓動過程中會出現一些故障,導致系統無法正常啓動,我在這裏寫了幾個應用單用戶模式、GRUB命令操作、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,逐個刪除重複項即可