引言:在Linux運行過程中,有時會因為誤操導(dǎo)致系統(tǒng)無法啟動。Linux自帶的救援模式,就可以解決此類故障。救援模式其實是微型的操作系統(tǒng),可以對系統(tǒng)進行各種修復(fù),還可以對Linux進行只讀數(shù)據(jù)的冷備份操作。救援模式只是在內(nèi)存中運行,不會對真實系統(tǒng)的數(shù)據(jù)造成影響。本文就以常見的故障為例,介紹救援模式的使用方法。
當(dāng)Linux的引導(dǎo)程序出現(xiàn)問題后,就會導(dǎo)致系統(tǒng)無法正常啟動。為此,可以以Linux光盤來引導(dǎo),在歡迎界面中(如圖1)選 擇“Resure installed system”項,進入救援模式。當(dāng)硬件初始化完成后,在向?qū)Ы缑嬷羞x擇語言版本,鍵盤布局,救援模式的介質(zhì)(這里 為“Local CD/DVD”)等參數(shù),之后救援模式會詢問是否啟用網(wǎng)絡(luò)模式,這里選擇“No”。在救援模式介紹畫面中點擊“Continue”按鈕,系統(tǒng)開始查找本地存儲設(shè)備,之后會提示系統(tǒng)已經(jīng)被掛載到“/mnt/sysimage”目錄上。點擊回車,選 擇“Shell Start shell”項,在Shell中執(zhí) 行“chroot /mnt/sysimage/”命令,完成后會重新打開一個 Shell,在其中執(zhí)行“df-h”命令,可以查看真實的系統(tǒng)分區(qū)情況。執(zhí)行“grubinstall /dev/sda”命 令,執(zhí)行引導(dǎo)程序的修復(fù)操作。當(dāng)出現(xiàn)“Installation finished. No error reported”內(nèi)容時,說明修復(fù)操作已經(jīng)成功。連續(xù)執(zhí)行兩次“exit”命令,返回向?qū)Ы缑妫x擇“Reboot”項重啟系統(tǒng),之后系統(tǒng)就可以順利啟動了。
如果MBR主引導(dǎo)記錄受損的話,系統(tǒng)是無法啟動的。因為在系統(tǒng)啟動時,會從讀取引導(dǎo)設(shè)備的第一個扇區(qū),其中保存在主引導(dǎo)記錄,分區(qū)表等信息。為此,在系統(tǒng)處于正常狀態(tài)時,可以執(zhí)行“dd if=/dev/zero of =/dev/sda bs=446 count=1”命令,將MBR信息備份為獨立的文件,進入“/tmp”目錄,可以看到備份的“MBR”文件,可以將該文件復(fù)制到網(wǎng)絡(luò)中的其他主機(假設(shè)IP為“172.16.1.101”)的根目錄下保存,便于之后出現(xiàn)問題后進行修復(fù)。當(dāng)本機出現(xiàn)MBR損壞故障后,可以按照上述方法進入救援模式。

圖1 進入救援模式

圖2 設(shè)置網(wǎng)絡(luò)參數(shù)

