首先,我們先瞭解一下linux開機的整個流程,以瞭解這些細節,這對我們後面製作小
linux系統有很大協助:
首先,按下你電腦的開關,此時啟動流程開始
1、加電自檢,POST
2、然後按照BOOT SEQUENCE設定的啟動次序,逐個檢查你的硬體裝置,以尋找可用的
boot loader,尋找到以後,將bootloader載入到記憶體中來,
3、bootloader的前446個位元組開始引導載入linux系統的核心kernel到記憶體,然後將核心解壓縮,
此時bootloader就完成它的任務就退出了,
4、在bootloader退出前將控制權都交給了核心kernel,核心開始進行系統的初始化,
識別一下基本的硬體,並載入驅動,
5、接下來就開始載入/sbin/init進程了,只是系統的第一個進程,是所有進程的祖父
6、這個進程是在/etc/inittab 的定義下開始執行的,
7、init進程載入完之後就列印登入提示給你了,
當然這隻是粗略的介紹一下開機的大致流程,
那麼接下來我們就將每一步解讀一下,
bootloader:從最初到現在有兩款比較強大的
1、LILO(LInux LOader),它可以引導多個linux,但是它有個缺陷就是不能
引導1024柱面的以外的分區
2、GRUB (grand unified bootloader)的功能非常強大,不僅能夠引導linux,還可以
引導windows,甚至還可以引動unix,它沒有LILO的缺陷,可以引動大硬碟的任何分區
上得作業系統,而且grub本身還不用裝在MBR裡面,
它甚至可以裝在某個分區的開機磁區裡,但是,grub只要不在MBR裡,就必須需要別
的裝在MBR內來引導,因此grub一般都裝在MBR內,但是問題又來了,我們知道在MBR
內只有446個位元組來存放bootloader,而這麼小的空間grub怎樣來實現這麼強大的功能
,顯然是有些吃力的,所以我們的grub為了不將自己局限在這446個位元組內,而把自己
分成了N段,主要分成了兩段,第一段就是那446個位元組放在bootloader裡,目的是來
啟動第二段,別的什麼都不幹,
Stage1:boot stage2
Stage2: 位於磁碟分割上,在磁碟分割上空間就大了,一般來講不但可以給你引導操作
系統,還可以給使用者提供一個圖形介面,光這個圖片就不止446個位元組了吧,這些東西
都是在核心所在的目錄下,/boot/grub,所以第一個階段就是引導啟動第二個階段,
第二個階段就是在/boot/grub目錄下,這個階段還有一個設定檔叫grub.conf,而第二
階段的運行就是在這個設定檔的支配下來啟動並執行。
其實,grub是三個階段的,還有一個1_5階段,我們可以到/boot/grub下來看一下
這些1_5其實就是檔案系統不一樣,那就是說明第二階段很可能在不同的檔案系統,
所以這主要用於對某個特定的檔案系統的裝載,或者是驅動某個特定的檔案系統
在這個目錄下有一個紅色字樣的splash.xpm.gz檔案,他就是你在開機時進入系統選擇
介面看都的那個背景圖片,如果你覺得它難看,你可以將其改為你喜歡的圖片,方法很
簡單
那先來總結一下grub的功能:
1、可以實現讓你選擇作業系統
2、在你選擇作業系統之後還可以給這個作業系統的核心傳遞一個參數
也就是說grub本身還具有編輯功能,開啟編輯模式可以直接向核心傳遞參數的
3、還有加密保護的功能,就是給你的核心設定一個密碼,有了這個密碼就可以
防止你的核心接受除了你之外的任何人傳遞的參數
接下來我們共同研究一下kernel載入的過程
一般來講核心是放在我們系統上的一個獨立分區,這個分區直接掛載到/boot目錄下
,也就是說,一般來講核心就在此處了,有一個叫vmlinuz-2.6.18-el5的檔案就是我們
的核心,這隻是其中的一個版本,後面有主要版本號,次版本號碼等資訊,這個核心
一般都很小,一方面是因為壓縮了,一方面是因為很多功能和驅動都做成了模組兒放在了
核心的外面,我們的核心檔案就是在boot目錄下儲存
而我們的grub也在這個目錄下,所以由此可以看出這個boot目錄至關重要,這個分區
至關重要,作業系統的整個開機檔案都在這個目錄下,
由於grub要啟動系統它就需要去載入核心,去載入核心就要到這個分區上來找,還
需要載入一些驅動,一些額外的檔案也需要到這個分區來找,grub自己本身就在這個
分區下,而grub本身的所有的引導過程都是靠在Bootloader內的第一個階段內的
446個位元組引導程式來實現的,這些引導程式除了能夠載入位於某個基本磁碟分區上
的某些程式之外沒有任何意義,沒有其他額外的功能其他的程式是載入不上的,
所以,這個分區所在裝置不能是一個軟RAID裝置,也不能是一個LVM裝置,因為要載入
這些裝置就需要有驅動,但是在那446個位元組內是放不下這麼多內容的,最多可以使用
RAID 1,因為它本身就是一個鏡像盤,只要其中一個就夠了,所以一般還是建議將這個
分區放到一個基本磁碟分區上,這也是為什麼將它獨立分區的原因
在這個目錄下還有一個較initrd的檔案,這個檔案除了開頭跟我們的核心不太一樣
以外其餘的基本都一樣,將這個解壓你會發現,裡面是一個完整的linux系統,所以它就是來虛擬一個
linux跟檔案系統,讓核心載入上來,然後提供一個可以讓核心可以讀取真正根分區的驅動程式的,
因此,核心裝在進來之後,就馬上將這個檔案讀取進來,將其展開,從中讀到驅動程式,然後讀到真正
的跟檔案系統,然後核心完成初始化,然後將去執行下一個程式
kernel的共做:
1、要做硬體探測。
2、驅動程式的初始化
3、以唯讀方式載入根檔案系統
4、裝在並啟動init進程
核心任務完成之後就將權利給了,init進程了
這個程式就是/sbin/init,這個進程的工作都是在inittab的支配下完成的,
格式主要是冒號隔開的四個段:
第一段:純粹的表示資訊
第二段:runlevel。運行層級,主要是用於定義第三段的動作的
第三段:action,用於定義怎樣啟動這個進程的
第四段:process
以上完了之後就執行mingetty,然後列印一個login,系統啟動到此時就基本完成了。