1. 程式人生 > >centos7的啟動過程

centos7的啟動過程

centos7 系統 啟動

  • 開機啟過程

  • POST—>BOOT SEQUENCE—> BOOTLOADER—>KERNEL + INITRAMFS(INITRD)—>ROOTFS—>/sbin/init

  • POST:加電自檢

    • 當開機按下電源按鈕後,計算機開始加電,主板上的BIOS或UEFI基本輸入輸出程序開始對硬件進行檢查,檢查內存,CPU等等吧,當檢測到錯誤的時候機器會中斷或者啟動不了,這個做過電腦維護的人都知道,內存氧化可導至開不了機,還有的機器如果沒插鼠標鍵盤自檢也不會通過卡在那裏了,不會繼續往下走。

  • Boot sequence:選擇引導順序

    • 當自檢通過後,接著就要選擇引導介質或方式,是通過光盤啟動,硬盤啟動,網絡啟動,還是U盤啟動,這些也是在BIOS中設定的,所以設定的第一啟動項是哪個就從那個開始引導,這個裝過WINDOWS的都很熟悉了。

  • Bootloader:引導加載器

    • 確定引導介質後便開始從介質中裝載引導程序如grub2,這個是一個微小程序,我們知道MBR引導記錄大小為512字節,其中前446個字節就是Bootloader,主要用來引導用戶選擇要啟動的系統或不同的內核版本,把用戶選定的內核裝載到RAM中的特定空間中,解壓,展開,而後把系統控制權移交給內核。

    • grub2就是Linux中Bootloader程序,由於MBR記錄限制,所以grub2分為兩個部分:

    • 1.在MBR引導記錄中,大小為446字節,主要功能是引導啟動介質的grub主體文件

    • 2.partition,/boot/grub[2],此為grub的主體。

  • KERNEL + INITRAMFS(INITRD)—>ROOTFS :加載內核

    • 這時候kernel開始初始化,探測可識別的硬件設備,加載硬件啟動程序。以只讀方式加載根文件系統

    • kernel在內存中加載時,為了模擬系統環境,會生成一個ramdisk文件,來進行下一步操作,等到加載到真正的根文件系統時,就會退出ramdisk,切換到真正的根文件系統中去。

    • ramdisk:內存上臨時虛擬的系統

    • ramdisk(虛擬磁盤,雙緩沖,雙緩存)----> ramfs(虛擬文件系統)

    • centos5:initrd

    • 工具程序:mkinitrd

    • centos6,7:initramfs

    • 工具程序:dracut,mkinitrd

  • /sbin/init:運行用戶空間的第一個應用程序

    • init:

    • Centos 5: SysV init 配置文件:/etc/inittab

    • Centos 6: Upstart 配置文件:/etc/inittab;/etc/init/*.conf(主要)

    • Centos 7: systemd 配置文件:/etc/systemd/system;/usr/lib/systemd/system

  • 至此,內核空間就已經啟動完畢,內核啟動完成接著開始啟動用戶態啟動過程。systemd是個守護進程,pid號為1,後面所有啟動的服務或進程都是systemd的子進程及子進程的子進程。

  • 那麽用戶態的啟動順序又是什麽樣的呢?

    • 設置默認允許級別—>初始化腳本,完成系統初始化--->關閉及啟動對應級別下的服務----->設置登錄終端----->[啟動圖形終端]

  • Systemd新特性:

    • 系統引導時實現服務並行啟動,沒有順序之分

    • 按需激活進程

    • 支持系統狀態快照

    • 基於依賴關系定義服務控制邏輯

  • 關鍵特性:

    • 基於socket的激活機制:socket與服務程序分離;按需激活程序或服務,可並行啟動

    • 基於bus的激活機制:

    • 基於device的激活機制:當某個硬件設備變得可用時就可激活某設備

    • 基於path的激活機制

    • 系統快照:保存各unit的當前狀態信息於持久存儲設備中

    • 向後兼容sysv init腳本

  • 不兼容:

    • systemctl命令固定不變,非由systemd啟動的服務,systemctl無法與之通信

  • 核心概念:unit

    • 配置文件進行標識和配置,文件中主要包含了系統服務,監聽socket,保存的系統快照以及其它與init相關的信息,保存至:

    • /usr/lib/systemd/system

    • /run/systemd/system

    • /etc/systemd/system

  • unit的類型

    • Service unit:文件擴展名為.service 無需執行權限,用於定義系統服務

    • Target unit:文件擴展名為.target,用於模擬實現“運行級別”

    • Device unit:文件擴展名為.device,用於定義內核識別的設備

    • Mount unit:文件擴展名為.mount,定義文件系統掛載點

    • Socket unit:文件擴展名為.socket,用於標識進程間通信用的socket文件

    • Snapshot unit:文件擴展名為.snapshot,管理系統快照

    • Swap unit:文件擴展名為.swap,用於標識swap設備

    • Automount unit:文件擴展名為.automount,文件系統的自動掛載點

    • Path unit:文件擴展名為.path,用於定義文件系統中的一個文件或目錄

  • 管理系統服務

    • 啟動:systemctl start name.service

    • 停止:systemctl stop name .service

    • 重啟:systemctl restart name.service

    • 重載:systemctl reload name.service

    • 條件式重啟:systemctl try-restart name.service

    • 查看某服務當前是否運行:systemctl is-active name.service

    • 查看所有已經激活的服務:systemctl list-units –type service systemctl list-units –type service –-all

    • 開機自啟動:systemctl enable name.service

    • 開機不啟動:systemctl disable name.service

    • 查看所有服務開機自啟動狀態:systemctl list-unit-files –-type service

    • 查看服務是否開機自啟:systemctl is-enabled name.service

    • 查看服務的依賴關系:systemctl list-dependencies name.service

    • 禁止設定為開機自啟:systemctl mask name.service

    • 取消禁止設定為開機自啟:systemctl unmask name.service

  • Target units:(模擬運行級別)

    • unit配置文件,以.target後輟名結尾

    • 關機:runlevel0.target,poweroff.target

    • 救援:runlevel1.target,rescue.target

    • 多用戶:multi-user.target

    • 圖形:graphical.target

    • 重啟:reboot.target

    • 級別切換:systemctl isolate name.target

    • 查看級別:systemctl list-units –-type target systemctl get-default

    • 設置級別:systemctl set-default name.target

    • 切換至緊急救援模式:systemctl rescue

    • 切換至emergency模式:systemctl emergency(服務不加載不啟動,驅動不加載,更徹底)

  • 其它常命令

    • 關機:systemctl halt,systemctl poweroff

    • 重啟:systemctl reboot

    • 掛起:systemctl suspend

    • 快照:systemctl hibernate

    • 快照並掛起:systemctl hybrid-sleep

  • 常規啟動流程

用粗體下劃線標識的目標單元經常被用作啟動目標。有兩種方法可以指定啟動目標:
(1)使用 systemd.unit= 內核命令行參數(參見systemd手冊);

(2)使用 default.target 軟連接。
因為 timers.target 以異步方式包含在 basic.target 中,所以 timer 單元可以依賴於在 basic.target 之後才啟動的服務。

local-fs-pre.target
|
v
(各個 mounts 與 (各個 swap (各個加密塊設備
fsck services) devices) devices) (各個底層服務 (各個底層API虛擬
| | | services: udevd, 文件系統 mounts:
v v v tmpfiles, random mqueue, configfs,
local-fs.target swap.target cryptsetup.target seed, sysctl ...) debugfs ...)
| | | | |
\__________________|_________________ | ___________________|____________________/
\|/
v
sysinit.target
|
____________________________________/|\________________________________________
/ | | | \
| | | | |
v v | v v
(各個 timers) (各個 paths) | (各個 sockets) rescue.service
| | | | |
v v | v v
timers.target paths.target | sockets.target rescue.target
| | | |
v \_________________ | ___________________/
. \|/
. . . . . . . . . . . . . . . . . . . v
basic.target
|
____________________________________/| emergency.service
/ | | |
| | | v
v v v emergency.target
display- (圖形界面所必須 (各個系統服務)
manager.service 的各個系統服務) |
| | v
| | multi-user.target
| | |
\_________________ | _________________/
\|/
v
graphical.target

  • initrd 啟動流程

basic.target
| emergency.service
______________________/| |
/ | v
| sysroot.mount emergency.target
| |
| v
| initrd-root-fs.target
| |
| v
v initrd-parse-etc.service
(各個自定義的 |
initrd services) v
| (sysroot-usr.mount 以及
| fstab 中帶有 x-initrd.mount
| 標記的各個掛載點)
| |
| v
| initrd-fs.target
\______________________ |
\|
v
initrd.target
|
v
initrd-cleanup.service
(使用 isolates 啟動 initrd-switch-root.target)
|
v
______________________/|
/ v
| initrd-udevadm-cleanup-db.service
v |
(各個自定義的 |
initrd services) |
\______________________ |
\|
v
initrd-switch-root.target
|
v
initrd-switch-root.service
|
v
切換到主機上的操作系統

  • 關機流程

systemd 系統在關機時同樣遵循固定的流程,具體如下圖

(與所有系統服務互斥) (與所有文件系統 mounts, swaps, cryptsetup devices 互斥)
| |
v v
shutdown.target umount.target
| |
\______________________ _____________/
\ /
v
(各個底層 services)
|
v
final.target
|
_____________________________________/ \_________________________________
/ | | \
| | | |
v v v v
systemd-reboot.service systemd-poweroff.service systemd-halt.service systemd-kexec.service
| | | |
v v v v
reboot.target poweroff.target halt.target kexec.target

用粗體下劃線標識的目標單元經常被用作關機目標。


本文出自 “實踐出真知” 博客,請務必保留此出處http://m51cto.blog.51cto.com/53087/1958856

centos7的啟動過程