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的啟動過程