linux啟動流程 (centos6,centos7)

毛毛℡18118881138發表於2020-11-02

CentOS6 啟動流程
概述
  理解作業系統開機引導和啟動過程對於配置作業系統和解決相關啟動問題是至關重要的。本文結合網際網路上各類資料,做一些總結,希望對大家有一些幫助。啟動流程總的劃分可以分為4個階段

POST加電自檢
引導裝載程式(GRUB)
核心(kernel)初始化
系統第一個程式初始化
1.POST加電自檢
  Power-On-Self-Test,加電自檢,是BIOS功能的一個主要部分。負責完成對CPU、主機板、記憶體、硬碟子系統、顯示子系統、串並行介面、鍵盤等硬體情況的檢測。

BIOS 上電自檢確認硬體的基本功能正常,然後產生一個 BIOS 中斷[3] INT 13H,該中斷指向某個接入的可引導裝置的引導扇區。它所找到的包含有效的引導記錄的第一個引導扇區將被裝載到記憶體中,並且控制權也將從引導扇區轉移到此段程式碼。BIOS的任務就完成了,此後將系統啟動的控制權移交到MBR部分的程式碼。

引導扇區是引導載入器真正的第一階段。大多數 Linux 發行版本使用的引導載入器有三種:GRUB、GRUB2 和 LILO。GRUB2 是最新的,也是相對於其他老的同類程式使用最廣泛的。

2.引導裝載程式(Bootloader)
我們首先來了解一下MBR,它是Master Boot Record的縮寫。硬碟的0柱面、0磁頭、1扇區稱為主引導扇區。它由三個部分組成,主載入程式(Bootloader)、 硬碟分割槽表DPT(Disk Partition table)和硬碟有效標誌(55AA)

GRUB(全稱是 GRand Unified BootLoader),是一個用於計算機尋找作業系統核心並載入其到記憶體的智慧程式。

GRUB主要包含三個階段:

1)stage1
  stage1是直接被寫入到MBR中去的,這樣機器一啟動檢測完硬體後,就將控制權交給了GRUB的程式碼。也就是上圖所看到的前446個位元組空間中存放的是stage1的程式碼。

由於引導記錄必須非常的小,它不可能非常智慧,且不能理解檔案系統結構。因此階段 1 的唯一功能就是定位並載入階段 1.5 的程式碼。為了完成此任務,階段 1.5 的程式碼必須位於引導記錄與裝置第一個分割槽之間的位置。在載入階段 1.5 程式碼進入記憶體後,控制權將由階段 1 轉移到階段 1.5。

2)stage1.5
  階段 1.5 的程式碼必須位於引導記錄與裝置第一個分割槽之間的位置。因為有更大的儲存空間用於階段 1.5,且該空間足夠容納一些通用的檔案系統驅動程式,如標準的 EXT 和其它的 Linux 檔案系統,如 FAT 和 NTFS 等。

3)stage2
  GRUB 階段 2 所有的檔案都已存放於 /boot/grub目錄及其幾個子目錄之下。該階段沒有一個類似於階段 1 與階段 1.5 的映象檔案。

GRUB 階段 2 的主要功能是根據/boot/grub/grub.conf定位和載入 Linux 核心到記憶體中,並轉移控制權到核心。核心的相關檔案位於 /boot 目錄下,這些核心檔案可以通過其檔名進行識別,其檔名均帶有字首 vmlinuz。你可以列出 /boot 目錄中的內容來檢視作業系統中當前已經安裝的核心。

預設情況下,GRUB 提供了一個已安裝核心的預引導選單,其中包括問題診斷選單(recuse)以及恢復選單(如果配置已經設定恢復映象)。

階段 2 載入選定的核心到記憶體中,並轉移控制權到核心程式碼。

3.kernel初始化
  核心檔案都是以一種自解壓的壓縮格式儲存以節省空間,它與一個初始化的記憶體映像和儲存裝置對映表都儲存於 /boot 目錄之下。

