打造我的專屬的微型linux--啓動原理篇

還記得馬哥曾總結過天天必讀的7句話linux

一、永遠不要向任何人解釋你本身。
二、別讓某人成爲你生命中的優先。
三、天天早上兩個簡單的選擇:回去睡或起身追逐夢想。
四、不要讓在意咱們的人爲咱們哭泣
五、別在喜悅時許下承諾,憂傷時作出回答,憤怒時作出決定
六、享受生命的每一個當下
七、當你持續的說你很是忙碌,你的明天就永遠不會來bash

如今細細看來,感悟良多。誰也不能預見未來,作好當前,即使未來遭遇失敗,也不會留下什麼遺憾。。。ide

廢話很少說,進入正題ui

 

首先此篇先大致介紹下整個系統的開機流程,再來對其一一展開進行詳細的說明this

第一步:首先進行開機自檢POST,確認硬件正常後進入下一步spa

第二步:BIOS initialization(BOOT SEQ)BIOS初始化,並按照BIOS中設定的開機啓動加載設備進行依次的檢測操作系統

第三步:MBR(bootloader)在BIOS檢測到某一設備能夠啓動後,開始加載MBR上的引導程序,在linux中,引導分爲2個階段,首先加載在MBR上的一段極其精簡的啓動程序,由此啓動程序引導boot目錄中的grub,再由grub進行具體系統的引導啓動(grub是一個很強大的系統啓動引導管理軟件,也能夠引導window)xml

第三步:Kernel initialization 在由grub引導linux內核後,啓動內核,由內核檢測基本硬件設備裝載對應驅動,並裝載rootfs和啓動init(/etc/inittab)進程

第四步:系統啓動和初始化,在啓動init後,纔開始真正的系統啓動,內核退居到後臺,由init來接管整個系統的加載和啓動,init會根據設定進行系統進一步的初始化,下面是init啓動後進行的一系列操做圖片

1.完成系統總體初始化:/etc/rc.d/rc.sysinit (此腳本能夠細細研讀)

2.啓動對應級別的各個服務:/etc/rc.d/rc 利用/etc/rc.d/ec[0-6].d/目錄下的全部腳本啓動或者中止服務

/etc/rc.d/ec[0-6].d/下都是連接文件,連接到/etc/rc.d/init.d/下的各個腳本

3./etc/rc.local (連接到/etc/rc.d/rc.local)給用戶定義的額外開機操做項

4.啓動虛擬終端,驗證用戶登陸(圖形界面則調用其餘如XDM來驗證用戶登陸)

至此 系統啓動完整,能夠說,整個系統的啓動都是靠一堆腳原本完成的

 

第一二步驟涉及到硬件的POST和BIOS階段就再也不細說了,從bootloader開始提及

 

 

bootloader

這是一段放置在MBR錢446字節中的一段精簡的引導程序(MBR一共有512字節,後64字節既是分區表,還有最後2個字節的填充)

 

常見的bootloader程序有

LILO:LInux LOader 能夠引導多個操做系統,但不支持大硬盤

GRUB:GRand Unified Bootloader 目前比較常見的引導加載器,這是一個分段的引導加載器,在Ubunt上用的是GRUB1.9x。

時隔10年,最新的GRUB2在昨天正式發佈了,有興趣的童鞋能夠去關注下

能夠在開機時進入GRUB的交互模式,直接輸入參數啓動系統,在這裏能夠輸入單用戶啓動參數直接進入單用戶模式進行密碼修改等操做

以前說這是一個分段的引導程序這裏來講說具體是怎麼分段的

 

第一段:MBR
用來引導進入第二段,在完成第一段後,初始化GRUB自我初始化後,並正常啓動第二段

 

第二段:/boot/grub

因爲MBR上的引導程序只有446字節,因此能放置的內容不多,功能很弱,因此經過引導啓動第二段放置在磁盤中/boot/grub目錄下強大的GRUB程序,來擴展其更爲強大的引導功能

