Linux入门之系统启动过程及初始化----“翻滚吧,牛宝宝”
? ? 每當(dāng)你按下開機(jī)電源鍵的時候,總是懷著一顆虔誠的心,抱著求神拜佛的念頭,祈求機(jī)器順利開機(jī),不要出幺蛾子;每當(dāng)你看到屏幕上輸出的一行又一行的信息,綠的OK,紅的failed,迷茫的眼神穿透了顯示器;這一切都是因為你不懂系統(tǒng)的啟動過程及初始化流程。在這里,力圖將Linux系統(tǒng)的啟動過程及初始化描述清楚,闡述好背后的原理。在撰寫本文的時候,必定會因為個人對知識理解的偏差,知識面的狹窄也限制了博文內(nèi)容,因此,希望小友們能夠提出寶貴意見。
Linux系統(tǒng)的啟動及初始化是Linux學(xué)習(xí)過程中非常重要的一個點,只有洞悉系統(tǒng)啟動過程、初始化了哪些內(nèi)容,才能對Linux有更加深入的了解。本文主要描述Linux系統(tǒng)從電腦開機(jī)到初始化完成整個過程,包括cpu加電自檢、bios尋找啟動項、bootloader加載系統(tǒng)內(nèi)核、系統(tǒng)啟動并初始化等等。
一、“人生”第一步,加電自檢
POST(Power on self test)。電腦開機(jī)通上電源后第一件事便是給cpu加載電源,cpu需要對硬件設(shè)備等外設(shè)進(jìn)行檢測,以便于啟動系統(tǒng)。然后cpu本身是不存儲任何信息的,所以,cpu根據(jù)固定在內(nèi)部的指向信息,從COMS中加載BIOS里存儲的內(nèi)容,對各個硬件如硬盤、PCI設(shè)備、內(nèi)存等進(jìn)行檢測。如果出現(xiàn)錯誤,如內(nèi)存沒有插好,電腦會發(fā)出警報,無法啟動;(這一步也可以算作是BIOS的工作)
二、BIOS的主要任務(wù)
BIOS中的信息被加載到cpu中,cpu負(fù)責(zé)將這些程序運(yùn)行起來,一是進(jìn)行自檢,對周邊的硬件設(shè)備進(jìn)行檢測,確保系統(tǒng)啟動的硬件環(huán)境;二是,在自檢完成之后,由于電腦中可能存在多個能夠用于啟動系統(tǒng)的驅(qū)動器,所以,需要根據(jù)BIOS中啟動順序(boot sequence)的設(shè)定,找到啟動系統(tǒng)的驅(qū)動器。例如我們的硬盤。BIOS會去讀取硬盤上的第一個扇區(qū)(512K):MBR(master boot recoder)。至于MBR中是什么內(nèi)容,怎樣來啟動系統(tǒng),BIOS并不關(guān)心。它只負(fù)責(zé)讀取該扇區(qū)上的數(shù)據(jù)和程序。
三、“咽喉”MBR
主引導(dǎo)分區(qū)記錄分為三段,第一段是446K的bootloader,第二段是硬盤分區(qū)表,第三段是硬盤有效標(biāo)志(也可稱魔術(shù)區(qū))。bootloader是啟動系統(tǒng)的核心模塊,cpu根據(jù)上面安裝的管理器(我們這里以最常見的grub為例)加載系統(tǒng)內(nèi)核。
四、“光明之路”Bootloader
bootloader是系統(tǒng)的啟動加載器。通常情況下,引導(dǎo)程序都安裝在bootloader中。以我們常見的grup為例,grub分為stage1,stage1.5,stage2。其中stage1的代碼是直接存放在mbr中的。當(dāng)BIOS將控制權(quán)傳遞給MBR后,stage1的代碼就開始運(yùn)行,它主要負(fù)責(zé)將stage1.5或者stage2的內(nèi)容加載在內(nèi)存中。stage2被加載到內(nèi)存中后,就會讀取grub的配置文件grub.conf。grub.conf的主要內(nèi)容如下:
[root@station47 grub]# cat 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/mapper/vg0-root # initrd /initrd-[generic-]version.img #boot=/dev/sda #指定默認(rèn)啟動的內(nèi)核或者os default=0 #等待用戶選擇需要啟動的內(nèi)核或者os的時常,時間為秒 timeout=5 #啟動時顯示的圖片 splashp_w_picpath=(hd0,0)/grub/splash.xpm.gz #隱藏選擇菜單 hiddenmenu #啟動時顯示的名稱 title CentOS (2.6.32-358.el6.x86_64) #系統(tǒng)內(nèi)核所在的磁盤root (hd0,0) #指定內(nèi)核文件及傳遞給內(nèi)核的參數(shù)kernel /vmlinuz-2.6.32-358.el6.x86_64 ro root=/dev/mapper/vg0-root rd_NO_LUKS rd_NO_DM LANG=en_US.UTF-8 rd_LVM_LV=vg0/swap rd_NO_MD SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=vg0/root KEYBOARDTYPE=pc KEYTABLE=us rhgb crashkernel=auto quiet rhgb quiet #initrd為加載真正系統(tǒng)文件系統(tǒng)前加載的虛擬文件系統(tǒng)(在centos5.0上為虛擬磁盤initrd,在centos6.0上為initramfs虛擬文件系統(tǒng))initrd /initramfs-2.6.32-358.el6.x86_64.img [root@station47 grub]#讀取配置文件后,系統(tǒng)內(nèi)核會初始化一部分的設(shè)備和文件,但是由于真正的系統(tǒng)內(nèi)核是在磁盤上文件系統(tǒng)上的,而此時磁盤文件系統(tǒng)還沒有被加載。并且,由于底層硬件設(shè)備平臺的巨大差異,內(nèi)核也不可能將全部的驅(qū)動程序都包含進(jìn)來。這個時候,initramfs出馬了。它是一個虛擬的文件系統(tǒng),在安裝操作系統(tǒng)的時候,一部分的安裝信息和硬件驅(qū)動程序就被寫入進(jìn)去。這樣,當(dāng)grub配置文件被讀取后,initramfs中的內(nèi)容會被復(fù)制到rootfs中,內(nèi)核從中讀取必須的驅(qū)動模塊,掛載真正的“根”,完成這些工作后,虛擬文件系統(tǒng)的內(nèi)容會被復(fù)制到系統(tǒng)中,然后從內(nèi)存中銷毀。控制權(quán)被交接給/sbin/init程序來進(jìn)行初始化
五、系統(tǒng)初始化
? ?/sbin/init接收到系統(tǒng)初始化的工作后,馬上開始工作。它是所有系統(tǒng)進(jìn)程的父進(jìn)程,pid永遠(yuǎn)為1。它接管了系統(tǒng)的控制權(quán)先之后,它首先會去讀取/etc/inittab文件來執(zhí)行相應(yīng)的腳本進(jìn)行系統(tǒng)初始化,如設(shè)置鍵盤、字體,裝載模塊,設(shè)置網(wǎng)絡(luò)等。inittab主要的任務(wù)有:
? ? 設(shè)置系統(tǒng)默認(rèn)的運(yùn)行級別
? ? ? ? 定義運(yùn)行系統(tǒng)的系統(tǒng)初始化腳本rc.sysinit
? ? ? ?啟動指定級別下的S開頭的服務(wù),關(guān)閉K開頭的服務(wù)
? ? ? ?定義CtrlAltDel組合操作
? ? ? ?啟動字符端終端
? ? ? ?啟動圖形終端
1.執(zhí)行初始腳本rc.sysinit
? ?sysinit做了系統(tǒng)初始化的大部分的工作,不辭辛勞的掛載文件系統(tǒng),啟動相應(yīng)運(yùn)行級別上的服務(wù)。主要有以下內(nèi)容:
? ?設(shè)定主機(jī)名,激活selinux和udev,掛載文件系統(tǒng),激活swap,以讀寫方式重新掛載根文件系統(tǒng),設(shè)置內(nèi)核參數(shù),設(shè)置系統(tǒng)時鐘,鍵盤映射,加載額外的驅(qū)動程序。
? ?rc.sysinit執(zhí)行完成后,系統(tǒng)基本上就算是啟動了。可以正常工作了。但是還需要啟動相關(guān)的系統(tǒng)服務(wù)才行。
2.執(zhí)行/etc/rc.d/rc#.d腳本,根據(jù)系統(tǒng)inittab配置文件設(shè)定的系統(tǒng)運(yùn)行級別,執(zhí)行不同目錄下的服務(wù)腳本,K開頭的為關(guān)閉的服務(wù),S開頭的為需要開啟的服務(wù)。
3.執(zhí)行用戶定義的引導(dǎo)程序/etc/rc.d/rc.local
我們可以自己定義屬于自己的啟動腳本,一般情況下可以放到該目錄下。
4.初始工作完成,啟動系統(tǒng),看到登錄界面
六、最淺薄的認(rèn)識給最需要學(xué)習(xí)的自己
簡單的描述了系統(tǒng)啟動及初始化的主要流程。但是,由于初學(xué),windows的影響,必定有很多地方認(rèn)識有誤,也會有很多地方遺漏。但是,奔跑的人從來不在于起步時姿勢是否好看,重要的是,一直在朝著正確的方向奔跑。
最后附一張來自網(wǎng)絡(luò)的圖,非常詳細(xì)和明晰,由于沒有找到相關(guān)作者,這里注明是從網(wǎng)絡(luò)上獲取,謝謝作者。
轉(zhuǎn)載于:https://blog.51cto.com/sweetweapen/1367801
總結(jié)
以上是生活随笔為你收集整理的Linux入门之系统启动过程及初始化----“翻滚吧,牛宝宝”的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。