您好,登錄后才能下訂單哦!
我們都知道按下電腦電源鍵后,屏幕上會一閃而過很多信息,然后顯示登錄界面,然后輸入用戶名,密碼就可以暢享網(wǎng)絡(luò)世界了。那么這中間到底發(fā)生了什么呢,今天就讓我們來簡單探討一下CentOS的簡易版開機(jī)啟動流程吧。
第一階段:通電自檢過程
我們都知道電腦所有數(shù)據(jù)指令都是在內(nèi)存上才能被cpu處理的吧,我們還知道內(nèi)存在斷電后其上面的所有數(shù)據(jù)都會丟失吧,那么開機(jī)的時候內(nèi)存應(yīng)該是沒有東西的吧,那上面都不能干了,更別說啟動一個操作系統(tǒng)了,其實啊,我們內(nèi)存并不只是我們常見的那個內(nèi)存卡,很多硬件都會映射一段內(nèi)存到cpu的尋址空間上,比如說BIOS,顯卡等等,而我們知道BIOS是寫在主板芯片上的,而且是用閃存做成的ROM上 的,雖然也可以修改里面的數(shù)據(jù),但是我們還是習(xí)慣稱之為只讀存儲器,那么問題也來了,通電后,cpu怎么知道在內(nèi)存的哪個地址段是BIOS代碼段呢,這是因為cpu在制作的時候的設(shè)置的,當(dāng)通電瞬間,cpu會進(jìn)入實模式狀態(tài),然后把內(nèi)存尋址控制在大概1MB的樣子,然后其內(nèi)的IP寄存器和CS寄存器會將地址指向內(nèi)存的一個位置(只需要知道在一個位置,因為只是簡介嘛),而這個位置恰恰是BIOS代碼段開始的位置,然后顯而易見cpu就開始執(zhí)行這些代碼啦,然后就會看到我們熟悉的各種BIOS自檢信息啦,當(dāng)然最重要的是在內(nèi)存中生成中斷向量表(記錄了中斷向量程序在內(nèi)存中的位置)和中斷向量程序,而我們都設(shè)置過BIOS吧,最起碼設(shè)置里面的boot選項吧,就是將自己想要啟動的裝有系統(tǒng)的硬盤盡量往前面位置調(diào)(因為BIOS只認(rèn)第一個),這是因為當(dāng)BIOS檢測到這塊硬盤里含有操作系統(tǒng)的時候就會給CPU發(fā)一個中斷信號,然后CPU通過名字找到內(nèi)存中的中斷向量表中的這個中斷所指向的中斷向量程序的位置,然后就執(zhí)行這部分的程序,然后這個程序就會將我們的硬盤的第一個扇區(qū)(512字節(jié)也叫MBR)加載到內(nèi)存中,我們也知道硬盤的MBR中的前446K裝的是引導(dǎo)啟動程序代碼,中間64K裝的是我們硬盤的分區(qū)表,最后2個字節(jié)是MBR有效標(biāo)志(如果是55AA就有效,BIOS就是通過這個來分辨硬盤中是否有操作系統(tǒng)的),然后BIOS就去打瞌睡去了,做了甩手掌柜,把一起都交給了引導(dǎo)程序這個店小二了。
第二階段:引導(dǎo)程序裝載內(nèi)核過程
我們都懂沒有驅(qū)動程序的硬件只能自我娛樂,而硬盤也必須格式成某種格式的文件系統(tǒng)才能在操作系統(tǒng)下存儲東東,那么引導(dǎo)程序這個店小二想要加載硬盤上的操作系統(tǒng)就必須有支持這個文件系統(tǒng)格式的驅(qū)動才行,遺憾的是區(qū)區(qū)446K的空間并不能做到,因此在MBR隨后的扇區(qū)中會有這個驅(qū)動程序,然后第二階段就去尋找他的真愛了,在Linux中通常在/boot/vmlinuz-版本-發(fā)型號,然后內(nèi)核就被解壓加載到內(nèi)存中了(內(nèi)核也只是個程序而已)。
第三階段:內(nèi)核加載到PID為1的進(jìn)程init過程
內(nèi)核加載到內(nèi)存中開始運(yùn)行,但是相同的問題又來了,操作系統(tǒng)上的硬盤必須是一種文件系統(tǒng)才可以存放數(shù)據(jù),那么是不是可以把所有的文件系統(tǒng)的驅(qū)動程序都寫入到內(nèi)核中呢,當(dāng)然可以但又不可以,因為那樣的話不僅內(nèi)核會特別的大,而且一個機(jī)器上也就僅僅能用到很少很少的一部分而已,所以不可以這樣,但是寫進(jìn)去后確實也能達(dá)到目的,所以又可以,而Linux雖然是單內(nèi)核,但是其充分吸取了微內(nèi)核的高級理念,以為其支持動態(tài)加載模塊,上面意思呢,就是將很多功能可以寫成一個個模塊,然后加載到內(nèi)核中就可以了,當(dāng)然也可以直接編譯進(jìn)內(nèi)核,甚至有些模塊必須編譯進(jìn)內(nèi)核。而眾多的驅(qū)動程序就是被寫成了模塊,只保留基本功能就行。(請注意,我這里不是在捧windows,雖然它是微內(nèi)核,但是也因為如此而使得其要想達(dá)到內(nèi)部協(xié)調(diào)就必須寫更多的代碼,從而變得很臃腫還容易出問題,所以辣雞一詞用在上面最合適不過了),但是這樣的話那就沒能解決啟動操作系統(tǒng)啊,其實呢,內(nèi)核會在內(nèi)存中使用randis技術(shù)將一部分內(nèi)存虛擬化為硬盤使用,通過這個虛擬化一個小根文件系統(tǒng)來,你可以看看你的/boot下是不是有一個initramfs-版本-發(fā)型號的文件(版本和發(fā)型號和內(nèi)核一樣在CentOS 5中是initrd-版本-發(fā)型號,如果看看其下面的文件,會發(fā)現(xiàn)里面就是一小文件系統(tǒng),通過這個來加載文件系統(tǒng)驅(qū)動程序,然后再去加載真正的根文件系統(tǒng),緊接著就運(yùn)作啊運(yùn)作,生成0號進(jìn)程,然后因為自己沒什么本事就去生個兒子叫1號進(jìn)程init,兒子比老爹就厲害多了(雖然還是腦子不好,但起碼四肢俱全啊)
第四階段:1號進(jìn)程init干的那些事
在CentOS 5上:init自己也是剛開過光,學(xué)老爹,不過他志向比他爹大多了,因為他要生一窩兒子,直到自己兒子們組成一個完整的操作系統(tǒng)(Linux中通過fork()復(fù)制,exec()運(yùn)行的進(jìn)程會比自己爸爸功能強(qiáng)大),首先這廝會很“軸”,非要去找/etc/inittab這個文件,這個文件里面主要定義了默認(rèn)終端,系統(tǒng)初始化,關(guān)閉和開啟相應(yīng)終端下的程序,然后獲得可以登錄的終端。格式為
id:默認(rèn)終端級別:action:process
默認(rèn)終端級別有:
0:關(guān)機(jī), shutdown
1:單用戶模式(single user),root用戶,無須認(rèn)證;維護(hù)模式;
2、多用戶模式(multi user),會啟動網(wǎng)絡(luò)功能,但不會啟動NFS;維護(hù)模式;
3、多用戶模式(mutli user),完全功能模式;文本界面;
4、預(yù)留級別:目前無特別使用目的,但習(xí)慣以同3級別功能使用;
5、多用戶模式(multi user), 完全功能模式,圖形界面;
6、重啟,reboot
action:
wait:等待切換至此任務(wù)所在的級別時執(zhí)行一次;
respawn:一旦此任務(wù)終止,就自動重新啟動之;
initdefault:設(shè)定默認(rèn)運(yùn)行級別;此時,process省略;
sysinit:設(shè)定系統(tǒng)初始化方式,此處一般為指定/etc/rc.d/rc.sysinit腳本;
process:
/etc/rc.d/rc[0-6],會關(guān)閉相應(yīng)終端級別下的K##開頭的程序,開啟相應(yīng)終端級別下的S##開頭的程序,如果你ll其下面的文件會發(fā)現(xiàn)都是鏈接到/init.d下的除K##和S##的同名程序。
那么其順序就是,先id:默認(rèn)終端等級:initdefault:,來知道默認(rèn)終端,然后就是si::sysinit:/etc/rc,d/rc.sysinit,來初始化,再接著是id號:默認(rèn)終端等級:wait:/etc/rc.d/rc[0-6],實現(xiàn)開啟關(guān)閉相應(yīng)終端下的服務(wù)腳本,最后是tty[1-6]:默認(rèn)終端等級:respawn:/usr/sbin/mingget tty[1-6],來獲取登錄終端。
其中初始化實現(xiàn)的內(nèi)容有:
(1) 設(shè)置主機(jī)名;
(2) 設(shè)置歡迎信息;
(3) 激活udev和selinux;
(4) 掛載/etc/fstab文件中定義的所有文件系統(tǒng);
(5) 檢測根文件系統(tǒng),并以讀寫方式重新掛載根文件系統(tǒng);
(6) 設(shè)置系統(tǒng)時鐘;
(7) 根據(jù)/etc/sysctl.conf文件來設(shè)置內(nèi)核參數(shù);
(8) 激活lvm及軟raid設(shè)備;
(9) 激活swap設(shè)備;
(10) 加載額外設(shè)備的驅(qū)動程序;
(11) 清理操作;
最后執(zhí)行在/etc/rc.d/rc.local里面的作業(yè),這個文件沒有鏈接到/etc/init.d目錄下的任何腳本,他只是為了讓不想寫腳本來實現(xiàn)開機(jī)服務(wù)的人懶一下
那么怎么寫可以開機(jī)運(yùn)行或關(guān)閉的腳本呢。其實只要看一下/etc/init.d下或者/etc/rc.d/init.d(前面的只是鏈接到后面)的腳本就知道,在腳本開始部分加上#chconfig:終端(可以是多個):開啟優(yōu)先級:關(guān)閉優(yōu)先級,然后這個腳本就可以被chconfig命令管理,當(dāng)然你得把這個腳本弄到/etc/init.d或者/etc/rc.d/init.d下,可以鏈接也可以直接建在這目錄下。然后通過chconfig --add 腳本名就會添加到相應(yīng)終端等級的/etc/rc.d/rc[0-6]目錄下自動生成相應(yīng)的K##開頭和S##開頭的文件。然后就可以用service 腳本名 {start|restart|status|stop}來運(yùn)行重啟查看停止此服務(wù)腳本了
chkconfig命令
chkconfig --list [腳本名]:查看其在各終端等級的開啟關(guān)閉狀態(tài)
chkconfig --add 腳本名:將指定腳本生成在相應(yīng)終端下的K##開頭和S##開頭的的文件了,其實chkconfig 程序名 on/off就是這個機(jī)制罷了,但是只是這樣的話不會再其他終端生成文件,只會在腳本指定的終端中生成開啟或關(guān)閉文件。
chkconfig --del 腳本名:與上面相反。
chkconfig --level 指定終端(可以多個,默認(rèn)為2345) 腳本名 on/off。這就是所謂的開機(jī)運(yùn)行和關(guān)閉了,其實也就是在相應(yīng)終端下生成S##文件和K##文件罷了。
另外如果腳本中終端等級為-表示所有終端等級下都關(guān)閉(只生成K##),為其他數(shù)字的就代表在與這些終端上對應(yīng)的/etc/rc.d/rc[0-6]里面生成相應(yīng)的文件。
K##的這兩個數(shù)字表示的是停止優(yōu)先級,數(shù)字越小越優(yōu)先停止,表示依賴別的程序
S##的這兩個數(shù)字表示開啟優(yōu)先級,數(shù)字越小越優(yōu)先啟動,表示其被其他程序所依賴
在CentOS 6上用的是upstart并不是5上面經(jīng)典的SYS V,但是其還是兼容5,因此其/etc/inittab還是有效,只是這文件只設(shè)置默認(rèn)終端了,因此只有id:指定默認(rèn)等級:initdefault:
但是其里面說明了初始化腳本在/etc/init/rcS.conf,開啟和關(guān)閉相應(yīng)終端等級的腳本配置文件是/etc/init/rc.conf,然后再看這兩個文件會發(fā)現(xiàn)還是指向了/etc/rc.d/目錄下的腳本。所以沒什么好說的,只需要知道5上面的配置文件是/etc/inittab,而6的配置文件有/etc/inittab和/etc/init/*.conf,但是他們的腳本都在/etc/init.d(/etc/rc.d/init.d)
在CentOS 7上用的是systemd,改變非常的大,但是還是能兼容5,6,特別是5,其配置文件在
/etc/systemd/system和/usr/lib/systemd/system下。已經(jīng)說了雖然改變很大但是并不代表不能像5,6那也使用。因此這方面待續(xù)。。。。。
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。