CentOS系統啓動流程

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

      

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章