一、linux系統(tǒng)啟動流程
以下是centos6的啟動流程
第一步:BIOS引導(dǎo)階段
BIOS(Basic Input / Output System),又稱基本輸入輸出系統(tǒng)砌些,可以視為是一個(gè)永久地記錄在ROM中的一個(gè)軟件吊输,是操作系統(tǒng)輸入輸出管理系統(tǒng)的一部分环鲤。早期的BIOS芯片確實(shí)是”只讀”的等脂,里面的內(nèi)容是用一種燒錄器寫入的,一旦寫入就不能更改桐猬,除非更換芯片÷竽欤現(xiàn)在的主機(jī)板都使用一種叫Flash EPROM的芯片來存儲系統(tǒng)BIOS,里面的內(nèi)容可通過使用主板廠商提供的擦寫程序擦除后重新寫入溃肪,這樣就給用戶升級BIOS提供了極大的方便免胃。
BIOS的功能由兩部分組成,分別是POST碼和Runtime服務(wù)惫撰。POST階段完成后它將從存儲器中被清除羔沙,而Runtime服務(wù)會被一直保留,用于目標(biāo)操作系統(tǒng)的啟動厨钻。BIOS兩個(gè)階段所做的詳細(xì)工作如下:
步驟1:上電自檢POST(Power-on self test)扼雏,主要負(fù)責(zé)檢測系統(tǒng)外圍關(guān)鍵設(shè)備(如:CPU、內(nèi)存夯膀、顯卡诗充、I/O、鍵盤鼠標(biāo)等)是否正常诱建。例如蝴蜓,最常見的是內(nèi)存松動的情況,BIOS自檢階段會報(bào)錯(cuò)俺猿,系統(tǒng)就無法啟動起來茎匠;
步驟2:步驟1成功后,便會執(zhí)行一段小程序用來枚舉本地設(shè)備并對其初始化辜荠。這一步主要是根據(jù)我們在BIOS中設(shè)置的系統(tǒng)啟動順序來搜索用于啟動系統(tǒng)的驅(qū)動器汽抚,如硬盤抓狭、光盤伯病、U盤、軟盤和網(wǎng)絡(luò)等。以硬盤啟動為例午笛,BIOS此時(shí)去讀取硬盤驅(qū)動器的第一個(gè)扇區(qū)(MBR惭蟋,512字節(jié)),然后執(zhí)行里面的代碼药磺。實(shí)際上這里BIOS并不關(guān)心啟動設(shè)備第一個(gè)扇區(qū)中是什么內(nèi)容告组,它只是負(fù)責(zé)讀取該扇區(qū)內(nèi)容、并執(zhí)行癌佩。
至此木缝,BIOS的任務(wù)就完成了,此后將系統(tǒng)啟動的控制權(quán)移交到MBR部分的代碼围辙。
1 PS: 在個(gè)人電腦中我碟,Linux的啟動是從0xFFFF0地址開始的。
第二步:系統(tǒng)引導(dǎo) >MBR姚建,它是Master Boot Record的縮寫矫俺。硬盤的0柱面、0磁頭掸冤、1扇區(qū)稱為主引導(dǎo)扇區(qū)厘托。它由三個(gè)部分組成,主引導(dǎo)程序(Bootloader)稿湿、 硬盤分區(qū)表DPT(Disk Partition table)和硬盤有效標(biāo)志(55AA)铅匹,其結(jié)構(gòu)圖如下所示:
MBR(Master Boot Record),主引導(dǎo)記錄缎罢,MBR存儲于磁盤的頭部伊群,大小為512bytes,其中策精,446bytes用于存儲BootLoader程序舰始,64bytes用于存儲分區(qū)表信息,最后2bytes用于MBR的有效性檢查咽袜。
GRUB
GRUB(Grand Unified Bootloader)丸卷,多系統(tǒng)啟動程序,其執(zhí)行過程可分為三個(gè)步驟:
第一步:這個(gè)其實(shí)就是MBR询刹,它的主要工作就是查找并加載第二段Bootloader程序(stage2)谜嫉,但系統(tǒng)在沒啟動時(shí),MBR根本找不到文件系統(tǒng)凹联,也就找不到stage2所存放的位置沐兰,因此,就有了stage2
第二步:識別文件系統(tǒng)
第三步:GRUB程序會根據(jù)/boot/grub/grub.conf文件查找Kernel的信息蔽挠,然后開始加載Kernel程序住闯,當(dāng)Kernel程序被檢測并在加載到內(nèi)存中,GRUB就將控制權(quán)交接給了Kernel程序。
PS:實(shí)際上這個(gè)步驟/boot還沒被掛載比原,GRUB直接識別grub所在磁盤的文件系統(tǒng)插佛,所以實(shí)際上應(yīng)該是/grub/grub.conf文件,該配置文件的信息如下:
default=0 #設(shè)定默認(rèn)啟動的title的編號量窘,從0開始
timeout=5 #等待用戶選擇的超時(shí)時(shí)間
splashimage=(hd0,0)/boot/grub/splash.xpm.gz #GRUB的背景圖片
hiddenmenu #隱藏菜單
title CentOS (2.6.18-194.el5PAE) #內(nèi)核標(biāo)題
root (hd0,0) #內(nèi)核文件所在的設(shè)備
kernel /vmlinuz-2.6.18-194.el5PAE ro root=LABEL=/ #內(nèi)核文件路徑以及傳遞給內(nèi)核的參數(shù)
initrd /initrd-2.6.18-194.el5PAE.img #ramdisk文件路徑
三雇寇、啟動Kernel
Kernel,內(nèi)核蚌铜,Kernel是Linux系統(tǒng)最主要的程序锨侯,實(shí)際上,Kernel的文件很小冬殃,只保留了最基本的模塊识腿,并以壓縮的文件形式存儲在硬盤中,當(dāng)GRUB將Kernel讀進(jìn)內(nèi)存造壮,內(nèi)存開始解壓縮內(nèi)核文件渡讼。講內(nèi)核啟動,應(yīng)該先講下initrd這個(gè)文件耳璧,
initrd(Initial RAM Disk)成箫,它在stage2這個(gè)步驟就被拷貝到了內(nèi)存中,這個(gè)文件是在安裝系統(tǒng)時(shí)產(chǎn)生的旨枯,是一個(gè)臨時(shí)的根文件系統(tǒng)(rootfs)蹬昌。因?yàn)镵ernel為了精簡,只保留了最基本的模塊攀隔,因此皂贩,Kernel上并沒有各種硬件的驅(qū)動程序,也就無法識rootfs所在的設(shè)備昆汹,故產(chǎn)生了initrd這個(gè)文件明刷,該文件裝載了必要的驅(qū)動模塊,當(dāng)Kernel啟動時(shí)满粗,可以從initrd文件中裝載驅(qū)動模塊辈末,直到掛載真正的rootfs,然后將initrd從內(nèi)存中移除映皆。
Kernel會以只讀方式掛載根文件系統(tǒng)挤聘,當(dāng)根文件系統(tǒng)被掛載后,開始裝載第一個(gè)進(jìn)程(用戶空間的進(jìn)程)捅彻,執(zhí)行/sbin/init组去,之后就將控制權(quán)交接給了init程序。
四步淹、Init初始化
init程序就是進(jìn)行OS初始化操作从隆,實(shí)際上是根據(jù)/etc/inittab(定義了系統(tǒng)默認(rèn)運(yùn)行級別)設(shè)定的動作進(jìn)行腳本的執(zhí)行湾戳,第一個(gè)被執(zhí)行的腳本為/etc/rc.d/rc.sysinit,這個(gè)是真正的OS初始化腳本广料,簡單講下這個(gè)腳本的任務(wù)(可以去看看實(shí)際腳本,看看都做了什么):
激活udev和selinux幼驶;
根據(jù)/etc/sysctl.conf文件艾杏,來設(shè)定內(nèi)核參數(shù);
設(shè)定系統(tǒng)時(shí)鐘盅藻;
裝載硬盤映射购桑;
啟用交換分區(qū);
設(shè)置主機(jī)名氏淑;
根文件系統(tǒng)檢測勃蜘,并以讀寫方式重新掛載根文件系統(tǒng);
激活RAID和LVM設(shè)備假残;
啟用磁盤配額缭贡;
根據(jù)/etc/fstab,檢查并掛載其他文件系統(tǒng)辉懒;
清理過期的鎖和PID文件
執(zhí)行完后阳惹,根據(jù)配置的啟動級別,執(zhí)行對應(yīng)目錄底下的腳本眶俩,最后執(zhí)行/etc/rc.d/rc.local這個(gè)腳本莹汤,至此,系統(tǒng)啟動完成颠印。
五纲岭、Runlevel指定運(yùn)行級別
runlevel,運(yùn)行級別线罕,不同的級別會啟動的服務(wù)不一樣止潮,init會根據(jù)定義的級別去執(zhí)行相應(yīng)目錄下的腳本,Linux的啟動級別分為以下幾種
啟動級別 啟動模式
0 關(guān)機(jī)模式
1 單一用戶模式(直接以管理員身份進(jìn)入)
2 多用戶模式(無網(wǎng)絡(luò))
3 多用戶模式(命令行)
4 保留
5 多用戶模式(圖形界面)
6 重啟
在不同的運(yùn)行級別下钞楼,/etc/rc.d/rc這個(gè)腳本會分別執(zhí)行不同目錄下的腳本
Run level 0 – /etc/rc.d/rc0.d/
Run level 1 – /etc/rc.d/rc1.d/
Run level 2 – /etc/rc.d/rc2.d/
Run level 3 – /etc/rc.d/rc3.d/
Run level 4 – /etc/rc.d/rc4.d/
Run level 5 – /etc/rc.d/rc5.d/
Run level 6 – /etc/rc.d/rc6.d/
這些目錄下的腳本只有K和S開頭的文件沽翔,K開頭的文件為開機(jī)需要執(zhí)行關(guān)閉的服務(wù),S開頭的文件為開機(jī)需要執(zhí)行開啟的服務(wù)窿凤。