天天看點

啟動流程

引導裝載程式可以指定使用哪一個核心檔案來啟動,并實際加載核心到記憶體當中解壓縮與執行,此時核心就能夠開始在記憶體内活動,并檢測所有硬體資訊與加載适當的驅動程式來使主機開始運作。 

簡單來說:

加載BIOS的硬體資訊與進行自我測試,并依據設定取得第一個可啟動裝置;

讀取并執行第一個啟動裝置内MBR(主引導分區)的Boot Loader(即是gurb等程式);

依據Boot Loader的設定加載Kernel,Kernel會開始檢測硬體與加載驅動程式;

在硬體驅動成功後,Kernel會主動調用init程序(/sbin/init),而init會取得runlevel資訊;

init執行/etc/rc.d/rc.sysinit檔案來準備軟體的操作環境(如網絡、時區等);

init執行runlevel的各個服務的啟動(script方式);

init執行/etc/rc.d/rc.local檔案;

init執行終端機模拟程式mingetty來啟動login程式,最後等待使用者登入。

BIOS(Basic Input Output System)加載完硬體資訊後,進行開機自檢,然後開始執行硬體檢測的初始化,并配置PnP裝置,之後再定義出可啟動的裝置順序,接下來開始進行啟動裝置的資料讀取。

MBR(Master Boot Record,主引導分區)。每塊硬碟的第一個扇區内含有446 Bytes的MBR區域。如果主機上有多塊硬碟,系統會依據BIOS的設定,選擇某塊硬碟的MBR讀取引導裝載程式。 

系統的MBR指的是第一個啟動裝置的MBR。

當通過Boot Loader的管理而開始讀取核心檔案後,接下來,Linux就會将核心解壓縮到記憶體當中,并利用核心的功能開始測試與驅動各個周邊裝置,包括儲存設備、CPU、網卡、聲霸卡等。此時Linux核心會以自己的功能重新檢測一次硬體,而不一定會使用BIOS檢測到的硬體資訊。也就是說核心此時才開始接管BIOS後的工作。 

核心檔案一般放再/boot裡面。

在核心加載完畢之後進行完硬體檢測與驅動程式加載後,此時你的主機硬體應該已經準備就緒了,此時核心會主動調用第一個程序/sbin/init。 

/sbin/init最主要的功能就是準備軟體執行的環境,包括系統的主機名、網絡設定、語系處理、檔案系統格式以及其他服務的啟動等。而所有的操作都會通過init的配置檔案,即是/etc/inittab來規劃,而inittab内還有一個很重要的設定選項,runlevel。

/etc/inittab中<code>si::sysinit:/etc/rc.d/rc.sysinit</code>,這表示開始加載各項系統服務之前,得先設定好整個系統環境,主要是利用/etc/rc.d/rc.sysinit這個shell腳本來設定好系統的環境。

啟動系統服務/etc/rc.d/rc。 

相關啟動配置檔案/etc/sysconfig。 

加載核心讓整個系統準備接受指令來工作,再經過/etc/rc.d/rc.sysinit的系統子產品與相關硬體資訊的初始化後,我們還需要啟動系統所需的各項服務,這樣主機才能提供我們相關的網絡或主機功能。 

依據/etc/inittab中runlevel的設定值來決定啟動的服務選項。

下面是各個runlevel服務啟動的各項腳本放置處。 

/etc/inittab中:

格式: 

id:runlevel:action:process

對/etc/rc.d/rc 3解釋:

由/etc/rc.d/rc 3可以取得/etc/rc3.d/這個目錄來準備處理相關的腳本程式;

找到/etc/rc3.d/K??*開始的檔案,并進行“/etc/rc3.d/K??*stop操作”;

找到/etc/rc3.d/S??*開始的檔案,并進行“/etc/rc3.d/S??*start操作”;

啟動流程

根據上圖我們可以發現全是連接配接檔案,連接配接到服務啟動目錄/etc/init.d/去。

有任何想要在啟動時就進行的工作,直接将它寫入/etc/rc.d/rc.local,那麼該工作就會在啟動的時候被自動加載,而不必等到登入系統後去啟動。

在完成了系統所有服務的啟動後,接下來Linux就會啟動終端機來等待使用者登入。

/etc/inittab中

  (1)POST加電自檢

    POST(PowerOnSelfTest)首先對每一個裝置進行檢查。完成後會交給BIOS尋找存有引導記錄的裝置,找到後讀入作業系統引導記錄,然後将系統控制權交給引導記錄,并由引導記錄來完成系統的順利啟動。

  (2)MBR引導

    MBR(Master Boot Record) MBR記錄一般是在磁盤 0 磁道 1 扇區,共512個位元組。前446個位元組是BootLoder,後 4*16 的 64 個位元組是存放分區資訊的,最後 2 個位元組是校驗資訊,一般是 55AA。

  (3)GRUB(GRand Unified Bootloader)、加載核心

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

  (4)kernel

    Linux屬于單核系統:Kernel+各種外圍子產品組成。通過grub加載核心後(有可能會借助于ramdisk加載驅動),核心開始自我解壓并工作通過虛拟根檔案系統initrfs 調用init工作。

    ramdisk:核心中的特性之一:使用緩沖和緩存來回事對磁盤上的檔案通路;

    CentOS 5: initrd,  工具程式:mkinitrd

