CentOS系統啟動流程

來源:互聯網
上載者:User

標籤:centos   系統啟動   

   開機不是只要單擊電源鈕,而關機只要關掉電源鈕就可以了嗎?話是這樣沒錯啦,但是由於 Linux 是一套多人多任務的作業系統,你難保你在關機時沒有人在線上,如果你關機的時候碰巧一大群人在線上工作, 那會讓當時在線上工作的人馬上斷線的!那不是害死人了!一些資料可是無價之寶。 

  另外 Linux 在執行的時候,雖然你在畫面上叧會看到黑壓壓的一片,完全沒有任何畫面, 但其實他是有很多的程式在背景底下執行的,例如登入檔案管控程式、例行性工作排程等, 當然還有一大堆網路服務,如郵件伺服器、WWW伺服器等等。你如果隨便關機的話, 是很容易傷害硬碟及資料轉送的操作!所以在 Linux 下開機關機可是一門大學問。


Linux的組成為: kernel + rootfs

kernel: 進程管理、記憶體管理、網路管理、驅動程式、檔案系統、安全功能

rootfs: 程式和glibc

  庫:函數集合, function, 調用介面(標頭檔負責描述)

    程序呼叫:procedure,無傳回值

    函數調用:function

  程式:二進位執行檔案

核心設計流派:

  單核心(monolithic kernel):Linux

    把所有功能整合於同一個程式

  微核心(micro kernel):Windows, Solaris

    每種功能使用一個單獨子系統實現



Linux核心特點:

  支援模組化:.ko(核心對象)

    如:檔案系統,硬體驅動,網路通訊協定等

  支援核心模組的動態裝載和卸載

 組成部分:

  核心檔案:/boot/vmlinuz-VERSION-release

    ramdisk:輔助的偽根系統

    CentOS 5: /boot/initrd-VERSION-release.img

    CentOS6,7: /boot/initramfs-VERSION-release.img

  模組檔案:/lib/modules/VERSION-release



既然啟動是一件嚴肅的事情,那我們就一起來瞭解一下啟動的過程:


系統啟動過程簡介:

1、載入BIOS的硬體資訊與進行自我檢測,並依據設定取得第一個可開機裝置;

2、讀取並執行第一個啟動裝置內的MBR的 boot loader (既是grub,spfdisk等程式);

3、依據boot loader的設定載入Kernel, kernel會開始檢測硬體與載入驅動程式;

4、在硬體驅動成功後,Kernel會主動調動init進程,而init會取得run-level資訊;

5、init執行/etc/rc.d/rc.sysinit檔案來準備軟體執行的作業環境(如網路、時區等);

6、init執行run-level的各個服務的啟動(script方式);

7、init執行/etc/rc.d/rc.local檔案;

8、init執行終端機類比程式mingetty來啟動login程式,最後等待使用者登入。


詳細說明:


1、載入BIOS的硬體資訊與進行自我檢測,並依據設定取得第一個可開機裝置;

   啟動系統首先就要載入BIOS,並通過BIOS載入CMOS的資訊,然後通過CMOS內的設定取得主機的各項硬體設定資訊。

   然後進行開機自我測試 (POST)POST(Power-on Self Test)。開始執行硬體檢測的初始化。接下來就開始啟動裝置的資料讀取。



  POST:Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、記憶體、硬碟子系統、顯示子系統、串並行介面、鍵盤、CD-ROM光碟機等硬體情況的檢測。

    ROM:BIOS(Basic Input and Output System),儲存著有關電腦系統最重要的基本輸入輸出程式,系統資訊設定、開機加電自檢程式和系統啟動自舉程式等。

    RAM:CMOS互補性氧化金屬半導體,儲存各項參數的設定,按次序尋找引導裝置,第一個有引導程式的裝置為本次啟動裝置





