centos系列的啟動流程及基礎知識點

weixin_34127717發表於2017-11-14

下面介紹的是基於Intel x86架構的CentOS系列作業系統的啟動流程。


1、Linux系統基礎簡介

(1)、Linux【系統組成】:核心+應用程式 或 核心+rootfs

(2)、Linux的【執行環境】:核心空間 --------核心程式佔用CPU和記憶體資源總和

                            使用者空間 --------應用程式佔用CPU和記憶體資源總和

(3)、【核心】主要具有6個【功能】:程式管理、檔案系統管理、記憶體管理、網路協議管理、驅動管理、記憶體功能。

  對於核心,有兩種設計:單核心、微核心。單核心,是所有功能聚集於一個程式,表現為一個程式。微核心,是所有功能都有單獨的子系統。對於Linux系統,採用的是單核心、模組化設計。


(4)、Linux核心的三部分:核心核心檔案、核心物件檔案、ramdisk

 Linux的【核心檔案】 ----------/boot/vmlinuz

 核心【模組檔案】 --------/lib/moduls/2.6.32-573.el6.x86_64/kernel

 ramdisk ------------/boot/initramfs-2.6.32-573.el6.x86_64.img  (其以.img結尾)

   centos5的ramdisk 為 /boot/initrd -----------用mkinitrd 工具生成

   centos6/7的ramdisk 為 /boot/initramfs -------用dacut 工具生成(限於7使用),但也相容mkinitrd

 ramdisk 是雙緩衝和雙快取。


2、CentOS6 作業系統啟動流程

(1)、POST加電自檢

    加電自檢中,運用ROM中的BIOS程式。主機板上ROM中儲存的BIOS程式,被主機板晶片對映入記憶體,從而協助CPU完成。

(2)、Bootsequence啟動程式

    據BIOS找啟動程式,找第一個載入程式。根據BIOS的啟動順序,一次訪問各個儲存裝置,檢查其MBR中是否有載入程式,如果有則將載入程式載入至記憶體,並且將硬體的管理權移交給載入程式。

(3)、引導載入器BootLoader

    一般使用MBR中的grub,應用grub載入檔案系統,grub能提供一個使用者選單,命令列介面互動操作。-----------應用grub legacy。

    載入程式grub,開始載入stage1.5,以驅動根檔案系統,然後從根裝置載入stage2至記憶體,stage2的程式碼將會從同一磁碟分割槽載入kernel至記憶體,同時將硬體的管理權移交給kernel

(4)、載入核心kernel ----------------核心核心檔案放在【基本分割槽】上

    對核心進行初始化,載入硬體的驅動程式。

    kernel試圖掛載根檔案系統,如果其內部有直接編譯成核心的檔案系統驅動程式,則無需其他輔助直接以只讀方式掛載根檔案系統即可,否則,必須依賴於ramdisk提供的臨時根檔案系統作為過渡,待根檔案系統驅動成功以後,完成切換的工作,以只讀方式掛載真正的檔案系統。

(5)、載入根檔案系統rootfs -----以只讀的方式掛載根檔案系統。

    如果沒有驅動,藉助於ramdisk載入驅動。

