Linux系統開機自啓流程


第一步:POST(Power On Safe Test)加電自檢

   當按下電源鍵以後,CPU因爲有電流通過便開始對自身、I/O設備、內存等硬件進行檢驗。那麼CPU如何得知這些自檢指令?我們知道指令存在於內存當中,尋找內存也需要指令。這看起來似乎是一個“死結”。如何解決呢?在CPU生廠商生產CPU的時候會給CPU內置一系列指令,讓CPU通電以後就在固定的內存(ROM)中尋找自檢指令,進行自檢。所以,內存不僅僅只有我們可見的RAM,還有我們不可見,CPU可見ROM

wKioL1bzuxTymVS3AAAZDq6hKRA232.png

第二步:BIOS(Basic Input Output System)

   BIOS是一組固化在主板上ROM芯片上的程序,該程序的主要功能是完成系統的加電自檢、系統的自啓動程序。

由於一臺計算機中可能會存在很多磁盤,每個磁盤都可以裝載一個操作系統,此時BIOS中的Boot Sequence模塊會決定啓動那個磁盤中的操作系統。

第三步:MBR(Master Boot Recorder)引導將內核加載到內存中

在完成自檢以及選擇好裝載哪個操作系統之後,BIOS會將選定磁盤的0號扇區上的MBR加載進內存引導其加載內核模塊。

MBR512B= Boot Loader446B+ Partition information16B*4+ Reserve2B

爲了方便的訪問內核所在的磁盤,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分區支持更多的分區類型,如LVMraid等中。boot分區最好不要和內核分區位於同一分區當中,因爲內核分區只支持基本分區類型,若boot非基本分區類型,則MBRBoot Loader中的1st stage不能識別2nd stage

第四步:操作系統的安裝

當內核被加載進內存以後,內核的解壓程序會將壓縮的內核模塊解壓在內存中,此時內核便會啓動第一個進程(0號進行)。由於啓動改進程需要執行/sbin/init,此時內核並不一定存在識別‘/’文件系統的功能。因爲沒有加載相應硬件的驅動程序。爲了適應不同的硬件平臺,內核被設計成一個多模塊程序,在不同的硬件平臺下加載不同的驅動程序。

那如何得知需要加載哪些驅動程序呢?在Boot Loader將內核加載到內存之後,Boot Loader還會加載一個能夠識別各種硬件驅動的程序,也就是initrdinit ram disk)。該程序會檢測內核運行的硬件平臺,得知需要加載哪些驅動程序以後,將這些應用程序打包加載進內存當中。

此時由於真實的根文件系統並沒有掛載,所以initrd被內核當做根文件系統進行訪問,啓動各種驅動程序。initrd會掛載新的根分區,並生成一個init0號進程)進行管理有initrd啓動起來的進程,同時將自身識別的各種硬件文件一併複製但真實的根分區之後就自行退出了。

第五步:初始化工作(/sbin/init)

操作系統安裝完畢之後,會執行一系列初始化動作,這些動作被定義在/etc/inittab,該文件中定義的init都要完成的任務有:

1、設置默認運行級別。

    運行級別:

0:關機

1:單用戶模式,直接以root身份進入系統,常用不密碼修改。

2:多用戶模式,支持網絡,不支持NFSNetwork File System)。

3:多用戶模式,字符界面,支持網絡和NFS。(常用)

4:預留模式。

5:多用戶模式,圖形界面。(常用)

6:重啓系統。

    運行級別的相關命令:

     # init  [0-6] :切換運行級別

    # runlevel / who  -r :查看當前的運新級別。

2、指定用戶初始化腳本(/etc/rc.sysinit)。

3、啓動指定級別下要(啓動|關閉)系統服務。

    查看系統服務命令:

# chkconfig  --list

    系統如何得知該啓動或關閉哪些服務呢?在/etc/rc.d/文件夾中存在每個運行級別對應的文件夾,如rc0.drc3.drc5.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、如果需要啓動圖形界面,會啓動圖形終端。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章