2、讀取並執行第一個啟動裝置內的MBR的 boot loader

  因為系統軟體都存放在硬碟當中,所以BIOS會指定啟動的裝置,讓我們可以讀取到系統的核心檔案,由於不同的作業系統的檔案系統格式不同,所以必須要以一個引導裝載程式來處理核心檔案的載入問題。這個程式就被成為boot loader。而boot loader程式就安裝在啟動設別的第一個扇區內,也就是MBR內。


思考:這裡有一個有趣的問題:

    既然核心檔案需要loader來讀取,每個作業系統的loader都不相同,那麼BIOS是怎麼找到MBR內的loader呢?

   其實BIOS是通過硬體的INT 13 中斷功能來讀取MBR的,只要BIOS可以檢測到你的磁碟,那麼他就可以通過INT 13 來讀取該磁碟中第一個扇區內的MBR中的資訊,這樣就可以執行boot loader了。


bootloader: 引導載入器,引導程式

    ①提供菜單,使用者可以選擇不同的啟動項,這也是多重開機的重要功能;

    ②載入核心檔案:直接指向可開機程式區段來開始啟動作業系統;

    ③轉交其他的loader:將引導程式轉交給其他的loader來執行;

 因為具有菜單的功能,所以我們可以現在不同的核心來啟動系統;也因為具有轉交給其他的loader的功能,所以可以實現,一機多系統。

  但是:

    windows: ntloader,僅是啟動OS ;windows預設沒有控制權轉交的功能,

    Linux:功能豐富,提供菜單,允許使用者選擇要啟動系統或不同的核心版本;把使用者選定的核心裝載到記憶體中的特定空間中,解壓、展開,並把系統控制權移交給核心

  所以,要實現多系統,只能先裝windows,再裝linux,因為linux可以把引導轉載程式的控制權交給windows來管理。此時的windows的loader就會接管啟動流程,這樣就可以載入核心檔案了。

  


3、依據boot loader的設定載入Kernel, kernel會開始檢測硬體與載入驅動程式;

  linux會將核心解壓縮到記憶體中,並且利用核心的功能來開始測試與驅動各個周邊的裝置,包括CPU,存放裝置,網卡等。同時核心也會對自己的功能重新檢測一下硬體。而不一定會使用BIOS檢測到的硬體資訊,也就是說,從此時開始核心開始完全接管BIOS後的工作。

  那麼核心檔案存放在哪裡呢?

    一般來說核心檔案存放在/boot下,並且取名為vmlinuz 650) this.width=650;" src="http://s2.51cto.com/wyfs02/M01/87/20/wKioL1fVMWWQwRA1AAAm7FF6Ua4660.png" style="float:none;" title="12.png" alt="wKioL1fVMWWQwRA1AAAm7FF6Ua4660.png" />

  • config-2.6.32-642.el6.x86_64 :此版本核心被編譯時間選擇的功能和模組設定檔;

  • grub:引導裝載程式 grub 相關資料目錄

  • System.map-2.6.32-642.el6.x86_64:核心功能放置到記憶體位址的對應表

  • initramfs-2.6.32-642.el6.x86_64.img:虛擬檔案系統檔案

  • vmlinuz-2.6.32-642.el6.x86_64:核心檔案!

 


 

  根據這些檔案的名字,我們也可以知道此版本的linux核心為2.6.32-642.el6.x86_64這個版本,因為linux核心是可以通過動態載入核心模組的(即驅動程式),這些模組存放在/lib/modules/目錄內。由於模組放置在磁碟根目錄內,因此在啟動的過程中核心必須要掛載根目錄,這樣才能讀取到核心模組提供的載入驅動程式的功能。

  為了防止影響到磁碟內檔案系統,因此啟動的過程中根目錄是以唯讀形式掛載的。

  



  bootloader是系統的啟動載入器。通常情況下,引導程式都安裝在bootloader中。以我們常見的grup為例,grub分為stage1,stage1.5,stage2。其中stage1的代碼是直接存放在mbr中的。當BIOS將控制權傳遞給MBR後,stage1的代碼就開始運行,它主要負責將stage1.5或者stage2的內容載入在記憶體中。stage2被載入到記憶體中後,就會讀取grub的設定檔grub.conf

