標籤: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系統啟動流程