CentOS系統啟動流程:(以CentOS 5為例說明)
POST --> Boot Sequence(BIOS) --> Boot Loader(MBR) --> kernel(ramdisk) --> rootfs(readonly) --> switchroot --> /sbin/init(CentOS 5,6,7不同) --> 設定預設運作級别 --> 系統初始化腳本 --> 關閉啟動對應級别下的服務 --> 啟動終端(圖形終端)--> 作業系統啟動完成
系統初始化流程(核心級别):
1.POST:加電自檢
開機加電後,系統自檢硬體裝置包括cpu、記憶體、硬碟、顯示裝置等,這個過程叫加電自檢POST;一旦通電會
自動讀取ROM有個帶電晶片CMOS程式并運作即按次序查找可引導裝置,第一個有引導程式的裝置即為本次啟動要用到的裝置;引導程式叫bootloader引導加載器。
2.BIOS:第一順序啟動的裝置
ROM中的資訊一旦寫入就不能進行修改,其資訊斷電之後也仍然保留。而CMOS是微機主機闆上的一塊可讀寫的RAM晶片斷電以後儲存在上面的資料會自動消失,需要主機闆電池供電;對CMOS中各項參數的設定要通過專門的程式,現在廠家将CMOS設定程式做到了BIOS晶片中,是以CMOS設定又通常叫做BIOS設定。BIOS(基本輸入輸出系統)也是固化在目前主機ROM晶片中的代碼,實作按次序查找各引導裝置,第一個有引導程式的裝置即為本次啟動要用到的裝置
。
3.Bootloader:引導加載程式啟動核心
bootloader引導程式的功能:
提供一個菜單,允許使用者選擇要啟動的系統或不同的核心版本,把使用者標明多核心裝載到RAM(記憶體)中的特點空間中,解壓、展開,而後把整個系統控制權移交給核心,即完成把核心加載到記憶體空間中。
Bootloader引導加載器是安裝在硬碟或CD光牒甚至是U盤上的程式,系統加電後運作的第一段軟體代碼。Bootloader引導加載程式位于磁盤中的MBR中,每個磁盤或每個磁盤中的分區中都有MBRMBR是磁盤上的第一個扇區又叫做主引導扇區,是計算機開機後通路硬碟時所必須要讀取的首個扇區,分三部分:
MBR:Master Boot Record(主引導記錄)
512bytes:
446bytes:bootloader(引導程式)
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
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的功用:
第一:提供菜單或互動式接口;
第二:能加載使用者選擇的核心或作業系統;
第三:為菜單通過了保護機制。
4.加載kernel(ramdisk)
通過grub加載到核心後,就在記憶體中解壓并展開就可完成後續操作即核心自身初始化;分為四步:
第一:探測可識别的所有硬體裝置
第二:加載硬體驅動程式;(有可能會借助于randisk加載驅動)
第三:以隻讀方式挂載根檔案系統
第四:運作使用者空間的第一個應用程式:/sbin/init
其中有可能會借助于randisk加載驅動,ramdisk:是基于記憶體的磁盤裝置
如果核心把已知根檔案系統所在的磁盤裝置驅動程式編譯進核心(一般自己編譯核心含此驅動),此時就不需要這個ramdisk,是以發行商提供的安裝系統檔案不可能包含所有驅動在核心中。
這樣,要想加載根檔案系統,就要先加載根檔案系統所在的磁盤裝置驅動,而驅動就在根上是以,就不能依賴于根上的驅動程式來加載根檔案系統;要借助于ramdisk臨時根檔案系統來加載根檔案系統所在的磁盤裝置驅動,進而加載根檔案系統;
ramdisk臨時根檔案系統不是作業系統發行商直接在CD光牒上自帶的,而是在安裝作業系統後臨時生成的,它在安裝作業系統後,能掃描目前主機硬碟裝置的型号,并找到相關驅動做成一個臨時根;是以這個臨時根是為每個使用者安裝過程生成以後動态建立的。
ramdisk臨時根是把記憶體某段空間當做磁盤使用,而Linux核心特性是使用緩沖和緩存來加速對磁盤上的檔案通路,這就是為什麼在centos5上使用ramdisk(initrd),在後來的centos6,7上使用的ramfs的原因,避免了在記憶體中的雙緩沖和雙緩存。
5.挂載根檔案系統
一旦核心借助于ramdisk提供的臨時根完成加載真正的根檔案系統所在的裝置,下一步就裝載根檔案系統,核心會自動把根檔案系統所在的裝置挂載至根上,是以說根是在核心中就是這個原因所在。
6.根切換
在挂載根檔案系統時為了避免核心中有bug或操作過程中有bug導緻根檔案系統被損壞,先隻讀挂載根檔案系統,加載完成後才讀寫挂載,完成整個挂載根檔案系統後,直接去找/sbin/init程式,即開始運作使用者空間的第一個程式。
使用者空間啟動流程
7./sbin/init程式
init程式主要依賴于配置檔案:/etc/inittab,大體分為:設定預設啟動級别 --> 設定系統初始化腳本 --> 啟動對應級别的服務 --> 列印各終端登入界面(如果級别為3處理提供文本登入界面,如果級别為5還提供圖形登入界面)
8. 設定預設運作級别
運作級别:為了系統的運作或維護等目的而設定的機制;
0-6:共7個級别;
0:關機,shutdown
1:單使用者模式(single user),root使用者,無須認證,維護模式;
2:多使用者模式(multi user),會啟動網絡功能,但不會啟動NFS,維護模式;
3:多使用者模式(multi user),完全功能模式,文本界面;
4:預留級别:目前無特别使用目的,但習慣以同3級别功能使用;
5:多使用者模式(multi user),完全功能模式,圖形界面;
6:重新開機,reboot
即在配置檔案:/etc/inittab定義了很多功能,每一行定義一種操作(action)以及與之對應的process(僅适用于CentOS 5),一行就定義了init要執行的任務,甚至是一堆任務,每一行的文法格式為:
id:runlevels:action:process
id為一個任務的辨別符;
runlevels:在哪些運作級别下啟動此任務;3,2345,也可為空表所有級别;
action:在什麼條件下啟動此任務;
wait:等待切換至此任務所在的級别時執行一次;
respawn:一旦此任務終止時,就自動重新開機;
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.啟動終端(圖形終端)
作業系統啟動完成
本文轉自 crystaleone 51CTO部落格,原文連結:http://blog.51cto.com/linsj/1760006,如需轉載請自行聯系原作者