650) this.width=650;" src="http://s5.51cto.com/wyfs02/M02/87/22/wKioL1fVSBCTMY3nAAAfPP-buX8570.png" title="14.png" alt="wKioL1fVSBCTMY3nAAAfPP-buX8570.png" />

  


  思考: 現在就遇到一個問題,核心並不認識裝置,所以需要去載入驅動程式,但是驅動程式都在/lib/modules/目錄內,而根目錄現在根本就沒辦法掛載,那是怎麼讀取到/lib/modules/目錄內的驅動程式的?

  在這種情況下,linux系統是依靠虛擬檔案系統來解決這個問題的,


虛擬檔案系統(initialRAM disk):

  一般檔案名稱為:"/boot/initramfs-版本號碼.img" 這個檔案能夠通過boot loader載入到記憶體中,然後被模擬成一個根目錄,且模擬檔案系統內有一個可執行檔程式,可以通過該程式載入啟動過程中最需要的核心模組,通常這些模組就是RAID,LVM等檔案系統與磁碟介面的驅動程式。載入完成之後,會協助核心重新調用/sbin/init/來開始後續的流程。。。


系統初始化過程:

POST --> BootSequence(BIOS) --> Bootloader(MBR) --> kernel(ramdisk) --> rootfs(唯讀) --> init(systemd)

  



4、在硬體驅動成功後,Kernel會主動調動init進程,而init會取得run-level資訊;


載入完畢後,核心會主動調用第一個進程,“/sbin/init”,它的功能就是準備軟體執行的環境。所有的操作都會通過init的設定檔即/etc/inittab來規劃,而inittab中有一個很重要的設定選項,那就是預設的run level(運行層級)。



運行層級:為系統運行或維護等目的而設定;0-6:7個層級

0:關機

1:單一使用者模式(root自動登入), single, 維護模式

2: 多使用者模式,啟動網路功能,但不會啟動NFS;維護模式

3:多使用者模式,正常模式;文本介面

4:預留層級;可同3層級

5:多使用者模式,正常模式;圖形介面

6:重啟


預設層級:3, 5

切換層級:init #

查看層級:runlevel; who -r




init讀取其初始設定檔案:/etc/inittab

初始運行層級(RUN LEVEL)

系統初始化指令碼

對應運行層級的指令碼目錄

捕獲某個關鍵字順序

定義UPS電源終端/恢複指令碼

在虛擬控制台產生getty

在運行層級5初始化X






5、init執行/etc/rc.d/rc.sysinit檔案來準備軟體執行的作業環境(如網路、時區等);

   /etc/inittab檔案中有這一句“ si::sysinit:/etc/rc.d/rc.sysinit ” 這表示:開始載入各項系統服務之前,得先做好整個系統內容,主要利用 /etc/rc.d/rc.sysinit 這指令碼來設定好系統內容的,所以,想要知道到底 CentOS 開機的過程當中做什麼動作,就得要仔細的分析 /etc/rc.d/rc.sysinit這個檔案  


/etc/rc.d/rc.sysinit: 系統初始化指令碼

(1) 設定主機名稱

(2) 設定歡迎資訊

(3) 啟用udev和selinux

(4) 掛載/etc/fstab檔案中定義的檔案系統

(5) 檢測根檔案系統,並以讀寫方式重新掛載根檔案系統

(6) 設定系統時鐘

(7) 啟用swap裝置

(8) 根據/etc/sysctl.conf檔案設定核心參數

(9) 啟用lvm及software raid裝置

(10) 載入額外裝置的驅動程式

(11) 清理操作


6、init執行run-level的各個服務的啟動(script方式);

   載入核心讓整個系統準備接受指令來工作,再經過 /etc/rc.d/rc.sysinit 的系統模組與相關硬體資訊的初始化後,你的 CentOS 系統應該已經順利工作了。 

   只是,我們還需要啟動系統所需要的各項服務,這樣主機才能提供相關的網路或者是主機功能。這個時候,依據在 /etc/inittab 裡面提到的 run level 設定值,就可以來決定啟動的服務項目了。

   舉例來說,使用 run level 3 當然就不需要啟動X Window 的相關服務。

  各個不同的 run level 服務啟動的各個指令碼地址存放在“/etc/inittab”裡;

