CentOS系統啓動流程
POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) --> kernel(ramdisk) --> rootfs(readonly) --> switchroot --> /sbin/init(CentOS 5,6,7不同) --> 設置默認運行級別 --> 運行系統初始化腳本,完成系統初始化 --> 關閉啓動對應級別下需要停止的服務,啓動對應級別下需要開啓的服務 --> 設置登錄終端(啓動終端圖形終端)--> 操作系統啓動完成
CentOS系統啓動流程(內核級別)
1、POST:加電自檢
開機加電後,系統自檢硬件設備包括cpu、內存、硬盤、顯示設備等,這個過程叫加電自檢POST;一旦通電會自動讀取ROM有個帶電芯片CMOS程序並運行即按次序查找可引導設備,第一個有引導程序的設備即爲本次啓動要用到的設備;引導程序叫bootloader引導加載器。
2.BIOS:第一順序啓動的設備(基本輸入輸出系統 Basic Input and Cutput System)
ROM中的信息一旦寫入就不能進行修改,其信息斷電之後也仍然保留。而CMOS是微機主板上的一塊可讀寫的RAM芯片斷電以後保存在上面的數據會自動消失,需要主板電池供電;對CMOS中各項參數的設定要通過專門的程序,現在廠家將CMOS設置程序做到了BIOS芯片中,因此CMOS設置又通常叫做BIOS設置。BIOS(基本輸入輸出系統)也是固化在當前主機ROM芯片中的代碼,實現按次序查找各引導設備,第一個有引導程序的設備即爲本次啓動要用到的設備。
3.Boot Squence:引導加載程序啓動內核
按次序查找引導設備,第一個有引導程序的設備即爲本次啓動要用到的設備;
bootloader引導加載器、程序:
Windows:由ntlader引導加載器
Linux:
(1)LTLO:Linux Loder(無法支持大磁盤,1024後不能加載)
(2)GRUB: Grand Uniform Bootloder(統一引導加載器)
GRUB 0.X:Grub Legacy(傳統版本)
GRUB 1.X:Grub2 (第二版本)
功能:提供一個菜單,允許用戶選擇要啓動的系統或不同的內核版本,把用戶選定多內核裝載到RAM(內存)中的特點空間中,解壓、展開,而後把整個系統控制權移交給內核,即完成把內核加載到內存空間中。
Bootloader引導加載器是安裝在硬盤或光盤甚至是U盤上的程序,系統加電後運行的第一段軟件代碼。
Bootloader引導加載程序位於磁盤中的MBR中,每個磁盤或每個磁盤中的分區中都有MBRMBR是磁盤上的第一個扇區又叫做主引導扇區,是計算機開機後訪問硬盤時所必須要讀取的首個扇區,分三部分:
MBR:Master Boot Record(主引導記錄)
512bytes:
446bytes:bootloader(引導程序LTLO或GRUB)
64bytes:fat(分區表,文件系統分配表)
2bytes:55AA(標記MBR有效)
MBR是由分區程序(如Fdisk,Parted)所產生的,它不依賴任何操作系統,而且硬盤引導程序也是可以改變的,從而能夠實現多系統引導。僅僅包含一個64個字節的硬盤分區表。由於每個分區信息需要16個字節,所以對於採用MBR型分區結構的硬盤(其磁盤卷標類型爲MS-DOS),最多隻能識別4個主要分區。所以對於一個採用此種分區結構的硬盤來說,想要得到4個以上的主要分區是不可能的。這裏就需要引出擴展分區,擴展分區也是主分區(Primary partition)的一種,但它與主分區的不同在於理論上可以劃分爲無數個邏輯分區,每一個邏輯分區都有一個和MBR結構類似的擴展引導記錄(EBR)。
Linux中有多種引導加載程,常見的有最早的LILO,缺點:LILO無法支持大硬盤,如果內核或加載的系統位於1024柱面以後的分區上,LILO是加載不了,但在安卓手機上應用較廣泛;後來被GRUB取代,GRUB有兩個版本GRUB 0.x(Grub Legacy)和GRUB 1.x(Grub2)兩者從設計理念上完全不同。
Linux中的引導加載程Bootloader有多種實現方式:
LILO:LIinux LOader
GRUB:Grand Uniform Bootloader
GRUB 0.x:Grub Legacy
GRUB 1.x:Grub2
GRUB(Boot Lloader):
bootloader:1st stage(對MBR而言bootloader是加載其第二階段,不是加載內核)
Partiton:filesystem driver,1.5 stage
Partition:/boot/grub,2nd stage
加載後可在操作系統之前提供一個操作系統(即一個接口),然後加載內核;
Grub Legacy:分三階段
stage1:存放在MBR上
stage1_5:存放在MBR之後的扇區,讓stage1中的bootloader能識別stage2所在的分區上的文件系統;
stage2:磁盤分區(/boot/grub/)
引導加載程序先讀取MBR上的gurb第一階段,由於MBR很小隻有512字節採用grub這種方式引導程序,隨後讀取扇區中的stage1.5階段,讀取1.5階段以後從而就能驅動第二階段stage2所在的磁盤分區,stage2是存放在磁盤分區上的還包括了內核文件及ramdisk等都在這個分區上存放的;這就是爲什麼通過Bootloader之grub就能夠加載內核文件的原因。
注意:當前硬件平臺,主板BIOS必須能識別硬盤,然後BIOS才能加載硬盤中的Bootloader,磁盤中的Bootloader自身加載完以後,就能夠識別當前主機上的硬盤設備了。
但硬盤設備能識別,並不代表硬盤上的文件系統能識別,因爲文件系統是額外附加的一層軟件組織的文件結構,所以要能夠對接一種文件系統,必須要用到文件系統驅動;對應的應用程序必須能識別和理解這樣的文件系統纔可以,這種程序就稱爲文件系統驅動;grub的1.5階段就是給gurb提供了文件系統驅動的,從而就能夠訪問對應的第二階段和內核所在的分區了,這通常是一個基本磁盤分區;所以grub第二階段以及內核和ramdisk文件通常都會放在一個基本磁盤分區上;因爲grub驅動不了邏輯卷這種高級接口。
stage2一般是掛載至/boot/grub/目錄下;grub也有自己的配置文件:/boot/grub/grub.conf且通常有個符號鏈接文件:/etc/grub.conf;
stage2的功用:
(1)提供菜單或交互式接口;
(2)能加載用戶選擇的內核或操作系統;
(3)爲菜單通過了保護機制。
4.加載 kernel
(1)通過grub加載到內核後,就在內存中解壓並展開就可完成後續操作即內核自身初始化;分爲四步:
第一:探測可識別的所有硬件設備
第二:加載硬件驅動程序;(有可能會藉助於randisk加載驅動)
第三:以只讀方式掛載根文件系統
第四:運行用戶空間的第一個應用程序:/sbin/init
(其中有可能會藉助於randisk加載驅動,ramdisk:是基於內存的磁盤設備;以只讀方式掛載根文件原因是防止內核中有bug,確保無問題後再改爲讀寫方式;)
(2)如果內核把已知根文件系統所在的磁盤設備驅動程序編譯進內核(一般自己編譯內核含此驅動),此時就不需要這個ramdisk,所以發行商提供的安裝系統文件不可能包含所有驅動在內核中。
這樣,要想加載根文件系統,就要先加載根文件系統所在的磁盤設備驅動,而驅動就在根上因此,就不能依賴於根上的驅動程序來加載根文件系統;要藉助於ramdisk臨時根文件系統來加載根文件系統所在的磁盤設備驅動,從而加載根文件系統;
ramdisk臨時根文件系統不是操作系統發行商直接在光盤上自帶的,而是在安裝操作系統後臨時生成的,它在安裝操作系統後,能掃描當前主機硬盤設備的型號,並找到相關驅動做成一個臨時根;所以這個臨時根是爲每個用戶安裝過程生成以後動態創建的。
ramdisk臨時根是把內存某段空間當做磁盤使用,而Linux內核特性是使用緩衝和緩存來加速對磁盤上的文件訪問,這就是爲什麼在centos5上使用ramdisk(initrd),在後來的centos6,7上使用的ramfs的原因,避免了在內存中的雙緩衝和雙緩存。
spacer.gif
5.掛載根文件系統
一旦內核藉助於ramdisk提供的臨時根完成加載真正的根文件系統所在的設備,下一步就裝載根文件系統,內核會自動把根文件系統所在的設備掛載至根上,所以說根是在內核中就是這個原因所在。
6.根切換
在掛載根文件系統時爲了避免內核中有bug或操作過程中有bug導致根文件系統被損壞,先只讀掛載根文件系統,加載完成後纔讀寫掛載,完成整個掛載根文件系統後,直接去找/sbin/init程序,即開始運行用戶空間的第一個程序。
用戶空間啓動流程
7./sbin/init程序
init程序主要依賴於配置文件:/etc/inittab,大體分爲:設定默認啓動級別 --> 設定系統初始化腳本 --> 啓動對應級別的服務 --> 打印各終端登錄界面(如果級別爲3處理提供文本登錄界面,如果級別爲5還提供圖形登錄界面)
8. 設置默認運行級別
(1)運行級別:爲了系統的運行或維護等目的而設定的機制;
0-6:共7個級別;
0:關機,shutdown
1:單用戶模式(single user),root用戶,無須認證,維護模式;
2:多用戶模式(multi user),會啓動網絡功能,但不會啓動NFS,維護模式;
3:多用戶模式(multi user),完全功能模式,文本界面;
4:預留級別:目前無特別使用目的,但習慣以同3級別功能使用;
5:多用戶模式(multi user),完全功能模式,圖形界面;
6:重啓,reboot
(2)配置文件:/etc/inittab定義了很多功能,每一行定義一種操作(action)以及與之對應的process(僅適用於CentOS 5),一行就定義了init要執行的任務,甚至是一堆任務,每一行的語法格式爲: id:runlevels:action:process
id爲一個任務的標識符;
runlevels:在哪些運行級別下啓動此任務;例:3,2345,也可爲空表示所有級別;
action:在什麼條件下啓動此任務;
wait:等待切換至此任務所在的級別時執行一次(剛剛切換進來時);
respawn:一旦此任務終止時,就自動重啓;(如:登錄終端執行logout登出後會再次啓動)
initdefault:設定默認允許級別;此時process省略爲空;
sysinit:設定系統初始化方式,此處一般爲指定/etc/rc.d/rc.sysinit腳本;(CentOS 5,6都用到此腳本,CentOS 7是靠systemd完成的),在CentOS 6中僅保留此配置文件中設定啓動運行級別的功能。
process:具體任務;通常爲應用程序,或腳本,或二進制的程序,取決於自定義。
9.系統初始化腳本
系統初始化腳本:/etc/rc.d/rc.sysinit
(1)設置主機名;
(2)設置歡迎信息;
(3)激活udev和selinux;
(4)掛載/etc/fstab文件中定義的所有文件系統;
(5)檢測根文件系統,並以讀寫方式重新掛載根文件系統;(重新掛載是指根文件檢測完之後)
(6)設置系統時鐘;
(7)根據/etc/sysctl.conf文件來設置內核參數;
(8)激活lvm即軟raid設備;
(9)激活swap設備;
(10)加載額外設備的驅動程序;(內核加載驅動只加載根文件系統的)
(11)清理操作;
注意:在init配置文件:/etc/inittab中,有一行內容是定義/etc/rc.d/rc.sysinit,此腳本文件是負責完成系統初始化的腳本文件。
10.關閉/啓動對應級別下的服務
腳本文件/etc/rc.d/rc作用爲當級別切換時啓動或停止服務;此腳本接受傳遞的參數給腳本中$runlevel變量,然後,讀取/etc/rc$runlevel.d/K*和/etc/rc$runlevel.d/S*所有文件,這些文件就是爲什麼開機啓動後,有些服務會自動啓動,有些服務沒有啓動的原因。
K*:要停止的服務,K##*,優先級,數字越小,越優先關閉,依賴的服務先關閉,然後再關閉被依賴的。
S*:要啓動的服務,S##*,優先級,數字越小,越是優先啓動,被依賴的服務先啓動,而依賴的服務後啓動。
/etc/rc.d/init.d目錄還有個鏈接目錄爲/etc/init.d目錄,這兩目錄下文件相同。
11.啓動終端(圖形終端)
操作系統啓動完成
相關概念:
Linux系統的組成部分:內核+根文件系統
內核:進程管理、內存管理、網絡協議棧、文件系統、驅動程序。
IPC(Inter-Process Communication進程間通信):就是指多個進程之間相互通信,交換信息的方法。Linux IPC基本上都是從Unix平臺上繼承而來的。主要包括最初的Unix IPC,System V IPC以及基於Socket的IPC。另外,Linux也支持POSIX IPC。
運行中的系統環境可分爲兩層:內核空間、用戶空間;
內核空間:內核代碼(系統調用)
用戶空間:應用程序(進程或線程)
內核設計流派:
單內核設計:把所有的功能集成於同一個程序;(Linux)
微內核設計:每種功能都使用一個單獨的子系統實現;(Windows solarls)
Linux內核特點:
(1)支持模塊化:.KO(kernel object)
(2)支持模塊運動時動態裝載或卸載
組成部分:
核心文件:/boot/Vmliuz-VERSION-release
ramdirk:
CentOS5:/boot/initrd-VERSION-release.img
CentOS6,7:/boot/initramfs-VERSION-release.img