第一步: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、如果需要啓動圖形界面,會啓動圖形終端。