650) this.width=650;" src="http://s5.51cto.com/wyfs02/M01/87/24/wKiom1fVVtOzMRy2AAAogFQktSs997.png" title="16.png" alt="wKiom1fVVtOzMRy2AAAogFQktSs997.png" />

說明:rcN --> 意味著讀取/etc/rc.d/rcN.d/

K*: K##*:##運行次序;數字越小,越先運行;數字越小的服務,通常為依賴到別的服務

S*: S##*:##運行次序;數字越小,越先運行;數字越小的服務,通常為被依賴到的服務

for srvin /etc/rc.d/rcN.d/K*; do  $srv stopdone
for srvin /etc/rc.d/rcN.d/S*; do   $srv startdone

7、init執行/etc/rc.d/rc.local檔案;

   在完成預設 runlevel 指定的各項服務後,如果還有其他的動作想要完成時,這個檔案就可以執行自己想要執行的系統指令了。 也就是說,有任何想要在開機時就進行的工作時,直接將他寫入 /etc/rc.d/rc.local , 那麼該工作就會在開機的時候自動被載入。而不必等登入系統去啟動。



注意:正常層級下,最後啟動一個服務S99local沒有連結至/etc/rc.d/init.d一個服務指令碼,而是指向/etc/rc.d/rc.local指令碼


不便或不需寫為服務指令碼放置於/etc/rc.d/init.d/目錄,且又想開機時自動啟動並執行命令,可直接放置於/etc/rc.d/rc.local檔案中

 /etc/rc.d/rc.local在指定運行層級指令碼後運行

 可以根據情況,進行自訂修改



8、init執行終端機類比程式mingetty來啟動login程式,最後等待使用者登入。

在完成了系統所有服務的啟動後,接下來 Linux 就會啟動終端機或者是 X Window 來等待使用者登入啦! 實際參考的項目是 /etc/inittab 內的這一段:

650) this.width=650;" src="http://s2.51cto.com/wyfs02/M02/87/24/wKiom1fVWfvBL0d9AABMPeMHyOQ334.png" title="17.png" alt="wKiom1fVWfvBL0d9AABMPeMHyOQ334.png" />


  這一段代表,在 run level 2, 3, 4, 5 時,都會執行 /sbin/mingetty , 而且執行六個,這也是為何我們 Linux 會提供”六個純文字終端機“的設定所在。 因為 mingetty 就是在啟動終端機的命令。 

  要注意的是那個 respawn 的 init 操項目,他代表當後面的指令被終止 (terminal) 時, init 會主動的重新啟動該項目。這也是為何我們登入 tty1 終端機介面後,以 exit 離開後, 系統還是會重新顯示等待使用者輸入的畫面的原因。 

  如果我們使用的是 run level 5 那麼除了這六個終端機之外, init 還會執行 /etc/X11/prefdm -nodaemon 那個指令, 他主要的功能就是在啟動 X Window 。 



CentOS 6啟動流程:

POST --> Boot Sequence(BIOS) --> Boot Loader --> Kernel(ramdisk) --> rootfs--> switchroot--> /sbin/init-->(/etc/inittab, /etc/init/*.conf) --> 設定預設運行層級--> 系統初始化指令碼rc.sysinit--> 關閉或啟動對應層級的服務--> 啟動終端


簡單圖示即為:

650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/87/26/wKiom1fVdQvTQCFdAAI_VLiTVzI196.png" title="6.png" alt="wKiom1fVdQvTQCFdAAI_VLiTVzI196.png" />



本文出自 “I'm Groot” 部落格,請務必保留此出處http://groot.blog.51cto.com/11448219/1852091

CentOS系統啟動流程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.