理解Linux的啟動過程,對於解決Linux系統啟動問題還是非常有幫助的,知道Linux系統在每個階段做了哪些事,將會幫助你更快的找到問題出處,並解決這些問題。
提示:在進行重要文件編輯之前,最好是先對文件進行備份。
首先,我們來看機器啟動的第一步–自檢(Power-On Self Test)
在啟動過程中的第一步,就是自檢,自檢是由電腦的BIOS(基本輸入輸出系統)完成的,是對機器系統組件進行檢查,不同的計算機架構可能有不同的檢查方式,但它們是最終目的都是相同的。在自檢過程中,如果發生錯誤,警報就會產生,機器就會產生一系列有規則的“滴”的聲音,來標識特定的錯誤;如果自檢通過,則BIOS就會讀取硬盤上的主引導記錄,然後載入在內存中找到的引導程序。
主引導記錄(MBR):
主引導記錄(MBR)是通過BIOS讀取啟動驅動器的第一個512字節到內存(這裡假設我們使用x86架構)在這512字節中,前面446字節一般包含一個底層啟動代碼,由它指向硬盤中的引導程序,後面64個字節包含了這個硬盤的分區表(由4個16字節組成),最後剩下的2個字節是Magic Number,它是用來進行錯誤檢測。
引導程序(Boot Loader)
引導程序的目的是用來載入操作系統,在Linux系統中,有許多引導程序可以使用,但在Linux中最主要的引導程序是LILO和GRUB;Windows也有自己的引導程序,叫NTLDR(New Technology Loader),你可能曾經也在windows啟動的時候看到,這樣子的信息”NTLDR is missing”;這就是windows引導程序出錯後顯示的提示信息。
GRUB
在當今Linux發行版本中最為流行的引導程序就是GRUB(GRand Unified Bootloader ),GRUB是一個寫入到主引導記錄和硬盤上的啟動分區(/boot)中,並且用於加載操作系統的程序。GRUB是基於模塊化設計,由不同的工作階段組成。其中GRUB的啟動階段分為 Stage1和Stage1_5和Stage2這三部分組成。
Stage1
stage1代碼被寫入到主引導記錄的512字節中去,但由於MBR大小方面的限制;GRUB stage1 通常指向GRUB的下一階段stage1_5或stage2,GRUB是否需要載入stage1_5這取決於當前文件系統的類型。可以查看GRUB stage1,只要在系統的/boot/grub目錄下運行以下命令:
[root@localhost grub]# file stage1
stage1: x86 boot sector, code offset 0×48
Stage1_5
Stage1_5是位於Stage1和Stage2之間的中間階段
如果你查看過/boot/grub目錄,你應該會看到各種不同文件系統類型名稱的stage1_5文件,這些文件會讓stage1_5階段准確的識別文件系統類型
以下是保存在/boot/grub目錄下的stage1_5文件:
e2fs_stage1_5
fat_stage1_5
ffs_stage1_5
iso9660_stage1_5
jfs_stage1_5
minix_stage1_5
reiserfs_stage1_5
ufs2_stage1_5
vstafs_stage1_5
xfs_stage1_5
Stage2
這是grub的主要階段,它通常在/boot分區中的/boot/grub/stage2位置,它讀取/boot/grub/grub.conf文件中的配置信息來確認如何加載內核,它擁有交互界面,允許你通過它來解決啟動問題,重新或修改GRUB,如何讓系統工作,stage2給用戶顯示出一個圖形啟動菜單,如果沒有使用相關的按鍵進行操作,如e,i鍵等,那麼在規定時間內,沒有進行選擇,GRUB就會從默認菜單項啟動。
/boot/grub/grub.conf
該文件指定特定內核和initrd文件所有模塊,並載入到你的Linux系統中去。
以下是RedHat中典型的grub.conf文件
# grub.conf generated by anaconda
#
# Note that you do not have to rerun grub after making changes to this file
# NOTICE: You have a /boot partition. This means that
# all kernel and initrd paths are relative to /boot/, eg.
# root (hd0,0)
# kernel /vmlinuz-version ro root=/dev/hdb9
# initrd /initrd-version.img
#boot=/dev/hdb
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Server (2.6.18-53.el5)
root (hd0,0)
kernel /vmlinuz-2.6.18-53.el5 ro root=LABEL=/ rhgb quiet
initrd /initrd-2.6.18-53.el5.img
以下是經常出現的啟動錯誤界面:
GNU GRUB version 0.97 (640K lower / 3072K upper memory)
[Minimal BASH-like line editing is supported. For the first word, TAB
lists possible command completions. Anywhere else, TAB lists the possible
completions of a device/filename.]grub>
什麼都沒有,只有GRUB的提示符,我們該怎麼辦?通過GRUB中的TAB鍵來手動啟動,以下是操作步驟:
grub> root (hd0,0)
Filesystem type is ext2fs, partition type 0×83
grub> kernel /<TAB>
Possible files are: lost+found grub initrd-2.6.18-8.el5.img System.map-2.6.18-
8.el5 config-2.6.18-8.el5 symvers-2.6.18-8.el5.gz vmlinuz-2.6.18-8.el5
grub> kernel /vmlinuz-2.6.18-8.el5 ro root=LABEL=/
[Linux-bzImage, setup=0x1e00, size=0x1ad054]
grub> initrd /<TAB>
Possible files are: lost+found grub initrd-2.6.18-8.el5.img System.map-2.6.18-
8.el5 config-2.6.18-8.el5 symvers-2.6.18-8.el5.gz vmlinuz-2.6.18-8.el5
grub> initrd /initrd-2.6.18-8.el5.img
[Linux-initrd @ 0xfe8a000, 0x15547c bytes]
grub> boot
其中,root (hd0,0)專指第一塊硬盤中的第一個分區;在kernel行中,你可以輸入”/”,<TAB>就可以查看顯示內核列表,在輸入所要啟動內核名稱的幾個關鍵字符之後,按<TAB>鍵讓GRUB自動幫你補全;另外”ro root=LABEL=/”選項,來自我對RedHat系統使用的經驗,你可能會有所不同;所以你需要在你的grub.conf文件中檢查這些內容。
在initrd行,也可以使用同樣的操作,顯示相關內容列表。最後,輸入boot,回車,Linux系統就可以啟動。
感謝來自OwnLinux:GRUB 啟動窺探的稿件