天天看點

CentOS系統啟動流程你懂否

一、Linux核心的組成

相關概念:

   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

二、CentOS系統啟動流程

總體啟動順序:

POST(加點自檢)-->Boot Sequence(BIOS:基本輸入輸出系統)-->Boot Loader(MBR:主引導記錄)-->Kernel(ramdisk)-->rootfs(根檔案系統)-->switchchroot-->/sbin/init/(/etc/inittab /etc/init/*.conf)-->設定運作級别-->系統初始化腳本-->關閉啟動相應服務-->啟動終端 

總流程圖:

<a href="http://s4.51cto.com/wyfs02/M00/88/8A/wKioL1f7WUOjyOZLAAF4YrmzKcY245.png" target="_blank"></a>

各流程細化說明: 

1、POST加電自檢  

主要是檢測硬體設别是否能正常的運作,然而實作自檢功能主要是由鑲嵌在主機闆晶片(CMOS)上的BIOS(basic input output system)程式,檢測沒問題之後進行硬體裝置的初始化。   

2、Boot Sequence(啟動管理程式):選擇啟動順序加載MBR

Boot Sequence是一個程式,它依賴于某個硬碟硬體,準确的說是第一個硬碟扇區的MBR,進而按次序查找各引導裝置。

3、MBR引導,bootloader引導加載器,啟動程式   

MBR(Master Boot Record):此記錄在0磁道1扇區,總共為512位元組,前446位元組為bootloder,後64位元組為分區表資訊,主分區加上擴充分區不能大于四個,最後2個位元組為校驗資訊,為55AA。提供一個菜單,允許使用者選擇要啟動的系統或不同的核心版本;把使用者標明的核心裝載到RAM中的特定空間中,解壓、展開,而後把系統控制權移交給核心。

4、kernel核心實作  

kernel自身初始化,實作功能,借助ramdisk探測可識别的程式,以自讀方式挂載根檔案系統,運作應用程式:/sbin/init

5、/sbin/init/管理使用者空間服務程序     

設定運作級别,進行初始化腳本,關閉或啟動相應的程式,啟動終端。  

GRUB(GRand Unified Bootloader)加載核心,就是MBR中的前 446 個位元組,是BooTLoader的一種,它的作用是要選擇要啟動的核心。  

GRUB相關說明: 

示範:

………………………………………………………………………………………………………………………

<a href="http://s1.51cto.com/wyfs02/M01/86/81/wKiom1fBSmDiNqIKAACmJQfPUoI324.png" target="_blank"></a>

主要是由device.map,menulst,stage1,stage2,以及一系列的stage1_5組成。

device.map:存放的是核心檔案的根分區

menu.lis:為菜單清單,裡面為可選擇的菜單清單,存放于stage2中。

stage:用于grub引導程式過大,是以分2段引導,第一段存放在MBR中,第二段存放于核心檔案系統中,第一段引導完成後可以找到第二段。 但是,第二段是存放于核心檔案系統中的,此時還沒有格式化檔案系統,如何可以通路到第二段的menu.lst,就需要借助于中間層 stage1_5,有它來協助 stage1 段來通路stage2階段。stage1_5通常位于stage1 字段後的 63 個扇區。 由于stage2 在記憶體中存放可以使用的檔案系統不确定,是以這就是有多個stage1_5 的原因。

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)為菜單通過了保護機制。

/boot/grub/grub.conf配置檔案詳解:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

<code>[root@centos6 grub]</code><code># ll /etc/grub.conf #/etc/grub.conf /boot/grub/grub.conf為連接配接檔案</code>

<code>lrwxrwxrwx. 1 root root 22 8月  11 03:29 </code><code>/etc/grub</code><code>.conf -&gt; ..</code><code>/boot/grub/grub</code><code>.conf</code>

<code>[root@centos6 grub]</code><code># cat /boot/grub/grub.conf</code>

<code># grub.conf generated by anaconda</code>

<code>#</code>

<code># Note that you do not have to rerun grub after making changes to this file</code>

<code># NOTICE:  You have a /boot partition.  This means that</code>

<code>#          all kernel and initrd paths are relative to /boot/, eg.</code>

<code>#          root (hd0,0)</code>

<code>#          kernel /vmlinuz-version ro root=/dev/sda2</code>

<code>#          initrd /initrd-[generic-]version.img</code>

<code>#boot=/dev/sda</code>

<code>default=0 </code><code>#設定預設啟動菜單項,預設為0開始</code>

<code>timeout=5 </code><code>#指定菜單等待選擇的時長 </code>

<code>splashimage=(hd0,0)</code><code>/grub/splash</code><code>.xpm.gz </code><code>#指定菜單的背景圖檔的路徑,為xpm格式,采用gzip壓縮</code>

<code>hiddenmenu </code><code>#是否影藏菜單</code>

<code>password [--md5] $1$JO0kw$z.qtBMH.KL4A6qZ7dK4N30 </code><code>#菜單編輯認證</code>

<code>title CentOS 6 (2.6.32-642.el6.x86_64) </code><code>#定義菜單項</code>

<code>root (hd0,0) </code><code>#本次grub查找stage2及其kernel檔案所在裝置分區,指定grub的根</code>

<code>kernel </code><code>/vmlinuz-2</code><code>.6.32-642.el6.x86_64 ro root=UUID=240533cf-b37f-4460-974f-702bab867da5 nomodeset rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_MD crashkernel=auto LANG=zh_CN.UTF-8 rd_NO_LVM rd_NO_DM rhgb quiet </code><code>#需要啟動的核心 </code>

<code>initrd </code><code>/initramfs-2</code><code>.6.32-642.el6.x86_64.img </code><code>#核心比對的ramfs檔案 </code>

<code>password [--md5] STRING </code><code>#啟動核心標明的核心或作業系統是進行的認證 </code>

<code>[root@centos6 grub]</code><code>#</code>

進入單使用者模式: 

1)編輯grub菜單,標明要編輯的title,而後使用e指令  

2)在標明的kernel後附加1 ,s 或single  

3)在kernel所在的行,鍵入b鍵      

啟動時按e鍵:

<a href="http://s5.51cto.com/wyfs02/M02/86/81/wKiom1fBU9KhOcy-AAAVA9be50E567.png" target="_blank"></a>

上下選擇到kernel後按e編輯輸入1或s、S、single,再次按b鍵重新開機

<a href="http://s3.51cto.com/wyfs02/M01/86/81/wKiom1fBU-XyJI1IAAAbQFijglU724.png" target="_blank"></a>

6、根切換

  在挂載根檔案系統時為了避免核心中有bug或操作過程中有bug導緻根檔案系統被損壞,先隻讀挂載根檔案系統,加載完成後才讀寫挂載,完成整個挂載根檔案系統後,直接去找/sbin/init程式,即開始運作使用者空間的第一個程式。

使用者空間啟動流程

7、/sbin/init程式

  init程式主要依賴于配置檔案:/etc/inittab,大體分為:設定預設啟動級别 --&gt; 設定系統初始化腳本 --&gt; 啟動對應級别的服務 --&gt; 列印各終端登入界面(如果級别為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:具體任務;通常為應用程式,或腳本,或二進制的程式,取決于自定義。

<a href="http://s2.51cto.com/wyfs02/M00/86/81/wKiom1fBWlCAjqwZAAAje_ZtNxM265.png" target="_blank"></a>

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目錄,這兩目錄下檔案相同。

如上訴定義将會啟動3級别下的以S打頭的程序:

<a href="http://s2.51cto.com/wyfs02/M00/86/81/wKioL1fBWOTzdvdjAABC2YKwDAQ085.png" target="_blank"></a>

11、啟動終端(圖形終端)

 作業系統啟動完成

三、系統啟動流程總結。

核心級别:

1.POST做開機啟動時候的硬體檢測功能

2.BootSequence(BIOS)啟動加載主引導分區MBR中的引導加載器程式BootLoader

   在LInux現行的BootLoader是三段劃分(打破446位元組限制)的GRUB程式,

    第1段寫在BootLoader中

    第1.5段在其後扇區用于檔案系統的引導

    第2段在boot/grub中提供内部接口和調用系統核心kernel

3.Kernel識别硬體、加載驅動、隻讀挂載根檔案系統、同時傳遞給使用者空間第一個程式/sbin/init

此處特别要注意,系統發行商為了适應多種硬體接口驅動調用,會在第一次安裝系統時候,自動識别硬體接口,并調用唯一驅動程式來生成ramdisk檔案,以記憶體當磁盤做虛根,驅動接口後會切換到真實的根檔案系統上

CentOS 5系列是initrd,當磁盤映像檔案會造成二次緩存緩沖

CentOS 6/7系列改進為initramfs,以檔案系統形式可以不二次占用緩存和緩沖

使用者空間級别

4./sbin/init接管後更具其配置檔案來初始化

5.根據/sbin/init中的配置會設定預設運作級别,以及一些在/etc/init.d/設定的開機服務

6./etc/rc.d/rc.sysinit運作系統初始化腳本,完成系統初始化

7.關閉對應級别下需要停止的服務,啟動對應級别下需要開啟的服務

8.設定登入終端

本文轉自chengong1013 51CTO部落格,原文連結:http://blog.51cto.com/purify/1843124,如需轉載請自行聯系原作者

繼續閱讀