還記得馬哥曾總結過每天必讀的7句話
1、永遠不要向任何人解釋你自己。
2、別讓某人成為你生命中的優先。
3、每天早上兩個簡單的選擇:回去睡或起身追逐夢想。
4、不要讓在乎我們的人為我們哭泣
5、別在喜悅時許下承諾,憂傷時做出回答,憤怒時做出決定
6、享受生命的每個當下
7、當你持續的說你非常忙碌,你的明天就永遠不會來
現在細細看來,感悟良多。誰也不能預見將來,做好當前,即便將來遭遇失敗,也不會留下什麼遺憾。。。
廢話不多說,進入正題
首先此篇先大體介紹下整個系統的開機流程,再來對其一一展開進行詳細的說明
第一步:首先進行開機自檢POST,確認硬件正常後進入下一步
第二步:BIOS initialization(BOOT SEQ)BIOS初始化,並按照BIOS中設定的開機啟動加載設備進行依次的檢測
第三步:MBR(bootloader)在BIOS檢測到某一設備可以啟動後,開始加載MBR上的引導程序,在linux中,引導分為2個階段,首先加載在MBR上的一段極其精簡的啟動程序,由此啟動程序引導boot目錄中的grub,再由grub進行具體系統的引導啟動(grub是一個很強大的系統啟動引導管理軟件,也可以引導window)
第三步: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
搬照我的配置文件來詳細說明
# grub.conf generated by anaconda # # Note that you do not have to rerun grub after making changes to this file # NOTICE: You do not have a /boot partition. This means that # all kernel and initrd paths are relative to /, eg. # root (hd0,0) # kernel /boot/vmlinuz-version ro root=/dev/sda1 # initrd /boot/initrd-[generic-]version.img #boot=/dev/sda #以上是注釋說明 #以下是全局設定 default=0 #默認啟動的系統順序,從0開始數 timeout=5 #等待用戶選擇系統的超時時間 splashimage=(hd0,0)/boot/grub/splash.xpm.gz #開機圖片的位置,這裡的位置,由於GRUB是直接識別硬盤的,所以和在linux的樹狀文件系統要區分一下,如果在linux中boot掛載點是和單獨分區,那麼只要指向boot分區下的目錄,不用從boot開始,直接寫成splashimage=(hd0,0)/grub/splash.xpm.gz 我這裡將boot和根放在同一分區,所以從boot目錄開始寫 hiddenmenu #是否隱藏菜單 #以下是各個引導系統的設定 title CentOS (2.6.32-220.el6.i686) #菜單顯示名稱 root (hd0,0) #內核所在分區 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 #內核所在位置和需要向內核傳遞的參數 initrd /boot/initramfs-2.6.32-220.el6.i686.img #這是一個小linux,完整,精悍。 為了防止內核中沒有根系統文件的驅動產生系統啟動死循環(比如根是放在lvm設備中),先加載initrd這個精簡的linux,然後內核借助這個精簡的linux加載根文件系統的驅動,然後切換到真正的根文件系統繼續進行系統加載 password 123456 #啟動此系統需要的密碼,也可以放在全局設定中,表示在開機進入交互式GRUB編輯需要輸入密碼
Kernel initialization
1、硬件探測
2、硬件驅動初始化(initrd)
3、掛載根文件系統(為了避免額外進程寫操作破壞文件系統,所以在這裡是使用只讀掛載)
4、啟動/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,用戶登錄驗證等。
此篇寫述說原理,具體打造過程請期待下一篇。。
本文出自 “lustlost-迷失在欲望之中” 博客,請務必保留此出處http://lustlost.blog.51cto.com/2600869/912513