第一步:POST(Power?On?Safe?Test)加電自檢
?? 當按下電源鍵以后,CPU因為有電流通過便開始對自身、I/O設備、內存等硬件進行檢驗。那么CPU如何得知這些自檢指令?我們知道指令存在于內存當中,尋找內存也需要指令。這看起來似乎是一個“死結”。如何解決呢?在CPU生廠商生產CPU的時候會給CPU內置一系列指令,讓CPU通電以后就在固定的內存(ROM)中尋找自檢指令,進行自檢。所以,內存不僅僅只有我們可見的RAM,還有我們不可見,CPU可見ROM。
第二步:BIOS(Basic?Input?Output?System)
?? BIOS是一組固化在主板上ROM芯片上的程序,該程序的主要功能是完成系統的加電自檢、系統的自啟動程序。
由于一臺計算機中可能會存在很多磁盤,每個磁盤都可以裝載一個操作系統,此時BIOS中的Boot?Sequence模塊會決定啟動那個磁盤中的操作系統。
第三步:MBR(Master?Boot?Recorder)引導將內核加載到內存中
在完成自檢以及選擇好裝載哪個操作系統之后,BIOS會將選定磁盤的0號扇區上的MBR加載進內存引導其加載內核模塊。
MBR(512B)=?Boot?Loader(446B)+?Partition?information(16B*4)+?Reserve(2B)
為了方便的訪問內核所在的磁盤,MBR中的Boot?Loader會將內核所在的分區暫時指定為“根文件分區”,然后通過該種路徑訪問內核,并將其加載進內存中。內核加載完畢以后,會指定非本分區的一個分區為真實的根分區,并將內核所在的分區掛載到真實根分區的/boot目錄下,此時用戶可以通過/boot/對內核文件進行訪問。
加載的內核文件由兩部分組成:壓縮的內核文件和進行內核解壓的程序。內核的真實文件非常大,為了減小加載過程中IO的消耗,將內核文件壓縮后再加載進內存,然后由內核解壓模塊對壓縮程序進行解壓。
當前常用的Boot?Loader就是GRUB。其分為三個階段(查看/boot/grub):
?1st?stage:位于MBR中,用于引導2nd?stage。
?1.5?stage:位于boot基本磁盤分區當中,為了識別內核文件所在的文件系統提供文件系統識別擴展。
?2nd?stage:位于boot基本磁盤分區當中,GRUB的引導程序。
問題:boot分區和內核分區可以是存在于一個分區內嗎?
?答:為了方便boot分區支持更多的分區類型,如LVM、raid等中。boot分區最好不要和內核分區位于同一分區當中,因為內核分區只支持基本分區類型,若boot非基本分區類型,則MBR中Boot?Loader中的1st?stage不能識別2nd?stage。
第四步:操作系統的安裝
當內核被加載進內存以后,內核的解壓程序會將壓縮的內核模塊解壓在內存中,此時內核便會啟動第一個進程(0號進行)。由于啟動改進程需要執行/sbin/init,此時內核并不一定存在識別‘/’文件系統的功能。因為沒有加載相應硬件的驅動程序。為了適應不同的硬件平臺,內核被設計成一個多模塊程序,在不同的硬件平臺下加載不同的驅動程序。
那如何得知需要加載哪些驅動程序呢?在Boot?Loader將內核加載到內存之后,Boot?Loader還會加載一個能夠識別各種硬件驅動的程序,也就是initrd(init?ram?disk)。該程序會檢測內核運行的硬件平臺,得知需要加載哪些驅動程序以后,將這些應用程序打包加載進內存當中。
此時由于真實的根文件系統并沒有掛載,所以initrd被內核當做根文件系統進行訪問,啟動各種驅動程序。initrd會掛載新的根分區,并生成一個init(0號進程)進行管理有initrd啟動起來的進程,同時將自身識別的各種硬件文件一并復制但真實的根分區之后就自行退出了。
第五步:初始化工作(/sbin/init)
操作系統安裝完畢之后,會執行一系列初始化動作,這些動作被定義在/etc/inittab,該文件中定義的init都要完成的任務有:
1、設置默認運行級別。
??? 運行級別:
0:關機
1:單用戶模式,直接以root身份進入系統,常用不密碼修改。
2:多用戶模式,支持網絡,不支持NFS(Network?File?System)。
3:多用戶模式,字符界面,支持網絡和NFS。(常用)
4:預留模式。
5:多用戶模式,圖形界面。(常用)
6:重啟系統。
? ? 運行級別的相關命令:
? ?? #?init??[0-6]?:切換運行級別
??? #?runlevel?/?who??-r?:查看當前的運新級別。
2、指定用戶初始化腳本(/etc/rc.sysinit)。
3、啟動指定級別下要(啟動|關閉)系統服務。
??? 查看系統服務命令:
#?chkconfig??--list
??? 系統如何得知該啟動或關閉哪些服務呢?在/etc/rc.d/文件夾中存在每個運行級別對應的文件夾,如rc0.d、rc3.d、rc5.d等,每個文件夾中的文件如下:
[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開頭的是要啟動的服務。
???? * 以K開頭的是要關閉的服務。
???? * num表示該服務啟動或者關閉的次序。
?? 系統啟動服務的時候就會讀取在對應運行級別下的該文件,然后以num的大小對服務進行遍歷,對于以S開頭的文件執行“/etc/rc.d/rc#.d/S#server_name?start”命令。以K開頭的文件執行“/etc/rc.d/rc#.d/K#server_name?stop”命令。
?4、定義“Ctrl+Alt+Delete”的操作。
?5、初始化字符終端,啟動login服務,并顯示/etc/issue文件中的內容。
?6、如果需要啟動圖形界面,會啟動圖形終端。
轉載于:https://blog.51cto.com/11229885/1754905