initrd(Initial RAM Disk),它在stage2這個步驟就被拷貝到了記憶體中,這個檔案是在安裝系統時產生的,是一個臨時的根檔案系統(rootfs)。因為Kernel為了精簡,只保留了最基本的模組,因此,Kernel上並沒有各種硬體的驅動程式,也就無法識rootfs所在的裝置,故產生了initrd這個檔案,該檔案裝載了必要的驅動模組,當Kernel啟動時,可以從initrd檔案中裝載驅動模組,直到掛載真正的rootfs,然後將initrd從記憶體中移除。

Kernel會以只讀方式掛載根檔案系統,當根檔案系統被掛載後,開始裝載第一個程式(使用者空間的程式),執行/sbin/init,之後就將控制權交接給了init程式。

探測可識別到的所有硬體裝置
載入硬體驅動程式(藉助於ramdisk載入驅動)
以只讀方式掛載根檔案系統
執行使用者空間的第一個應用程式:/sbin/init
4.初始化系統
1)/etc/inittab
核心被載入後,第一個執行的程式便是/sbin/init,該檔案會讀取/etc/inittab檔案(CentOS7已經不再使用),並依據此檔案來進行初始化工作。其實/etc/inittab檔案最主要的作用就是設定Linux的執行等級,其設定形式是“:id:5:initdefault:”,這就表明Linux需要執行在等級5上。

  1. /etc/rc.d/rc.sysinit
    執行系統初始化指令碼(/etc/rc.d/rc.sysinit),對系統進行基本的配置,以讀寫方式掛載根檔案系統及其它檔案系統,到此係統算是基本執行起來了,後面需要進行執行級別的確定及相應服務的啟動。

(1)獲取網路環境與主機型別。首先會讀取網路環境設定檔案"/etc/sysconfig/network",獲取主機名稱與預設閘道器等網路環境。

(2)測試與載入記憶體裝置/proc及usb裝置/sys。除了/proc外,系統會主動檢測是否有usb裝置,並主動載入usb驅動,嘗試載入usb檔案系統。

(3)決定是否啟動SELinux。

(4)介面裝置的檢測與即插即用(pnp)引數的測試。

(5)使用者自定義模組的載入。使用者可以再"/etc/sysconfig/modules/*.modules"加入自定義的模組,此時會載入到系統中。

(6)載入核心的相關設定。按"/etc/sysctl.conf"這個檔案的設定值配置功能。

(7)設定系統時間(clock)。

(8)設定終端的控制檯的字形。

(9)設定raid及LVM等硬碟功能。

(10)以方式檢視檢驗磁碟檔案系統。

(11)進行磁碟配額quota的轉換。

(12)重新以讀取模式載入系統磁碟。

(13)啟動quota功能。

(14)啟動系統隨機數裝置(產生隨機數功能)。

(15)清楚啟動過程中的臨時檔案。

(16)將啟動資訊載入到"/var/log/dmesg"檔案中。

  1. /etc/rc.d/rc指令碼
    3)執行/etc/rc.d/rc指令碼。該檔案定義了服務啟動的順序是先K後S,而具體的每個執行級別的服務狀態是放在/etc/rc.d/rc.d(=0~6)目錄下,所有的檔案均是指向/etc/init.d下相應檔案的符號連結。rc.sysinit通過分析/etc/inittab檔案來確定系統的啟動級別,然後才去執行/etc/rc.d/rc*.d下的檔案。

/etc/init.d-> /etc/rc.d/init.d

/etc/rc ->/etc/rc.d/rc

/etc/rc.d ->/etc/rc.d/rc.d

/etc/rc.local-> /etc/rc.d/rc.local

/etc/rc.sysinit-> /etc/rc.d/rc.sysinit

也就是說,/etc目錄下的init.d、rc、rc*.d、rc.local和rc.sysinit均是指向/etc/rc.d目錄下相應檔案和資料夾的符號連結。我們以啟動級別3為例來簡要說明一下。

