馮冬艷
(山西職業(yè)技術(shù)學(xué)院,山西 太原 030006)
Linux操作系統(tǒng)誕生于1991年10月,是一套免費(fèi)使用和自由傳播的類Unix操作系統(tǒng)。其具有免費(fèi)、開(kāi)源、安全、穩(wěn)定、高效等優(yōu)點(diǎn),因此在商用領(lǐng)域使用非常普遍。目前Linux操作系統(tǒng)的內(nèi)核由林納斯·托瓦茲及其團(tuán)隊(duì)維護(hù),眾多的應(yīng)用程序則由GNU組織來(lái)維護(hù)。為了方便用戶使用,很多第三方的個(gè)人、組織或商業(yè)機(jī)構(gòu)對(duì)Linux內(nèi)核、應(yīng)用程序等編譯后制作成Linux不同的發(fā)行版。當(dāng)前社會(huì)上存在著眾多的Linux發(fā)行版,主流的有RedHat、CentOS、Suse、Debian、Ubuntu、Arch Linux等,本文將以CentOS 6為例。大多數(shù)發(fā)行版的Linux系統(tǒng)在啟動(dòng)時(shí)都需要用到GRUB,GRUB是一個(gè)在Linux操作系統(tǒng)上使用比較廣泛的系統(tǒng)引導(dǎo)程序。其主要有支持大硬盤、支持開(kāi)機(jī)畫面、支持傳遞參數(shù)、提供交互式接口、提供菜單保護(hù)機(jī)制等特點(diǎn)。本文重點(diǎn)分析了Linux操作系統(tǒng)的啟動(dòng)流程,并對(duì)GRUB可能出現(xiàn)故障的情況進(jìn)行了分析、總結(jié)、歸納,并對(duì)每一種故障情況進(jìn)行了還原,最后進(jìn)行了修復(fù)。
1) 加電自檢(POST,Power On Self Test)。計(jì)算機(jī)在按下開(kāi)機(jī)鍵后,首先進(jìn)行的是加電自檢,它是BIOS的一個(gè)基本功能,主要完成對(duì)CPU、主板、內(nèi)存、串并口、顯示器、磁盤、鍵盤等硬件設(shè)備的檢測(cè)。一般此過(guò)程檢測(cè)到的故障都是致命的,會(huì)導(dǎo)致系統(tǒng)啟動(dòng)掛起,因此會(huì)通過(guò)不同的蜂鳴聲對(duì)用戶發(fā)出警報(bào)。此過(guò)程檢測(cè)無(wú)故障則進(jìn)入下一步。
2) 加載引導(dǎo)程序。加電自檢成功完成后,BIOS將根據(jù)用戶所指定的引導(dǎo)次序(Boot Sequence),按照順序依次在相應(yīng)的存儲(chǔ)介質(zhì)上尋找主引導(dǎo)記錄(MBR,Master Boot Record)。在找到的第一個(gè)具有可用主引導(dǎo)記錄的存儲(chǔ)介質(zhì)上讀取出引導(dǎo)加載器(Boot Loader)、磁盤分區(qū)表(DPT,Disk Partition Table)、分區(qū)有效性標(biāo)志(55AA),共512個(gè)字節(jié)。此過(guò)程順利完成后,Linux內(nèi)核被加載至內(nèi)存。
3) 系統(tǒng)的初始化。Linux內(nèi)核文件都是以壓縮格式存放的,在上一步驟成功完成后,Linux內(nèi)核被加載至內(nèi)存中,內(nèi)核文件首先完成自解壓,并在ramdisk文件的幫助下,內(nèi)核擁有了訪問(wèn)磁盤及文件系統(tǒng)等基本設(shè)備的驅(qū)動(dòng)程序。隨后內(nèi)核在完成探測(cè)可識(shí)別的硬件設(shè)備并加載相應(yīng)驅(qū)動(dòng),以只讀方式加載根文件系統(tǒng)等操作后,內(nèi)核就可以啟動(dòng)位于磁盤上的第一個(gè)應(yīng)用程序init,進(jìn)而完成系統(tǒng)的初始化。
在Linux啟動(dòng)流程的第二步中需要進(jìn)行加載引導(dǎo)程序,MBR的前446個(gè)字節(jié)是用于存放Boot Loader的。Linux上常見(jiàn)的引導(dǎo)加載器有LILO、Syslinux、GRUB等。
1) LILO(LInux LOader)。LILO是一個(gè)輕量、穩(wěn)定的Linux引導(dǎo)加載器,由于其比較古老、不提供交互式命令行界面、不支持將系統(tǒng)安裝在1024柱面以后的存儲(chǔ)空間等原因,2015年12月開(kāi)始LILO的開(kāi)發(fā)已經(jīng)停止。但目前Android系統(tǒng)廣泛使用,LILO由于其小巧、穩(wěn)定,依然具有此類設(shè)備上較高的使用率。
2) Syslinux。Syslinux是一種能從光盤驅(qū)動(dòng)器、網(wǎng)絡(luò)等進(jìn)行引導(dǎo)的輕型引導(dǎo)加載器。Syslinux 支持諸如微軟的 FAT, Linux 上的 ext2、ext3、ext4 等文件系統(tǒng)。Syslinux 也支持未壓縮的單一設(shè)備上的 Btrfs。但由于 Syslinux 僅能訪問(wèn)自己分區(qū)上的文件,因此不具備多重文件系統(tǒng)引導(dǎo)能力。
3) GRUB(GRand Unified Bootloader)。GRUB是眾多Linux發(fā)行版普遍使用的多操作系統(tǒng)引導(dǎo)加載器,并且可以向內(nèi)核傳遞啟動(dòng)參數(shù),從而實(shí)現(xiàn)不同的啟動(dòng)效果。GRUB可以分為GRUB Legacy和GRUB 2,本文以GRUB Legacy為例。GRUB Legacy與LILO最大的區(qū)別就是其突破了Boot Loader只有446字節(jié)的限制,其可以將Boot Loader存放于文件系統(tǒng)的某一路徑下。具體過(guò)程如下:GRUB Legacy將引導(dǎo)過(guò)程分為了兩個(gè)階段。第一個(gè)階段為stage1,位于MBR中,其主要功能就是找到位于磁盤上的stage2。第二個(gè)階段為stage2,其位于文件系統(tǒng)/boot/grub下。但在stage1結(jié)束后,此時(shí)的內(nèi)核無(wú)法識(shí)別文件系統(tǒng),嚴(yán)格的來(lái)說(shuō),應(yīng)該還包含其中一個(gè)過(guò)度階段,稱之為stage1_5。在此階段,內(nèi)核將裝載對(duì)應(yīng)文件系統(tǒng)的驅(qū)動(dòng)程序,使得在stage2,內(nèi)核可以找到位于文件系統(tǒng)上/boot/grub/stage2文件,進(jìn)而完成引導(dǎo)加載過(guò)程。
1) 故障描述。MBR的前446個(gè)字節(jié)以內(nèi)的數(shù)據(jù)被損壞,未重啟時(shí)不會(huì)有明顯的故障現(xiàn)象,但萬(wàn)一重啟計(jì)算機(jī)將無(wú)法啟動(dòng)系統(tǒng)。
2) 故障分析。MBR位于整個(gè)磁盤的0磁道0柱面1扇區(qū)。MBR由446個(gè)字節(jié)的Boot Loader, 64個(gè)字節(jié)為磁盤分區(qū)表,2個(gè)字節(jié)的分區(qū)有效性標(biāo)志組成,共512個(gè)字節(jié)。由于分區(qū)表被損壞需要用其他工具查找恢復(fù),本文暫不討論磁盤分區(qū)表被損壞的情況。此類故障本質(zhì)上來(lái)說(shuō)是GRUB的stage1損壞。雖然GRUB已經(jīng)被損壞,但是由于操作系統(tǒng)未重啟,暫時(shí)用不到GRUB,因此此時(shí)修復(fù)GRUB只需要重新安裝MBR內(nèi)的Boot Loader即GRUB的stage1即可。
3) 故障還原。使用dd if=/dev/zero of=/dev/sda1 bs=446 count=1命令模擬MBR的前446個(gè)以內(nèi)字節(jié)被損壞。
4) 故障修復(fù)。此時(shí)的修復(fù)只需重新安裝GRUB即可,有兩種常用的修復(fù)方法,其中第一種方法為:使用grub-install --root-directory=/ /dev/sda命令重新安裝GRUB的stage1。需要注意的是此處—root-directory應(yīng)指向boot目錄的父目錄,而/dev/sda為MBR所存放的設(shè)備。第二種方法為:鍵入grub命令,出現(xiàn)grub命令提示符;使用root (hd0,0)命令指定根所在位置;使用setup (hd0)命令安裝MBR。需要注意的是(hd0,0)為固定格式指明根所在位置為第一塊磁盤的第一個(gè)分區(qū),讀者需要注意,這個(gè)設(shè)置可能會(huì)因人而異。setup (hd0)指明要在那一塊磁盤上安裝MBR。最后使用reboot命令重啟系統(tǒng),故障修復(fù)。
1) 故障描述。接上題故障,MBR前446個(gè)字節(jié)以內(nèi)的數(shù)據(jù)被損壞,但已重啟,此時(shí)將無(wú)法進(jìn)行任何引導(dǎo),系統(tǒng)啟動(dòng)將掛起。
2) 故障分析。MBR中的前446個(gè)字節(jié)被損壞,即Boot Loader被損壞,其本質(zhì)就是GRUB中的stage1被損壞,因此無(wú)法引導(dǎo)加載系統(tǒng)。此時(shí)需要使用系統(tǒng)的安裝光盤,在開(kāi)始界面中選擇緊急救援模式,再進(jìn)行一系列處理,恢復(fù)被損壞的MBR中的Boot Loader即可。
3) 故障還原。先使用dd if=/dev/zero of=/dev/sda1 bs=446 count=1命令模擬MBR的前446個(gè)以內(nèi)字節(jié)被損壞。然后使用reboot命令重啟系統(tǒng)。
4) 故障修復(fù)。此時(shí)裝入系統(tǒng)安裝光盤;重啟;在彈出的界面中選擇緊急救援模式(Rescue installed system);在語(yǔ)言選擇菜單中選擇英文(English);在鍵盤類型菜單中選擇美國(guó)(US);在啟動(dòng)網(wǎng)絡(luò)菜單上選擇不啟動(dòng)(No);在救援菜單上選擇繼續(xù)(Continue);在shell菜單上選擇啟動(dòng)shell(Start shell);使用chroot /mnt/sysimage/命令切換根至系統(tǒng)提示的根文件系統(tǒng)掛載位置;使用grub-install --root-directory=/ /dev/sda命令重新安裝GRUB的stage1;使用exit命令退出當(dāng)前所在的根;最后使用reboot命令重啟系統(tǒng),故障修復(fù)。
1) 故障描述。GRUB的配置文件的格式損壞、內(nèi)容缺失或文件丟失,系統(tǒng)啟動(dòng)時(shí),將只會(huì)顯示“grub>”的提示符, 無(wú)法完成進(jìn)一步的系統(tǒng)啟動(dòng)過(guò)程。
2) 故障分析。GRUB的配置文件位于/boot/grub/grub.conf,而/etc/grub.conf是此文件的軟鏈接。此文件中的內(nèi)容有著固定的格式,常用的配置項(xiàng)有default、timeout、hiddenmenu、splashimage、title、password等,其中title可以多個(gè),在每個(gè)title項(xiàng)下有二級(jí)項(xiàng)root、kernel、initrd、password等。其中default指明默認(rèn)啟動(dòng)哪個(gè)title所代表的系統(tǒng)或內(nèi)核;timeout指明用戶選擇的超時(shí)時(shí)間;title為某一個(gè)系統(tǒng)或內(nèi)核用于顯示和選擇的標(biāo)識(shí);root指明此內(nèi)核所在的磁盤及分區(qū)位置;kernel指明此系統(tǒng)或內(nèi)核的內(nèi)核文件位置,可以傳遞參數(shù);initrd指明此系統(tǒng)或內(nèi)核啟動(dòng)時(shí)所需要使用的ramdisk文件。
3) 故障還原。使用rm-rf /boot/grub/grub.conf命令將grub的配置文件刪除;使用reboot命令重啟電腦。
4) 故障修復(fù)。電腦啟動(dòng)后出現(xiàn)grub命令提示符,在grub提示符下輸入root (hd0,0)后回車;在grub提示符下輸入kernel /vmlinuz-2.6.32-696.el6.x86_64后回車;在grub提示符下輸入initrd /initramfs-2.6.32-696.el6.x86_64.img后回車;在grub提示符下輸入reboot命令,重啟系統(tǒng),故障修復(fù)。需要注意的是root用于指明根所在位置為第一塊磁盤的第一個(gè)分區(qū),kernel用于指明內(nèi)核文件所在位置,initrd用于指明ramdisk文件所在位置。kernel有時(shí)需要附加一些內(nèi)核參數(shù),本處不予詳述,有興趣的讀者可參考相關(guān)文章。此外,在使用root (hd0,0)后在指定kernel和initrd時(shí)可以靈活地使用路徑補(bǔ)全的Tab鍵。最后使用reboot命令重啟系統(tǒng),故障修復(fù)。
本文詳細(xì)介紹了Linux操作系統(tǒng)的啟動(dòng)流程,并對(duì)GRUB啟動(dòng)過(guò)程中的兩個(gè)階段的作用及GRUB配置文件格式進(jìn)行了介紹。最后總結(jié)歸納了Linux系統(tǒng)啟動(dòng)過(guò)程中與GRUB損壞有關(guān)的各類故障,并進(jìn)行了故障還原和修復(fù)。讀者可以根據(jù)遇到的啟動(dòng)故障特征分析采用對(duì)應(yīng)的故障修復(fù)方法,以實(shí)現(xiàn)快速排除故障,減少因?yàn)楣收隙鸬膿p失。