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