/etc/rc.d/rc3.d目錄,該目錄下的內容全部都是以 S 或 K 開頭的連結檔案,都連結到"/etc/rc.d/init.d"目錄下的各種shell指令碼。S表示的是啟動時需要start的服務內容,K表示關機時需要關閉的服務內容。/etc/rc.d/rc.d中的系統服務會在系統後臺啟動,如果要對某個執行級別中的服務進行更具體的定製,通過chkconfig命令來操作,或者通過setup、ntsys、system-config-services來進行定製。如果我們需要自己增加啟動的內容,可以在init.d目錄中增加相關的shell指令碼,然後在rc.d目錄中建立連結檔案指向該shell指令碼。這些shell指令碼的啟動或結束順序是由S或K字母后面的數字決定,數字越小的指令碼越先執行。例如,/etc/rc.d/rc3.d /S01sysstat就比/etc/rc.d/rc3.d /S99local先執行。

4)/etc/rc.d/rc.local
執行使用者自定義載入程式/etc/rc.d/rc.local。其實當執行/etc/rc.d/rc3.d/S99local時,它就是在執行/etc/rc.d/rc.local。S99local是指向rc.local的符號連結。就是一般來說,自定義的程式不需要執行上面所說的繁瑣的建立shell增加連結檔案的步驟,只需要將命令放在rc.local裡面就可以了,這個shell指令碼就是保留給使用者自定義啟動內容的。

  1. /sbin/mingetty
    完成了系統所有的啟動任務後,linux會啟動終端或X-Window來等待使用者登入。tty1,tty2,tty3…這表示在執行等級1,2,3,4的時候,都會執行"/sbin/mingetty",而且執行了6個,所以linux會有6個純文字終端,mingetty就是啟動終端的命令。

CentOS6 啟動流程總結
1.POST:通電自檢,獲取第一個啟動裝置
2.讀取第一個啟動裝置MBR的引導載入程式(grub)的啟動資訊
3.載入核心作業系統的核心資訊,核心開始解壓縮,並嘗試驅動所有的硬體裝置(ramdisk)
4.啟動init程式,依據inittab檔案設定執行級別 (inittab用於定義預設執行級別)
5.init程式,執行/etc/rc.d/rc.sysinit檔案
6.分別執行/etc/init/rcS.conf、/etc/init/rc.conf、/etc/init/start-ttys.confl來呼叫命令執行/etc/rc#.d/檔案裡面定義的是各種服務的啟動指令碼,可以ls檢視,S開頭代表開機啟動的服務,K開頭的是關機要執行的任務。#代表數字,一個數字代表一個執行級別,共7個執行級別,這裡就不多說了
7.執行/etc/rc.d/rc.local
8.執行/sbin/mingetty程式,等待使用者登入
CentOS7 啟動流程
CentOS7啟動主要特點
CentOS7 的啟動流程主要步驟沒有很大的區別,主要是CentOS7開始,GRUB開始採用GRUB2版本,原來的init程式,改為了systemd,因此詳細解釋一下systemd後的啟動流程

systemd新特性:

系統引導時實現服務並行啟動
按需啟動守護程式
自動化的服務依賴關係管理
同時採用socket式與D-Bus匯流排式啟用服務
系統狀態快照
CentOS7 啟動流程
UEFi或BIOS初始化,執行POST開機自檢,選擇啟動裝置
引導導裝載程式, centos7是grub2,載入裝載程式的配置檔案:/etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg

載入initramfs驅動模組,載入核心選項,核心初始化,從initramfs根檔案系統切換到磁碟根目錄,centos7使用systemd代替init

systemd執行預設target配置。centos7表面有“執行級別”這個概念,實際是為了相容以前的系統,每個所謂“執行級別”都有對應的軟連線指向,預設的啟動級別/etc/systemd/system/default.target,根據它的指向可以找到系統要進入到哪個模式。
systemd執行sysinit.target
systemd啟動multi-user.target下的本機與伺服器服務
systemd執行multi-user.target下面的/etc/rc.d/rc.local
systemd執行multi-user.target下的getty.target及登入服務
### Centos5、Centos6、Centos7服務啟動的區別

Sysvinit技術:按照一定順序執行——>啟動太慢。(Centos5)

Upstart技術:Upstart對rc.sysinit指令碼做了大量的優化,縮短了系統初始化的啟動時間。(Centos6)

Systemd技術:克服sysvinit固有的缺點,採用並行技術,提高系統的啟動速度(RedHat7,CentOS7,Ubuntu15等)

總結和經驗
轉載於:https://blog.51cto.com/14322522/2410183

相關文章