理解Linux的啟動過程,對於解決Linux系統啟動問題還是非常有協助的,知道Linux系統在每個階段做了哪些事,將會協助你更快的找到問題出處,並解決這些問題。
提示:在進行重要檔案編輯之前,最好是先對檔案進行備份。
首先,我們來看機器啟動的第一步–自檢(Power-On Self Test)
在啟動過程中的第一步,就是自檢,自檢是由電腦的BIOS(基本輸出入系統 (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 啟動窺探的稿件。
- Linux啟動全線提速法
- Linux啟動添加核心參數簡介
- Linux:從LiveCD到自啟動隨身碟