Linux系统开机自启流程
第一步:POST(Power?On?Safe?Test)加電自檢
?? 當(dāng)按下電源鍵以后,CPU因?yàn)橛须娏魍ㄟ^便開始對(duì)自身、I/O設(shè)備、內(nèi)存等硬件進(jìn)行檢驗(yàn)。那么CPU如何得知這些自檢指令?我們知道指令存在于內(nèi)存當(dāng)中,尋找內(nèi)存也需要指令。這看起來似乎是一個(gè)“死結(jié)”。如何解決呢?在CPU生廠商生產(chǎn)CPU的時(shí)候會(huì)給CPU內(nèi)置一系列指令,讓CPU通電以后就在固定的內(nèi)存(ROM)中尋找自檢指令,進(jìn)行自檢。所以,內(nèi)存不僅僅只有我們可見的RAM,還有我們不可見,CPU可見ROM。
第二步:BIOS(Basic?Input?Output?System)
?? BIOS是一組固化在主板上ROM芯片上的程序,該程序的主要功能是完成系統(tǒng)的加電自檢、系統(tǒng)的自啟動(dòng)程序。
由于一臺(tái)計(jì)算機(jī)中可能會(huì)存在很多磁盤,每個(gè)磁盤都可以裝載一個(gè)操作系統(tǒng),此時(shí)BIOS中的Boot?Sequence模塊會(huì)決定啟動(dòng)那個(gè)磁盤中的操作系統(tǒng)。
第三步:MBR(Master?Boot?Recorder)引導(dǎo)將內(nèi)核加載到內(nèi)存中
在完成自檢以及選擇好裝載哪個(gè)操作系統(tǒng)之后,BIOS會(huì)將選定磁盤的0號(hào)扇區(qū)上的MBR加載進(jìn)內(nèi)存引導(dǎo)其加載內(nèi)核模塊。
MBR(512B)=?Boot?Loader(446B)+?Partition?information(16B*4)+?Reserve(2B)
為了方便的訪問內(nèi)核所在的磁盤,MBR中的Boot?Loader會(huì)將內(nèi)核所在的分區(qū)暫時(shí)指定為“根文件分區(qū)”,然后通過該種路徑訪問內(nèi)核,并將其加載進(jìn)內(nèi)存中。內(nèi)核加載完畢以后,會(huì)指定非本分區(qū)的一個(gè)分區(qū)為真實(shí)的根分區(qū),并將內(nèi)核所在的分區(qū)掛載到真實(shí)根分區(qū)的/boot目錄下,此時(shí)用戶可以通過/boot/對(duì)內(nèi)核文件進(jìn)行訪問。
加載的內(nèi)核文件由兩部分組成:壓縮的內(nèi)核文件和進(jìn)行內(nèi)核解壓的程序。內(nèi)核的真實(shí)文件非常大,為了減小加載過程中IO的消耗,將內(nèi)核文件壓縮后再加載進(jìn)內(nèi)存,然后由內(nèi)核解壓模塊對(duì)壓縮程序進(jìn)行解壓。
當(dāng)前常用的Boot?Loader就是GRUB。其分為三個(gè)階段(查看/boot/grub):
?1st?stage:位于MBR中,用于引導(dǎo)2nd?stage。
?1.5?stage:位于boot基本磁盤分區(qū)當(dāng)中,為了識(shí)別內(nèi)核文件所在的文件系統(tǒng)提供文件系統(tǒng)識(shí)別擴(kuò)展。
?2nd?stage:位于boot基本磁盤分區(qū)當(dāng)中,GRUB的引導(dǎo)程序。
問題:boot分區(qū)和內(nèi)核分區(qū)可以是存在于一個(gè)分區(qū)內(nèi)嗎?
?答:為了方便boot分區(qū)支持更多的分區(qū)類型,如LVM、raid等中。boot分區(qū)最好不要和內(nèi)核分區(qū)位于同一分區(qū)當(dāng)中,因?yàn)閮?nèi)核分區(qū)只支持基本分區(qū)類型,若boot非基本分區(qū)類型,則MBR中Boot?Loader中的1st?stage不能識(shí)別2nd?stage。
第四步:操作系統(tǒng)的安裝
當(dāng)內(nèi)核被加載進(jìn)內(nèi)存以后,內(nèi)核的解壓程序會(huì)將壓縮的內(nèi)核模塊解壓在內(nèi)存中,此時(shí)內(nèi)核便會(huì)啟動(dòng)第一個(gè)進(jìn)程(0號(hào)進(jìn)行)。由于啟動(dòng)改進(jìn)程需要執(zhí)行/sbin/init,此時(shí)內(nèi)核并不一定存在識(shí)別‘/’文件系統(tǒng)的功能。因?yàn)闆]有加載相應(yīng)硬件的驅(qū)動(dòng)程序。為了適應(yīng)不同的硬件平臺(tái),內(nèi)核被設(shè)計(jì)成一個(gè)多模塊程序,在不同的硬件平臺(tái)下加載不同的驅(qū)動(dòng)程序。
那如何得知需要加載哪些驅(qū)動(dòng)程序呢?在Boot?Loader將內(nèi)核加載到內(nèi)存之后,Boot?Loader還會(huì)加載一個(gè)能夠識(shí)別各種硬件驅(qū)動(dòng)的程序,也就是initrd(init?ram?disk)。該程序會(huì)檢測內(nèi)核運(yùn)行的硬件平臺(tái),得知需要加載哪些驅(qū)動(dòng)程序以后,將這些應(yīng)用程序打包加載進(jìn)內(nèi)存當(dāng)中。
此時(shí)由于真實(shí)的根文件系統(tǒng)并沒有掛載,所以initrd被內(nèi)核當(dāng)做根文件系統(tǒng)進(jìn)行訪問,啟動(dòng)各種驅(qū)動(dòng)程序。initrd會(huì)掛載新的根分區(qū),并生成一個(gè)init(0號(hào)進(jìn)程)進(jìn)行管理有initrd啟動(dòng)起來的進(jìn)程,同時(shí)將自身識(shí)別的各種硬件文件一并復(fù)制但真實(shí)的根分區(qū)之后就自行退出了。
第五步:初始化工作(/sbin/init)
操作系統(tǒng)安裝完畢之后,會(huì)執(zhí)行一系列初始化動(dòng)作,這些動(dòng)作被定義在/etc/inittab,該文件中定義的init都要完成的任務(wù)有:
1、設(shè)置默認(rèn)運(yùn)行級(jí)別。
??? 運(yùn)行級(jí)別:
0:關(guān)機(jī)
1:單用戶模式,直接以root身份進(jìn)入系統(tǒng),常用不密碼修改。
2:多用戶模式,支持網(wǎng)絡(luò),不支持NFS(Network?File?System)。
3:多用戶模式,字符界面,支持網(wǎng)絡(luò)和NFS。(常用)
4:預(yù)留模式。
5:多用戶模式,圖形界面。(常用)
6:重啟系統(tǒng)。
? ? 運(yùn)行級(jí)別的相關(guān)命令:
? ?? #?init??[0-6]?:切換運(yùn)行級(jí)別
??? #?runlevel?/?who??-r?:查看當(dāng)前的運(yùn)新級(jí)別。
2、指定用戶初始化腳本(/etc/rc.sysinit)。
3、啟動(dòng)指定級(jí)別下要(啟動(dòng)|關(guān)閉)系統(tǒng)服務(wù)。
??? 查看系統(tǒng)服務(wù)命令:
#?chkconfig??--list
??? 系統(tǒng)如何得知該啟動(dòng)或關(guān)閉哪些服務(wù)呢?在/etc/rc.d/文件夾中存在每個(gè)運(yùn)行級(jí)別對(duì)應(yīng)的文件夾,如rc0.d、rc3.d、rc5.d等,每個(gè)文件夾中的文件如下:
[root@anna-laptop?case_and_function]#?ll?/etc/rc.d/rc3.d/ K10saslauthd?????????K87named?????????????S10network???????????S25blk-availability??S90crond K15htcacheclean??????K87restorecond???????S11auditd????????????S25netfs?????????????S95atd K15httpd?????????????K89rdisc?????????????S11portreserve???????S26haldaemon?????????S97rhnsd K15svnserve??????????S02lvm2-monitor??????S12rsyslog???????????S26udev-post?????????S97rhsmcertd K50netconsole????????S08ip6tables?????????S15mdmonitor?????????S55sshd??????????????S99libvirt-guests K75ntpdate???????????S08iptables??????????S22messagebus????????S80postfix???????????S99local??? 上述的文件的命名都以[K|S][num][server_name]命名:
???? * 以S開頭的是要啟動(dòng)的服務(wù)。
???? * 以K開頭的是要關(guān)閉的服務(wù)。
???? * num表示該服務(wù)啟動(dòng)或者關(guān)閉的次序。
?? 系統(tǒng)啟動(dòng)服務(wù)的時(shí)候就會(huì)讀取在對(duì)應(yīng)運(yùn)行級(jí)別下的該文件,然后以num的大小對(duì)服務(wù)進(jìn)行遍歷,對(duì)于以S開頭的文件執(zhí)行“/etc/rc.d/rc#.d/S#server_name?start”命令。以K開頭的文件執(zhí)行“/etc/rc.d/rc#.d/K#server_name?stop”命令。
?4、定義“Ctrl+Alt+Delete”的操作。
?5、初始化字符終端,啟動(dòng)login服務(wù),并顯示/etc/issue文件中的內(nèi)容。
?6、如果需要啟動(dòng)圖形界面,會(huì)啟動(dòng)圖形終端。
轉(zhuǎn)載于:https://blog.51cto.com/11229885/1754905
總結(jié)
以上是生活随笔為你收集整理的Linux系统开机自启流程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Python脚本模拟登录网页之CSDN篇
- 下一篇: Linux 代码格式化工具 indent