systemd介紹
POST --> Boot Sequence --> Bootloader --> kernel + initramfs(initrd) --> rootfs --> /sbin/init
init:
CentOS 5: SysV init
CentOS 6: Upstart
CentOS 7: Systemd
systemd : 系統啟動和伺服器守護程序管理器,負責在系統啟動或運作時,激活系統資源,伺服器程序和其他程序
systemd新特性:
- 系統引導時實作服務并行啟動
- 按需啟動守護程序
- 自動化的服務依賴關系管理
- 同時采用socket式與D-Bus總線式激活服務
- 系統狀态快照
核心概念 : unit
unit 表示不同類型的systemd對象,通過配置檔案進行辨別和配置,檔案中主要包含了系統服務,監聽socket,儲存的系統快照以及其他與init相關的資訊
配置檔案 :
/usr/lib/systemd/system : 内個服務最主要的啟動腳本設定,類似于之前的 /etc/init.d/
/run/systemd/system : 系統執行過程中所産生的服務腳本,比上面目錄優先運作
/etc/systemd/system : 管理者建立的執行腳本,類似于 /etc/rc.d/rcN.d/Sxx 類的功能,比上面目錄優先運作
unti類型:
systemctl -t help : 檢視unit類型
[[email protected] ~]# systemctl -t help
Available unit types: #可用的unit類型
service #檔案擴充名為 .service ,用于定義系統服務
socket #用于辨別程序間通信用的socket檔案,也可以在系統啟動時,延遲啟動服務,實作按需啟動
busname
target #用于模拟實作"運作級别"
snapshot #管理系統快照
device #用于定義核心識别的裝置
mount #定義檔案系統挂載點
automount #檔案系統的自動挂載點
swap #用于辨別swap裝置
timer
path #用于定義檔案系統的一個檔案或目錄使用,常用于當檔案系統變化時,延遲激活服務,如: spool 目錄
slice
scope
關鍵特性:
基于socket的激活機制: socket與服務程式分離
基于d-bus的激活機制:
基于device的激活機制
基于path的激活機制
系統快照: 儲存各unit的目前狀态資訊于持久儲存設備中
向後相容sysv init 腳本
不相容:
systemctl 指令固定不變,不可擴充
非由systemd啟動的服務,systemctl無法與之通信和控制
服務管理
管理系統服務:
CentOS 7 : service unit
注意 : 能相容早期的服務腳本
指令 : systemctl COMMAND name.service
啟動 : service name start ==> systemctl start name.service
停止 : service name stop ==> systemctl stop name.service
重新開機 : service name restart ==> systemctl restart name.service
狀态 : service name status ==> systemctl status name.service
條件式重新開機 : 已啟動才啟動,否則不做操作
service name condrestart ==> systemctl try-restart name.service
重載或重新開機服務 : 先加載,再啟動
systemctl reload-or-restart name.service
重載或條件式重新開機服務 :
systemctl reload-or-try-restart name.service
禁止自動和手動啟動:
systemctl mask name.service
取消禁止:
systemctl unmask name.service
檢視某服務目前激活與否的狀态:
systemctl is-active name.service
檢視所有已經激活的服務:
systemctl list-units --type|-t service
檢視所有服務:
systemctl list-units --type|-t service -all|-a
設定某服務開機自啟:
chkconfig name on ==> systemctl enbale name.service
設定某服務開機禁止啟動:
chkconfig name off ==> systemctl disable name.service
檢視所有服務的開機自啟狀态:
chkconfig --list ==> systemctl list-unit-files --type service
用來列出該服務在哪些運作級别下啟用和禁用:
chkconfig sshd -list ==> ls /etc/systemd/system/*.wants/sshd.service
檢視服務是否開機自啟:
systemctl is-enabled name.service
檢視服務的依賴關系:
systemctl list-dependencies name.service
殺掉程序:
systemctl kill 程序名
服務狀态
systemctl list-units --type service --all 顯示所有狀态
loaded : unit配置檔案已處理
active(running) : 一次或多次持續處理的運作
active(exited) : 成功完成一次性的配置
active(waiting) : 運作中,等待一個事件
inactive : 不運作
enabled : 開機啟動
disabled : 開機不啟動
static : 開機不啟動,但可被另一個啟用的服務激活
systemctl 指令示例
顯示所有單元狀态:
systemctl 或 systemctl list-units
隻顯示服務單元的狀态:
systemctl --type=service
顯示sshd服務單元:
systemctl status sshd.service -l
驗證sshd服務目前是否活動:
systemctl is-active sshd
啟動,停止和重新開機sshd服務:
systemctl start sshd.service
systemctl stop sshd.service
systemctl restart sshd.service
重新加載配置:
systemctl reload sshd.service
列出活動狀态的所有服務單元:
systemctl list-units --type service
列出所有服務單元:
systemctl list-units -t service -a
檢視服務單元的啟用和禁用狀态:
systemctl list-unit-files -t service
列出失敗的服務:
systemctl --failed -t service
列出依賴的單元:
systemctl list-dependencies sshd
驗證sshd服務是否開機啟動:
systemctl is-enabled sshd
禁用network,使之不能自動啟動,但手動可以
systemctl disable network
啟用network
systemctl enable network
運作級别
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 ==> sytemctl isolate name.target
systemctl isolate multi-user.target
注: 隻有 /lib/systemd/system/*.target檔案中
AllowIsolate=yes 才能切換(修改檔案需執行 systemctl daemon-reload 才能生效)
檢視 target :
runlevel 或 who -r
擷取預設運作級别:
/etc/inittab ==> systemctl get-default
修改預設級别:
/etc/inittab ==> systemctl set-default name.target
systemctl set-default multi-user.target
ls -l /etc/systemd/system/default.target
其他指令
切換至緊急救援模式:
systemctl rescue
切換至emergency 模式:
systemctl emergency
其他常用指令:
傳統指令init,poweroff,halt,reboot 都成為systemctl的軟連結
關機 : systemctl halt,systemctl poweroff
重新開機 : systemctl reboot
挂起 : systemctl suspend
休眠 : systemctl hibernate
休眠并挂起 : systemctl hybrid-sleep
centos 7 引導順序
UEFI或BIOS初始化,運作POST開機自檢
選擇啟動裝置
引導裝載程式,centos是grub2
加載裝載程式的配置檔案 : /etc/grub.d/ /etc/default/grub /boot/grub2/grub.cfg
加載initramfs驅動子產品
加載核心
核心初始化,centos 7使用systemd代替init
執行initrd.target所有單元,包括挂載 /etc/fstab
從initramfs根檔案系統切換到磁盤根目錄
systemd執行預設target配置,配置檔案 /etc/systemd/default.target /etc/systemd/system/
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
服務unit檔案示例
vim /testdir/backup_etc.sh
#!/bin/bash
tar -Jcf /testdir/backup_etc_`date +%F`.tar.gz /etc &> /dev/null
vim /etc/systemd/system/backup_etc.service
[Unit]
Description=back up /etc
Requires=atd.service
[Service]
Type=simple
ExecStart=/bin/bash -c "echo /testdir/backup_etc.sh | at now"
centos 7 啟動相關
設定核心參數,隻影響當次啟動
啟動時,在linux16行後添加 systemd.unit=desired.target
systemd.unit=emergency.target
system.unit=rescue.target
recure.target 比 emergency 支援更多的功能,例如日志等
啟動排錯:
檔案系統損壞:
先嘗試自動修複,失敗則進入emergency shell ,提示使用者修複
在 /etc/fstab 不存在對應的裝置和UUID,等一段時間,如不可用,進入emergency shell
在 /etc/fstab 不存在對應挂載點 systemd 嘗試建立挂載點,否則提示進入 emergency shell
在 /etc/fstab 不正确的挂載選項,提示進入 emergency shell
破解root密碼:
啟動時任意鍵暫停啟動
按e鍵進入編輯模式
将光标移動到linux16 開始的行,添加核心參數 rd.break
按ctrl+x 啟動
mount -o remount,rw /sysroot
chroot /sysroot
passwd root
touch /.autorelabel
修複grub2 :
引導提示時可以使用指令行界面可從檔案系統引導
主要配置檔案 /boot/grub2/grub.cfg
修改配置檔案
grub2-mkconfig > /boot/grub2/grub.cfg
或
grub2-mkconfig -o /boot/grub2/grub.cfg
修複grub
grub2-install /dev/sda
練習
1,為編譯安裝的httpd服務,實作service unit檔案
vim /etc/man_db.conf
2,破解centos7 密碼
3,修改預設的啟動核心
4,啟動時臨時禁用SELinux
5,啟動時進入emergency模式
6,删除編譯安裝的新核心