CentOS 6: initramfs, 工具程式:mkinitrd, dracut

  (5)啟動init程式(/sbin/init)

    init程式的類型:

    SysV: init, CentOS 5

  配置檔案:/etc/inittab

Upstart: init, CentOS 6

  配置檔案:/etc/inittab, /etc/init/*.conf

        Systemd:systemd, CentOS 7

          配置檔案:/usr/lib/systemd/system, /etc/systemd/system

   /sbin/init程式有0-6,七個級别

   0:關機

    1:單使用者模式(root, 無須登入), single, 維護模式;

    2: 多使用者模式,會啟動網絡功能,但不會啟動NFS;維護模式;

    3:多使用者模式,正常模式;文本界面;

    4:預留級别;可同3級别;

    5:多使用者模式,正常模式;圖形界面;

    6:重新開機

    預設級别為3,5,配置檔案是/etc/inittab

每一行定義一種action以及與之對應的process

配置檔案中四個字段的定義:id:runlevel:action:process

   action:(action的選項)

    wait: 切換至此級别運作一次;

    respawn:此process終止,就重新啟動之;

    initdefault:設定預設運作級别;process省略;

    sysinit:設定系統初始化方式,此處一般為指定/etc/rc.d/rc.sysinit;

 init程式啟動以後首先運作腳本/etc/inittab來讀取級别,如果你指定級别,就按指定級别運作,不是就是用預設的3級别;

 然後運作/etc/rc.d/rc.sysinit這來初始化腳本;

運作完後會執行/etc/rc.d/rc#.d

    /etc/rc.d 目錄中存放着123456運作級别的目錄,

<a href="http://s3.51cto.com/wyfs02/M00/72/9B/wKioL1XpODvg1YuKAAKhUM6KesU599.jpg" target="_blank"></a>

每一個rc#.d裡都包含很多K或S開頭的檔案這些都是連結檔案,這些檔案代表這個級别需要啟動和關閉的服務,K開頭表示需要關閉的服務,S開頭表示需要關閉的服務

    K*: K##*:##運作次序;數字越小,越先運作;數字越小的服務,通常為依賴到别的服務;

      S*: S##*:##運作次序;數字越小,越先運作;數字越小的服務,通常為被依賴到的服務;

    chkconfig指令:檢視和管理每個級别下的服務的狀态

        檢視服務在所有級别的啟動或關閉設定情形:

        chkconfig [--list] [name]或者直接chkconfig

<a href="http://s3.51cto.com/wyfs02/M00/72/9F/wKiom1XpODzxVvjLAATxy9TiRWA802.jpg" target="_blank"></a>

        添加:  chkconfig --add name  可以将自己寫的一些腳本,讓此指令統一管理

    這條指令是在每個級别裡面建立對應的K或S開頭的檔案,建立什麼類型的檔案要根據/etc/rc.d/init.d (/etc/init.d)的配置檔案

我們測試一下,編輯一個配置檔案/etc/rc.d/init.d/testsrv

<a href="http://s3.51cto.com/wyfs02/M00/72/9B/wKioL1XpQHbw9txtAADFu_eK2SM143.jpg" target="_blank"></a>

<a href="http://s3.51cto.com/wyfs02/M00/72/9F/wKiom1XpPlKQj1BmAAGDYl3NfGE470.jpg" target="_blank"></a>

        删除:  chkconfig --del name 服務不由chkconfig這種機制來管理

      修改指定的連結類型:

        chkconfig [--level levels] name &lt;on|off|reset&gt;

            --level LLLL: 指定要設定的級别;省略時表示2345

<a href="http://s3.51cto.com/wyfs02/M02/72/9F/wKiom1XpP5PBawHcAAL0p97WxS4593.jpg" target="_blank"></a>

使用這個指令修改下chkconfig --level 45 testsrv off

<a href="http://s3.51cto.com/wyfs02/M02/72/9B/wKioL1XpQerAvdXcAAItqhG_HnA203.jpg" target="_blank"></a>

    前面執行完了,會執行/etc/rc.d/rc.local腳本,此腳本是啟動過程中最後啟動的一個腳本。

       是以不便或不需寫為服務腳本放置于/etc/rc.d/init.d/目錄,且又想開機時自動運作的指令可以放在/etc/rc.d/rc.local中

    最後會執行 /bin/login 登入使用者。至此系統啟動過程完成

      本文轉自Vincent一馬 51CTO部落格,原文連結:http://blog.51cto.com/mazhenbo/1951034,如需轉載請自行聯系原作者

繼續閱讀