系統啟動流程 systemd Unit 類型 服務管理 ` 運行級別 CentOS7 引導啟動順序 service unit 文件格式 設置內核參數 啟動排錯 破解CentOS7 的root 口令 修複GRUB2 ...
系統啟動流程
POST --> Boot Sequence --> Bootloader --> kernel+initramfs(initrd) --> rootfs --> /sbin/init
init:
CentOS 5: SysV init
CentOS 6: Upstart
CentOS 7: Systemd
systemd
系統啟動和伺服器守護進程管理器,負責在系統啟動或運行時,激活系統資源,伺服器進程和其它進程。
新特性:
系統引導時實現服務並行啟動
按需啟動守護進程
自動化的服務依賴關係管理
同時採用socket式與D-Bus匯流排式激活服務
系統狀態快照
核心概念:unit
unit 表示不同類型的systemd對象,通過配置文件進行標識和配置。
文件中主要包含了系統服務、監聽socket 、保存的系統快照以及其它與init 相關的信息。
配置文件:
/usr/lib/systemd/system:
每個服務最主要的啟動腳本設置,類似於之前的/etc/init.d/
/run/systemd/system:
系統執行過程中所產生的服務腳本,比/usr/lib/systemd/system目錄優先運行
/etc/systemd/system:
管理員建立的執行腳本,類似於/etc/rc.d/rcN.d/Sxx 類的功能,比/run/systemd/system目錄優先運行
關鍵特性:
基於socket 的激活機制: socket 與服務程式分離
基於d-bus 的激活機制:
基於device 的激活機制:
基於path 的激活機制:
系統快照: 保存各unit的當前狀態信息於持久存儲設備中,向後相容sysv init 腳本
不相容:
systemctl 命令固定不變,不可擴展
非由systemd 啟動的服務,systemctl無法與之通信和控制
Unit 類型
Systemctl –t help 查看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,用於定義文件系統中的一個文件或目錄使用,常用於當文件系統變化時,延遲激活服務,如:spool 目錄
服務管理
`centos7幾乎一切服務都是由systemctl來管理service unit,centos7之前的service同時仍然相容。
運行級別
target units:
unit 配置文件:
.target,用於模擬實現運行級別
ls /usr/lib/systemd/system/*.target
systemctl list-unit-files --type target --all
運行級別:
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
5 ==> runlevel5.target, graphical.target
6 ==> runlevel6.target, reboot.target
查看依賴性:
systemctl list-dependencies graphical.target
級別切換:
init N ==> systemctl isolate name.target
systemctl isolate multi-user.target
註意:只有/lib/systemd/system/*.target 文件中AllowIsolate=yes才能切換,修改文件需執行systemctl daemon-reload 才能生效
查看target:
systemctl list-units --type target
獲取預設運行級別:
/etc/inittab ==> systemctl get-default
runlevel
who -r
修改預設級別:
/etc/inittab ==> systemctl set-default name.target
systemctl set-default multi-user.target
ls –l /etc/systemd/system/default.target
切換至緊急救援模式:
相當於init 1
systemctl rescue
切換至emergency 模式:
systemctl emergency
其它常用命令:
傳統命令init ,poweroff ,halt ,reboot 都成為 systemctl 的軟鏈接
關機:systemctl halt 、systemctl poweroff
重啟:systemctl reboot
掛起:systemctl suspend
休眠: :systemctl hibernate
休眠並掛起:systemctl hybrid-sleep
CentOS7 引導啟動順序
UEFi 或BIOS 初始化,運行POST 開機自檢
選擇啟動設備
引導裝載程式, centos7 是grub2
載入裝載程式的配置文件:/etc/grub.d/ ,/etc/default/grub ,/boot/grub2/grub.cfg
載入initramfs 驅動模塊
載入內核選項
內核初始化,centos7 使用systemd 代替init
執行initrd.target 所有單元,包括掛載/etc/fstab
從initramfs 根文件系統切換到磁碟根目錄
systemd執行/etc/systemd/system目錄下的配置
systemd 執行預設target 配置,配置文件/etc/systemd/system/default.target
systemd 執行sysinit.target 初始化系統及basic.target 準備操作系統
systemd 啟動multi-user.target 下的本機與伺服器服務
systemd 執行multi-user.target 下的/etc/rc.d/rc.local
systemd 執行multi-user.target 下的getty.target及登錄服務
systemd 執行graphical 需要的服務
service unit 文件格式
/etc/systemd/system :
系統管理員和用戶使用
/usr/lib/systemd/system :
發行版打包者使用
相關布爾值
1 、yes 、on 、true 都是開啟
0 、no 、off、false 都是關閉
時間單位
預設是秒,所以要用毫秒(ms )分鐘(m )等須顯式說明
service unit file 文件通常由三部分組成:
[Unit] : 定義與Unit 類型無關的通用選項;用於提供unit 的描述信息、unit 行為及依賴關係等
[Service] : 與特定類型相關的專用選項;此處為Service 類型
[Install] : 定義由“systemctl enable” 以及"systemctl disable“ 命令在實現服務啟用或禁用時用到的一些選項
Unit 段的常用選項:
Description : 描述信息
After : 定義unit 的啟動次序,表示當前unit 應該晚於哪些unit 啟動,其功能與Before 相反
Requires : 依賴到的其它units ,強依賴,被依賴的units 無法激活時,當前unit 也無法激活
Wants : 依賴到的其它units ,弱依賴
Conflicts : 定義units 間的衝突關係
Service 段的常用選項:
Type : 定義影響ExecStart 及相關參數的功能的unit 進程啟動類型
simple : 預設值,這個daemon(後臺進程)主要由ExecStart所接的指令串來啟動,啟動後常駐於記憶體中
forking : 由ExecStart 啟動的程式透過spawns(繁衍)延伸出其他子程式來作為此daemon的主要服務。原生父程式在啟動結束後就會終止
oneshot : 與simple類似,不過這個程式在工作完畢後就結束了,不會常駐在記憶體中
dbus : 與simple類似,但這個daemon必須要在取得一個D-Bus的名稱後,才會繼續運作. 因此通常也要同時設定BusNname= 才行
notify : 在啟動完成後會發送一個通知消息。還需要配合NotifyAccess來讓 Systemd 接收消息
idle : 與simple類似,要執行這個daemon必須要所有的工作都順利執行完畢後才會執行。這類的daemon通常是開機到最後才執行即可的服務
EnvironmentFile : 環境配置文件
ExecStart : 指明啟動unit要運行命令或腳本的絕對路徑
ExecStartPre: ExecStart前運行
ExecStartPost: ExecStart後運行
ExecStop : 指明停止unit要運行的命令或腳本
Restart : 當設定Restart=1時,則當次daemon服務意外終止後,會再次自動啟動此服務
Install 段的常用選項:
Alias : 別名,可使用systemctl command Alias.service
RequiredBy : 被哪些units所依賴,強依賴
WantedBy : 被哪些units所依賴,弱依賴
Also : 安裝本服務的時候還要安裝別的相關服務
註意:
對於新創建的unit文件,或者修改了的unit文件,要通知systemd 重載此配置文件, 可以選擇重啟
systemctl daemon-reload
示例:
vim /etc/systemd/system/bak.service
[Unit]
Description=backup /etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/bak.sh|at now"
[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl start bak
設置內核參數
隻影響當次啟動
啟動時,在linux16 行後添加
systemd.unit=desired.target
systemd.unit=emergency.target
systemd.unit=recure.target
recure.target比emergency支持更多的功能,例如日誌等
啟動排錯
文件系統損壞,先嘗試自動修複,失敗則進入emergency shell,提示用戶修複
在/etc/fstab 不存在對應的設備和UUID等一段時間,如不可用,進入emergency shell
在/etc/fstab 不存在對應掛載點systemd嘗試創建掛載點,否則提示進入emergency shell.
在/etc/fstab 不正確的掛載選項提示進入emergency shell
破解CentOS7 的root 口令
方法一
啟動時任意鍵暫停啟動
按e 鍵進入編輯模式
將游標移動linux16 開始的行,添加內核參數rd.break
按ctrl-x 啟動
mount –o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot
方法二
啟動時任意鍵暫停啟動
按e 鍵進入編輯模式
將游標移動linux16 開始的行,改為rw init=/sysroot/bin/sh
按ctrl-x 啟動
chroot /sysroot
passwd root
touch /.autorelabel
exit
reboot
修複GRUB2
GRUB “the Grand Unified Bootloader” ”
引導提示時可以使用命令行界面
可從文件系統引導
主要配置文件 /boot/grub2/grub.cfg
修複配置文件
grub2-mkconfig > /boot/grub2/grub.cfg
grub2-mkconfig -o /boot/grub2/grub.cfg
修複grub
grub2-install /dev/sda (BIOS 環境)
grub2-install (UEFI 環境)
調整預設啟動內核
vim /etc/default/grub
GRUB_DEFAULT=0