理解操做系統開機引導和啓動過程對於配置操做系統和解決相關啓動問題是相當重要的。本文結合互聯網上各種資料,作一些總結,但願對你們有一些幫助。啓動流程總的劃分能夠分爲4個階段linux
Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主板、內存、硬盤子系統、顯示子系統、串並行接口、鍵盤等硬件狀況的檢測。shell
BIOS 上電自檢確認硬件的基本功能正常,而後產生一個 BIOS 中斷[3] INT 13H,該中斷指向某個接入的可引導設備的引導扇區。它所找到的包含有效的引導記錄的第一個引導扇區將被裝載到內存中,而且控制權也將從引導扇區轉移到此段代碼。BIOS的任務就完成了,此後將系統啓動的控制權移交到MBR部分的代碼。c#
引導扇區是引導加載器真正的第一階段。大多數 Linux 發行版本使用的引導加載器有三種:GRUB、GRUB2 和 LILO。GRUB2 是最新的,也是相對於其餘老的同類程序使用最普遍的。centos
咱們首先來了解一下MBR,它是Master Boot Record的縮寫。硬盤的0柱面、0磁頭、1扇區稱爲主引導扇區。它由三個部分組成,主引導程序(Bootloader)、 硬盤分區表DPT(Disk Partition table)和硬盤有效標誌(55AA)服務器
GRUB(全稱是 GRand Unified BootLoader),是一個用於計算機尋找操做系統內核並加載其到內存的智能程序。網絡
GRUB主要包含三個階段:socket
stage1是直接被寫入到MBR中去的,這樣機器一啓動檢測完硬件後,就將控制權交給了GRUB的代碼。也就是上圖所看到的前446個字節空間中存放的是stage1的代碼。ide
因爲引導記錄必須很是的小,它不可能很是智能,且不能理解文件系統結構。所以階段 1 的惟一功能就是定位並加載階段 1.5 的代碼。爲了完成此任務,階段 1.5 的代碼必須位於引導記錄與設備第一個分區之間的位置。在加載階段 1.5 代碼進入內存後,控制權將由階段 1 轉移到階段 1.5。測試
階段 1.5 的代碼必須位於引導記錄與設備第一個分區之間的位置。由於有更大的存儲空間用於階段 1.5,且該空間足夠容納一些通用的文件系統驅動程序,如標準的 EXT 和其它的 Linux 文件系統,如 FAT 和 NTFS 等。優化
GRUB 階段 2 全部的文件都已存放於 /boot/grub目錄及其幾個子目錄之下。該階段沒有一個相似於階段 1 與階段 1.5 的鏡像文件。
GRUB 階段 2 的主要功能是根據/boot/grub/grub.conf定位和加載 Linux 內核到內存中,並轉移控制權到內核。內核的相關文件位於 /boot
目錄下,這些內核文件能夠經過其文件名進行識別,其文件名均帶有前綴 vmlinuz。你能夠列出 /boot
目錄中的內容來查看操做系統中當前已經安裝的內核。
默認狀況下,GRUB 提供了一個已安裝內核的預引導菜單,其中包括問題診斷菜單(recuse)以及恢復菜單(若是配置已經設置恢復鏡像)。
階段 2 加載選定的內核到內存中,並轉移控制權到內核代碼。
內核文件都是以一種自解壓的壓縮格式存儲以節省空間,它與一個初始化的內存映像和存儲設備映射表都存儲於 /boot
目錄之下。
initrd(Initial RAM Disk),它在stage2這個步驟就被拷貝到了內存中,這個文件是在安裝系統時產生的,是一個臨時的根文件系統(rootfs)。由於Kernel爲了精簡,只保留了最基本的模塊,所以,Kernel上並無各類硬件的驅動程序,也就沒法識rootfs所在的設備,故產生了initrd這個文件,該文件裝載了必要的驅動模塊,當Kernel啓動時,能夠從initrd文件中裝載驅動模塊,直到掛載真正的rootfs,而後將initrd從內存中移除。
Kernel會以只讀方式掛載根文件系統,當根文件系統被掛載後,開始裝載第一個進程(用戶空間的進程),執行/sbin/init,以後就將控制權交接給了init程序。
內核被加載後,第一個運行的程序即是/sbin/init,該文件會讀取/etc/inittab文件(CentOS7已經再也不使用),並依據此文件來進行初始化工做。其實/etc/inittab文件最主要的做用就是設定Linux的運行等級,其設定形式是「:id:5:initdefault:」,這就代表Linux須要運行在等級5上。
執行系統初始化腳本(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根文件系統及其它文件系統,到此係統算是基本運行起來了,後面須要進行運行級別的肯定及相應服務的啓動。
(1)獲取網絡環境與主機類型。首先會讀取網絡環境設置文件"/etc/sysconfig/network",獲取主機名稱與默認網關等網絡環境。
(2)測試與載入內存設備/proc及usb設備/sys。除了/proc外,系統會主動檢測是否有usb設備,並主動加載usb驅動,嘗試載入usb文件系統。
(3)決定是否啓動SELinux。
(4)接口設備的檢測與即插即用(pnp)參數的測試。
(5)用戶自定義模塊的加載。用戶能夠再"/etc/sysconfig/modules/*.modules"加入自定義的模塊,此時會加載到系統中。
(6)加載核心的相關設置。按"/etc/sysctl.conf"這個文件的設置值配置功能。
(7)設置系統時間(clock)。
(8)設置終端的控制檯的字形。
(9)設置raid及LVM等硬盤功能。
(10)以方式查看檢驗磁盤文件系統。
(11)進行磁盤配額quota的轉換。
(12)從新以讀取模式載入系統磁盤。
(13)啓動quota功能。
(14)啓動系統隨機數設備(產生隨機數功能)。
(15)清楚啓動過程當中的臨時文件。
(16)將啓動信息加載到"/var/log/dmesg"文件中。
3)執行/etc/rc.d/rc腳本。該文件定義了服務啓動的順序是先K後S,而具體的每一個運行級別的服務狀態是放在/etc/rc.d/rc.d(=0~6)目錄下,全部的文件均是指向/etc/init.d下相應文件的符號連接。rc.sysinit經過分析/etc/inittab文件來肯定系統的啓動級別,而後纔去執行/etc/rc.d/rc*.d下的文件。
/etc/init.d-> /etc/rc.d/init.d
/etc/rc ->/etc/rc.d/rc
/etc/rc.d ->/etc/rc.d/rc.d
/etc/rc.local-> /etc/rc.d/rc.local
/etc/rc.sysinit-> /etc/rc.d/rc.sysinit
也就是說,/etc目錄下的init.d、rc、rc*.d、rc.local和rc.sysinit均是指向/etc/rc.d目錄下相應文件和文件夾的符號連接。咱們以啓動級別3爲例來簡要說明一下。
/etc/rc.d/rc3.d目錄,該目錄下的內容所有都是以 S 或 K 開頭的連接文件,都連接到"/etc/rc.d/init.d"目錄下的各類shell腳本。S表示的是啓動時須要start的服務內容,K表示關機時須要關閉的服務內容。/etc/rc.d/rc.d中的系統服務會在系統後臺啓動,若是要對某個運行級別中的服務進行更具體的定製,經過chkconfig命令來操做,或者經過setup、ntsys、system-config-services來進行定製。若是咱們須要本身增長啓動的內容,能夠在init.d目錄中增長相關的shell腳本,而後在rc.d目錄中創建連接文件指向該shell腳本。這些shell腳本的啓動或結束順序是由S或K字母后面的數字決定,數字越小的腳本越先執行。例如,/etc/rc.d/rc3.d /S01sysstat就比/etc/rc.d/rc3.d /S99local先執行。
執行用戶自定義引導程序/etc/rc.d/rc.local。其實當執行/etc/rc.d/rc3.d/S99local時,它就是在執行/etc/rc.d/rc.local。S99local是指向rc.local的符號連接。就是通常來講,自定義的程序不須要執行上面所說的繁瑣的創建shell增長連接文件的步驟,只須要將命令放在rc.local裏面就能夠了,這個shell腳本就是保留給用戶自定義啓動內容的。
完成了系統全部的啓動任務後,linux會啓動終端或X-Window來等待用戶登陸。tty1,tty2,tty3...這表示在運行等級1,2,3,4的時候,都會執行"/sbin/mingetty",並且執行了6個,因此linux會有6個純文本終端,mingetty就是啓動終端的命令。
CentOS7 的啓動流程主要步驟沒有很大的區別,主要是CentOS7開始,GRUB開始採用GRUB2版本,原來的init程序,改成了systemd,所以詳細解釋一下systemd後的啓動流程
systemd新特性:
引導導裝載程序, centos7是grub2,加載裝載程序的配置文件:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
加載initramfs驅動模塊,加載內核選項,內核初始化,從initramfs根文件系統切換到磁盤根目錄,centos7使用systemd代替init
### Centos五、Centos六、Centos7服務啓動的區別
Sysvinit技術:按照必定順序執行——>啓動太慢。(Centos5)
Upstart技術:Upstart對rc.sysinit腳本作了大量的優化,縮短了系統初始化的啓動時間。(Centos6)
Systemd技術:克服sysvinit固有的缺點,採用並行技術,提升系統的啓動速度(RedHat7,CentOS7,Ubuntu15等)