(6)、執行使用者空間的第一個應用程式: /sbin/init。

  CentOS 6的Init程式為:upstart(基於事務驅動)。

  配置檔案:/etc/inittab ----------僅定義預設執行級別

            /etc/init/*.conf --------rcS.conf(系統初始化指令碼); rc.conf(執行級別關閉或開啟系統服務的任務); start-ttys.conf(終端相關的任務); prefdm.conf(圖形介面的任務)。

(7)、設定預設執行級別 ----------/etc/inittab

(8)、系統初始化 ------------/etc/init/*.conf

(9)、並行執行任務:定義ctrl+alt+del熱鍵功能;關閉對應級別下應停止的服務,開啟對應級別下應開啟的服務;電源管理;dbus管理等。根據執行級別,選擇開啟的終端數量及位置。

(10)、登入提示符

  使用mingetty命令來呼叫login命令,來為使用者列印登入提示符。



3、CentOS5基礎

(1)、CentOS基礎

  CentOS5的7個執行級別為0-6,0為關機、6為重啟、1為單使用者模式、2-5為多使用者模式,3為多使用者的命令列介面,5為多使用者的圖形化介面。

  

  檢視執行級別:# who -r 或 # runlevel

  切換執行級別:# init 0-6


  CentOS5的第一個引用程式為Init,其配置檔案為/etc/inittab。配置檔案指明系統初始化的任務

  執行【規定的任務】,格式為:id:runlevels:action:process。 action表示啟動此任務,通常為sysinit,一般是執行/etc/rc.d/rc.sysinit指令碼。所有由rc指令碼關閉或啟動的連結檔案的原始檔都在/etc/rc.d/init.d,該目錄建立了連結/etc/init.d。

  在init引導啟動使用者空間程式時,不需要寫在系統服務中的內容,寫在/etc/rc.d/rc.local指令碼中。


(2)、chkconfig命令

  chkconfig命令 ------------檢視和管理系統服務的執行狀態。

    # chkconfig --list [name]

    # chkconfig --add name

    # chkconfig --del name

  修改/etc/rc.d/rc#.d/,管理系統服務。例如:# chkconfig: 2345 90 60 (其中,2345為執行級別,90為開啟的優先順序,60為關閉的優先順序。)

  單獨制定系統服務開啟或關閉:# chkconfig [--level levels] name <on|off|reset>

  在init引導啟動使用者空間程式時,不需要寫在系統服務中的內容,寫在/etc/rc.d/rc.local指令碼中。


(3)CentOS5作業系統的啟動流程

    1)、POST加電自檢

      加電自檢中,運用ROM中的BIOS程式。主機板上ROM中儲存的BIOS程式,被主機板晶片對映入記憶體,從而協助CPU完成。

    2)、Bootsequence啟動程式

      據BIOS找啟動程式,找第一個載入程式。根據BIOS的啟動順序,一次訪問各個儲存裝置,檢查其MBR中是否有載入程式,如果有則將載入程式載入至記憶體,並且將硬體的管理權移交給載入程式。

    3)、引導載入器BootLoader

      一般使用MBR中的grub,應用grub載入檔案系統,grub能提供一個使用者選單,命令列介面互動操作。-----------應用grub legacy。

      載入程式grub,開始載入stage1.5,以驅動根檔案系統,然後從根裝置載入stage2至記憶體,stage2的程式碼將會從同一磁碟分割槽載入kernel至記憶體,同時將硬體的管理權移交給kernel

    4)、載入核心kernel ----------------核心核心檔案放在【基本分割槽】上

      對核心進行初始化,載入硬體的驅動程式。

      kernel試圖掛載根檔案系統,如果其內部有直接編譯成核心的檔案系統驅動程式,則無需其他輔助直接以只讀方式掛載根檔案系統即可,否則,必須依賴於ramdisk提供的臨時根檔案系統作為過渡,待根檔案系統驅動成功以後,完成切換的工作,以只讀方式掛載真正的檔案系統。

    5)、載入根檔案系統rootfs -----以只讀的方式掛載根檔案系統。

      如果沒有驅動,藉助於ramdisk載入驅動。

    6)、執行使用者空間的第一個應用程式: /sbin/init。

      kernel試圖啟動第一個程式:/sbin/init,而後kernel轉入後臺,將使用者空間的程式管理任務交給init程式來完成

      配置檔案:/etc/inittab  /etc/init/*.conf  /etc/rc.d/rc.sysinit  /etc/rc.d/rc

    7)、執行/sbin/init 和 /etc/inittab檔案

    8)、設定預設的執行級別

    9)、執行/etc/rc.d/rc.sysinit指令碼,完成系統初始化

    10)、執行/etc/rc.d/rc指令碼,關閉對應級別下應停止的服務,開啟對應級別下應開啟的服務

    11)、設定熱鍵,如:Ctrl+Alt+Del熱鍵功能

    12)、UPS電源的失效與恢復

    13)、生成終端,預設啟動圖形介面。


4、Bootloader

 grub通用統一載入器有兩種,即grub legacy和grub2。

 grub legacy分為三個階段,分別是第一階段、第二階段和中間的1.5階段。中間階段的作用是,讓第一階段的載入程式識別第二階段分割槽的檔案系統。stage2提供了很多功能,其中最重要的是載入作業系統的核心核心檔案,還可以提供選單和互動介面、允許使用者編輯選單、命令列操作模式、具身份驗證機制。

 

 grub命令列常用的6個命令如下:

  1)、help:獲得grub命令的名稱列表

  2)、help GRUB_CMD:特定命令的詳細幫助資訊

  3)、root (hd#,#):指定grub程式的根裝置(磁碟的指定分割槽)。hd# 為磁碟編號,# 為分割槽編號,# 一般是從0開始的數字,如0表示第一個分割槽,如 (hd0,0),表示當前計算機上的第一塊磁碟的第一個分割槽。

  4)、find (hd#,#):指定分割槽中搜尋檔案,顯示出檔案所在的位置

  5)、kernel /PATH/TO/KERNEL_CORE_FILE:本次啟動的核心檔案的絕對路徑。額外核心引數:ro root=/dev/sda3 selinux=0 init=/sbin/init quiet rhgb {1|s|S|single}

  6)、initrd /PATH/TO/initramfs-VERSION-release.img:核心所對應的ramdisk(ramfs)檔案


 grub的配置檔案為 /boot/grub/grub.conf 和 /etc/grub.conf(連結)。配置檔案裡的內容如下:

   default=0 ------預設啟動選單項,title是從0開始編號

   timeout=5 ------倒數計時

   splashimage=(hd0,0)/grub/splash.xpm.gz -----圖片背景

   hiddenmenu ------------(是否)隱藏grub的啟動選單

   password --md5 CRYPTED_PASSWORD ------------選單的保護密碼

   title CentOS 6 (2.6.32-573.el6.x86_64) ------選單標題,可多個title

     root (hd0,0)

     kernel /vmlinuz-2.6.32-573.el6.x86_64 ro root=UUID=5ebb0e76-bb19-4a80-9c70-0d101c0778e1 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

     initrd /initramfs-2.6.32-573.el6.x86_64.img

     password --md5 CRYPTED_PASSWORD


5、CentSO7 作業系統啟動流程

(1)、POST加電自檢

    加電自檢中,運用ROM中的BIOS程式。主機板上ROM中儲存的BIOS程式,被主機板晶片對映入記憶體,從而協助CPU完成。

(2)、Bootsequence啟動程式

    據BIOS找啟動程式,找第一個載入程式。根據BIOS的啟動順序,一次訪問各個儲存裝置,檢查其MBR中是否有載入程式,如果有則將載入程式載入至記憶體,並且將硬體的管理權移交給載入程式。

(3)、引導載入器BootLoader

  一般使用MBR中的grub2,應用grub2載入檔案系統,grub2能提供一個使用者選單,命令列介面互動操作。

(4)、裝載載入程式的配置檔案:/etc/grub.d /etc/default/grub /boot/grub2/grub.cfg

(5)、載入initramfs驅動模組

(6)、載入核心kernel ----------------核心核心檔案放在【基本分割槽】上

  對核心進行初始化,載入硬體的驅動程式。

(7)、核心以只讀方式掛載rootfs,啟動systemd程式。

(8)、執行initrd.*.target所有的unit,包括掛載/etc/fstab所有有效的檔案系統

(9)、根切換

(10)、systemd執行預設的target



6、centos7基礎

 centos7的init程式採用systemd風格,systemctl命令,使用相容以前的版本,所以也可以使用service類的命令。

Systemd具有許多centos6裡面沒有的四個特點:(1)、並行開啟,即在系統引導的時候可以實現服務的並行開啟;(2)、按需啟用,即能夠實現按需啟用程式,即在系統啟動時,需要隨系統啟動服務,其服務程式並沒有啟動,但是Ststemd為每一個此類服務程式都註冊了套接字,我們稱這種服務處理方式為“半啟用狀態”。(3)、快照功能,即能夠對當前系統的使用者空間的每個程式進行狀態快照,以後如果程式出現問題或故障,可以迅速恢復程式狀態至過去的某一時候。(4)、服務控制邏輯,systemd內部有一種基於基於依賴關係來定義的服務控制邏輯。

  # systemctl {start|stop|restart|status} name[.service] ----------管理服務

  # systemctl set-default {multi-user.target | graphical.target} ----------設定執行級別

  # systemctl get-default  -----------設定預設執行級別

  # systemctl set-default muti-user.target  ------改回命令列介面


 centos7採用unit檔案進行核心管理,由Systemd相關的配置檔案進行各種標識、識別、和配置功能的實現。unit檔案分為    系統服務類、socket、目標類、快照類等幾類。這些配置檔案主要儲存在以下三個檔案中:

    /etc/lib/systemd/system/*

    /etc/systemd/system/* ---------符號連結

    /run/systemd/system/* ---------非配置關鍵項

 unit常見的8種型別如下:

    Service unit:副檔名為.service ----------用於定義系統服務,可省

    Target unit:副檔名為.target ------------init程式的執行級別

    Decvice unit:副檔名為.device --------核心識別的裝置

    Mount unit:副檔名為.mount ------------systemd管理的檔案系統的掛載點

    automount unit:副檔名為.automount --------------掛載點的位置

    Socket:副檔名為.socket -------------標識程式間通訊的socket檔案

    Swap unit:副檔名為.swap ------------標識swap裝置

    Path unit:副檔名為.path ------------監控指定目錄中的一個檔案或一個子目錄,沒有則自動建立。

 target unit模擬6中的執行級別:

    級別0:runlevel0.target,poweroff.target

    級別1:runlevel1.target,rescue.target

    級別2:runlevel2.target,multi-user.target:

    級別3:runlevel3.target,multi-user.target

    級別4:runlevel4.target,multi-user.target

 systemd的四種實現方式如下:

    (1)、基於socket unit的方式實現程式啟用機制

    (2)、基於device unit的方式實現裝置的自動識別,掛載

    (3)、基於bus的啟用機制

    (4)、基於path的啟用機制

 

 如果自行編寫unit file,可以直接將檔案放置於/etc/systemd/syetem目錄中,也可以將其放在/usr/lib/systemd/system/目錄中。unit file通常分為三段,分別為 [Unit]、[Service]、[Install],各部分解釋如下:

    (1)、[Unit]:定義域Unit型別無關的通用選項。

    常用的選項語句:

      Description ------相關服務描述

      After -------服務啟動前依賴的內容

      before ------------依賴此服務啟動的服務

      Wants --------指明依賴關係

      Requires -----------指明依賴關係

      Conflict -----------各unit之間可能存在的衝突

      Documentation ---------------管理命令的文件所在位置

    (2)、[Service]:定義與系統服務相關的專用的選項語句。

    常用的選項語句:

      Type ----------定義影響ExecStart及相關引數的功能:simple、forking、oneshot、notify

      EnvironmentFile ------------------環境配置檔案

      ExecStart ----------啟動此服務所需要執行的命令或指令碼

      ExecReload -------------指明過載配置檔案所需要執行的命令或指令碼

      ExecStop --------------指明停止此服務所需要執行的命令或指令碼

      ExecStartPre -----------指明啟動ExecStart所指明的命令【之前】所需要執行的命令或指令碼

      ExecStartPost -----------指明啟動ExecStart所指明的命令【之後】所需要執行的命令或指令碼

      Restart ------------表示如果服務遇到意外而終止,則會自動重啟該服務

    (3)、[Install]:服務啟動或禁用時用到的專用選項語句

      WantedBy ------弱依賴關係

      RequiredBy ---------強依賴關係 


systemctl命令 ---------------控制系統和服務管理

 以下是centos6和centos7實現相同功能,所使用的不同的命令列,及其區別:

 (1)、啟動:

    centos6:service NAME start 

    centos7:systemctl start NMAE[.service]

 (2)、停止:

    centos6:service NAME stop

    centos7:systemctl stop NMAE[.service]

 (3)、重啟:

    centos6:service NAME restart

    centos7:systemctl restart NMAE[.service]

 (4)、狀態:

    centos6:service NAME status

    centos7:systemctl status NMAE[.service]

 (5)、服務開機自啟:

    centos6:chkconfig --level runlevels NAME on

    centos7:systemctl enable NAME.service

 (6)、禁止服務的開機自啟:

    centos6:chkconfig --level runlevels NAME off

    centos7:systemctl disable NAME.service

 (7)、檢視是否開機自啟:

    centos6:chkconfig --list NAME

    centos7:systemctl is-enabled NAME.service

 (8)、條件式重啟:

    centos6:service NAME condrestart

    centos7:systemctl try-restart NAME.service

 (9)、過載或重啟:

    systemctl reload-or-restart NAME.service

 (10)、過載或條件式重啟:

    systemctl reload-or-try-restart NAME.service

 (11)、檢視是否啟用

    systemctl is-active NAME.service

 (12)、檢視所有啟用:

    systemctl list-units 

    systemctl list-units --type=NUIT_TYPE:檢視指定unit型別的處於活躍狀態的服務

    systemctl list-units --all:顯示所有包括處於活躍狀態和處於非活躍狀態的各服務

 (13)、檢視服務的依賴關係:

    systemctl list-dependencies NAME.service

 (14)、禁止開機自啟:

    systemctl mask NAME.service

 (15)、取消禁止的開機自啟:

    systemctl unmask NAME.service、

 (16)、執行級別之間的切換:

    centos6:init # 

    centos7:systemctl isolate NAME.target

 (17)、檢視執行級別:

    centos6:runlevel :

    centos7:systemctl list-units --type=target --all

             systemctl get-default

 (18)、修改預設執行級別:

    systemctl set-default NAME.target


  # systemctl halt,systemctl poweroff ------關機

  # systemctl reboot ------重啟

  # systemctl suspend ------掛起

  # systemctl hibernate --------休眠

  # systemctl hybrid-sleep ----------掛起並休眠




相關文章