此目錄下的配置文件

  /boot/grub/grub.conf

  搬照個人配置文件來詳細說明

 

   
   
   
   
  1. # grub.conf generated by anaconda  
  2. #  
  3. # Note that you do not have to rerun grub after making changes to this file  
  4. # NOTICE:  You do not have a /boot partition.  This means that  
  5. #          all kernel and initrd paths are relative to /, eg.  
  6. #          root (hd0,0)  
  7. #          kernel /boot/vmlinuz-version ro root=/dev/sda1  
  8. #          initrd /boot/initrd-[generic-]version.img  
  9. #boot=/dev/sda 
  10.  
  11. #以上是註釋說明 
  12.  
  13. #如下是全局設定  
  14. default=0 #默認啓動的系統順序,從0開始數 
  1. timeout=5 #等待用戶選擇系統的超時時間  
  2.  
  3. splashp_w_picpath=(hd0,0)/boot/grub/splash.xpm.gz #開機圖片的位置,這裏的位置,因爲GRUB是直接識別硬盤的,因此和在linux的樹狀文件系統要區分一下,若是在linux中boot掛載點是和單獨分區,那麼只要指向boot分區下的目錄,不用從boot開始,直接寫成splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz 我這裏將boot和根放在同一分區,因此從boot目錄開始寫  
  4.  
  5. hiddenmenu #是否隱藏菜單 
  6.  
  7.   
  8.  
  9. #如下是各個引導系統的設定  
  10. title CentOS (2.6.32-220.el6.i686) #菜單顯示名稱  
  11.  
  12.     root (hd0,0) #內核所在分區  
  13.  
  14.     kernel /boot/vmlinuz-2.6.32-220.el6.i686 ro root=UUID=f7ba45db-7d52-407e-996d-0d7c087f7a1a rd_NO_LUKS rd_NO_LVM LANG=en_US.UTF-8 rd_NO_MD quiet SYSFONT=latarcyrheb-sun16 rhgb crashkernel=auto  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM #內核所在位置和須要向內核傳遞的參數  
  15.  
  16.     initrd /boot/initramfs-2.6.32-220.el6.i686.img #這是一個小linux,完整,精悍。 爲了防止內核中沒有根系統文件的驅動產生系統啓動死循環(好比根是放在lvm設備中),先加載initrd這個精簡的linux,而後內核藉助這個精簡的linux加載根文件系統的驅動,而後切換到真正的根文件系統繼續進行系統加載 
  17.  
  18.     password 123456 #啓動此係統須要的密碼,也能夠放在全局設定中,表示在開機進入交互式GRUB編輯須要輸入密碼 

Kernel initialization

一、硬件探測

二、硬件驅動初始化(initrd)

三、掛載根文件系統(爲了不額外進程寫操做破壞文件系統,因此在這裏是使用只讀掛載)

四、啓動/sbin/init (PID:1)

 

在Kernel階段,須要掛在根目錄,而linux單內核系統,但它也吸取了微內核的特性,因此它包括了內核模塊。

內核:/boot/vmlinuz-version 模塊:/libmodules/version/

把模塊集成進內核能提升效率,但也增大了內核體積,因此使用加載模塊的方式提升了可管理性

這裏就造就了一個問題,因爲內核比較精簡,因此不可能集成進不少的驅動進去,由內核初始化後是必需要加載根文件系統的,一旦根文件系統放在RAID或LVM設備上,因爲內核缺乏這些高級文件系統的驅動,會致使沒法加載。因而就在這裏加了一層中間層,就是這裏的initrd了。initrd是一個微型的根文件系統,內置額外內核中沒有的驅動模塊

首先內核藉助initrd加載根文件系統,而後加載真實根文件系統驅動和其它必須驅動後,切換到真正的根文件系統。因此initrd只是起到一個過渡的做用

內核初始化產生的全部信息保存在/var/log/dmesg 二進制文件,使用dmesg命令查看

 

init 系統初始化

 

加載完成內核後,啓動整個系統的父進程,PID爲1 的init

init接管系統後,結合/etc/initab的配置,加載各類須要的庫文件,啓動各個進程,好比bash,用戶登陸驗證等。。。

 

此篇寫述說原理,具體打造過程請期待下一篇。。

相關文章
相關標籤/搜索