圖3選擇所需的救援模式
所不同的是,在“Setup Networking” 窗口中 點擊“Yes”按 鈕,選 擇 所需的網(wǎng)卡,在“Enable network interface”窗 口(如 圖 2)中 選 擇“Enable IPv4 Support” 和“Manual Configuration”項,為 該網(wǎng)卡設(shè)置IP地址(例如“172.16.1.100/24”),其 余設(shè)置保持默認(rèn),點擊OK按鈕保存配置。當(dāng)網(wǎng)絡(luò)設(shè)置完成后,點擊“Continue”按鈕,按照上述方法打開Shell界面,執(zhí)行“ifconfig”命令,可以看到該Shell環(huán)境的網(wǎng)絡(luò)配置情況。執(zhí)行“scp 172.16.0.101:/root/MBR .”命令,輸入其root賬戶密碼,將保存在目標(biāo)主機上的“MBR”復(fù)制過來。執(zhí)行“dd if=MBR of =/dev/sda”命令,恢復(fù)目標(biāo)磁盤上的MBR信息。之后按照上述方法重啟,就可以正常使用系統(tǒng)了。當(dāng)然,如果事先沒有備份MBR的話,可以使用第三方的工具(例如“Diskgenius”等),來搜索并修復(fù)磁盤。
在“/etc/fstab”文 件中存放了和文件系統(tǒng)相關(guān)的信息,在啟動時Linux會讀取該文件,來自動掛載所有的分區(qū),如果該文件丟失或者配置出錯的話,就會導(dǎo)致系統(tǒng)無法啟動。按照上述方法進入救援模式,在“Rescue”窗口(如圖3)中點擊“Continue”按鈕,按照上述方法打開Shell界面,系統(tǒng)自動將所有分區(qū)掛載到“/mnt/sysimage”目錄下。執(zhí)行“fdisk -l”命令,查看系統(tǒng)分區(qū)情況。因為對應(yīng)的分區(qū)其實并沒有損壞,所以可以查看到系統(tǒng)分區(qū)的完整信息。因為每個分區(qū)對應(yīng)的名稱標(biāo)識不會顯示,所以可以使用“e2label”命令,對其逐一查看。例如執(zhí)行“e2label/dev/sda1”,“e2label /dev/sda2”,“e2label /dev/sda3”等命令,來查看對應(yīng)的分區(qū)名稱標(biāo)識信息。
這樣,就可以得到所有分區(qū)的掛載點信息。“fstab”文件存放在系統(tǒng)根目錄下,所以需要掛載原來系統(tǒng)的根分區(qū)。假設(shè)跟分區(qū)對一個的設(shè)備名為“/dev/sda2”,執(zhí)行“mkdir tmp”,“mount /dev/sda2 /tmp”,“df”等命令,可以將跟分區(qū)所有文件掛載到“/tmp”目錄下。之后執(zhí)行“vi /tmp/etc/fstab”命令,對“fstab”文件進行編輯,依次輸入“Label=/ / ext3 default 1 1”,“Label=/boot /boot ext3 default 1 2”,“Label=/home /home ext3 default 1 2”等內(nèi)容,來重新構(gòu)建該文件。可以找一臺同樣配置的Linux主機,來查看正常的“fstab”文件內(nèi)容,并據(jù)此執(zhí)行上述編輯操作。之后退出Shell環(huán)境,重啟系統(tǒng)即可。
我們知道,Linux的啟動配置信息保存在“/Boot/Grub/Grub.conf”文件中,其中包含啟動菜單,啟動分區(qū),內(nèi)核文件位置等參數(shù)。如果該文件丟失或者誤刪除的話,系統(tǒng)自然無法啟動。按照上述方法進入救援模式,選擇“shell Start shell”項,在Shell中執(zhí)行“chroot/mnt/sysimage”和“df”命令,可以查看分區(qū)信息。執(zhí)行“grub-install /dev/sda”命令,對Grub進行修復(fù)操作。之后進入“/boot/grub”目錄,看到雖然修復(fù)了Grub,但是其配置文件并不存在。
執(zhí) 行“vimgrub.conf”命令,在編輯界面中依次輸入“default=0”,“timeout=5”,“title Red Hat Linux”,“root(hd0,0)”,“kernel/vmlinuz-2.6.32-220.e16.x86_64 ro root=/dev/sda2”,“initrd /initramfs-2.6.32.e16.x86_64.img”等行,之后保存該文件。這樣,就通過手工的方式重建了“Grub.conf”文件,其中的系統(tǒng)核心文件以及驅(qū)動壓縮包名稱較長,可以進入“/boot”目錄,來查看其具體的名稱。之后推出Shell并重啟,在“GNU GRUB”啟動界面中選擇上述“RedHat Linux”項,可以順利啟動系統(tǒng)。
對于Root用戶來說,一旦忘記密碼,就無法正常登錄系統(tǒng)。利用救援模式,可以輕松重設(shè)密碼。按照上述方式進入救援環(huán)境,按照上述方法,將系統(tǒng)掛載到“/mnt/sysimage”目錄下。在Shell環(huán)境中執(zhí)行“password root”命令,根據(jù)提示依次輸入新的密碼,當(dāng)出現(xiàn)“all authentication tokens updated successfully”字樣時,說明密碼修改成功。之后按照上述方法重啟系統(tǒng),就可以以新的密碼登錄系統(tǒng)了。
內(nèi)核文件是Linux的核心數(shù)據(jù),進 入“/boot”目錄,可以查看內(nèi)核文件“vmlinuz-2.6.32-220.e16.x86_64”等重要文件。如果內(nèi)核文件丟失或者受損,系統(tǒng)是無法正常啟動的。按照上述方法進入救援模式,選擇“shell Start shell”項,在Shell中查看“/boot”分區(qū),如果其中沒有Grub文件的話,需要按照上面談到的方法,先對Grub進行修復(fù)。對于內(nèi)核文件的修復(fù),可以利用“rpm”命令來實現(xiàn)。例如,執(zhí)行“rpm –qa vmlinuz-2.6.32-220.e16.x86_64”命令,查看到其來自于“kernel-2.6.32-220.e16.x86_64”包。當(dāng)然,不同版本的Linux的內(nèi)核文件名稱可能不同。執(zhí)行“rpm–qf initramfs-2.6.32.e16.x86_64.img”命令,查看到其也來自于上述安裝包。當(dāng)然,在“/boot”分區(qū)還有別的重要文件,可以從其他正常運行的Linux主機上查看其具體名稱。例如,執(zhí) 行“rpm –qf System.map-2.6.32-220.e16.x86_64”命令,查看到其來自于上述安裝包。因此,只要將內(nèi)核文件重裝一遍,就可以解決上述問題。
執(zhí) 行“mount /dev/cdrom /media/”命令,將光驅(qū)掛載到指定的位置。進入“/media/Packages” 目錄,將“kernel-2.6.32-220.e16.x86_64.rpm” 包復(fù)制過來。之后執(zhí)行“rpm –ivh kernel-2.6.32-220.e16.x86_64 --force”命令,強制安裝該包,耐心等候一段時間后,內(nèi)核即可修復(fù)完成。之后按照上述方法重啟系統(tǒng),如果出現(xiàn)“grub>”提示符,可以依次執(zhí)行“root(hd0,0)”,“ kernel/vmlinuz-2.6.32-220.e16.x86_64 ro root=/dev/sda2”, initrd /initramfs-2.6.32.e16.x86_64.img”,“boot” 等 命令,就可以順利啟動系統(tǒng)了。
當(dāng)然,如果系統(tǒng)內(nèi)核文件存放在網(wǎng)絡(luò)中的某臺FTP服務(wù)器上,也可以在救援模式中配置好IP等網(wǎng)絡(luò)參數(shù),之后在Shell環(huán)境中執(zhí)行“ftp server1”命令,假設(shè)FTTP服務(wù)器的名稱為“server1”,之后按照提示輸入FTP的用戶名和密碼,當(dāng)出現(xiàn)“ftp>”提示符后,利用“cd /pub/packages/”命令,切換到存儲內(nèi)核文件的目錄中,假設(shè)其保存在“/pub/packages/”目錄中。之后使用“mget kernel-2.*.e16.x86_64.rpm”之類的命令,將Linux的內(nèi)置文件保存到本地。最后,執(zhí)行“quit”命令,退出FTP操作環(huán)境。利用上述命令,對下載的RPM包進行解壓安裝即可,執(zhí)行“l(fā)s /boot”命令,可以查看內(nèi)核文件信息。
對 于Linux來 說,在“/etc”目錄及其下的“init”,“rc”等子目錄 下還 存 在“inittab”, “rc.sysinit”,“start-ttys.conf”,“prefdm.conf”,“rc.local”等配置文件,在其中保存了系統(tǒng)和用戶配置的相關(guān)信息。但這些配置文件丟失或受損后,對系統(tǒng)的正常啟動也會造成很大的影響。按照上述方法進入救援模式,在Shell中執(zhí)行“rpm-qa /etc/inittab”,“ rpm-qa /etc/rc.sysinit”,“ rpm -qa /etc/init/start-ttys.conf”等命令,可以看到其都來自于名為“initscripts-9.03.27-1.e16.x86_64.rpm”的 包,按照上述方法掛載光驅(qū),將在光盤中的“Packages”目錄中找到該包,將其復(fù)制出來。執(zhí)行“”rpm –ivh –force initscripts-9.03.27-1.e16.x86_64.rpm命令,執(zhí)行強制安裝操作,這樣,就將這些配置文件恢復(fù)過來。