1. 程式人生 > >CentOS 7 中 Systemd詳解

CentOS 7 中 Systemd詳解

cts 模擬 lld 標記 httpd sco fail cati crs


CentOS 7 中 Systemd詳解

[日期:2016-12-01] 來源:Linux社區 作者:lxlxlx [字體:大 中 小]



目錄
一、systemd的由來
二、systemd
三、服務管理
1、systemctl2
2、服務查看
3、服務狀態
4、hostnamectl
5、localectl
6、 timedatectl
7、loginctl
四、unit
1、Unit類型
2、systemctl list-units命令可以查看當前系統的所有 Unit
3、unit狀態
4、依賴關系
五、unit配置文件
1、概述
2、配置文件狀態
3、配置文件格式
1)unit配置文件格式
2)Unit段的常用選項
3)service常用的選項
4)install 常用選項
六、Target
1、Target命令
2、Target與傳統 RunLevel 的對應關系如下
3、它與init進程的主要差別如下
七、日誌管理
1、journalctl功能強大,用法非常多
2、查看指定優先級(及其以上級別)的日誌,共有8級

一、systemd的由來
Linux一直以來采用init進程但是init有兩個缺點:
1、啟動時間長。Init進程是串行啟動,只有前一個進程啟動完,才會啟動下一個進程。(這也是CentOS5的主要特征)
2、啟動腳本復雜。Init進程只是執行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這使得腳本變得很長而且復雜。
Init:
Centos 5 Sys init 是啟動速度最慢的,串行啟動過程,無論進程相互之間有無依賴關系。
Centos6 Upstart init 相對啟動速度快一點有所改進。有依賴的進程之間依次啟動而其他與之沒有依賴關系的則並行同步啟動。
Centos7 Systemd 與以上都不同。所有進程無論有無依賴關系則都是並行啟動(當然很多時候進程沒有真正啟動而是只有一個信號或者說是標記而已,在真正利用的時候才會真正啟動。)
二、systemd
Systemd為了解決上文的問題而誕生。它的目標是,為系統的啟動和管理提供一套完整的解決方案。根據linux慣例,字母d是守護進程(daemon) 的縮寫。Systemd名字的含義就是 守護整個系統。
Centos 7裏systemd代替了init,成為了系統的第一個進程。PID為1.其他所有的進程都是它的子進程。Systemd 的優點是功能強大,使用方便,缺點是體系龐大,非常復雜。事實上,現在還有很多人反對使用 Systemd,理由就是它過於復雜,與操作系統的其他部分強耦合,違反"keep simple, keep stupid"的Unix 哲學。

Systemd 架構圖

技術分享圖片



三、服務管理
1、systemctl
Systemctl是systemd的主要命令,用於管理系統。
Centos 7 :service unit
註意:能兼容早期的服務腳本
命令格式

#systemctl COMMAND name.service
重啟系統
# systemctl reboot
關閉系統,切斷電源
# systemctl poweroff
CPU停止工作
# systemctl halt
暫停系統
# systemctl suspend
讓系統進入冬眠狀態
# systemctl hibernate
讓系統進入交互式休眠狀態
# systemctl hybrid-sleep
啟動進入救援狀態(單用戶狀態)
# systemctl rescue
啟動服務
#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 tryrestart name.service
重載或重啟服務:先加載,再啟動
#systemctl reload-or-restart name.service
重載或條件式重啟服務:
#systemctl reload-or-try-restart name.service
禁止自動和手動啟動:
#systemctl mask name.service
取消禁止:
#systemctl unmask name.service

2、服務查看:
查看所有服務的開機自啟狀態:
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 進程名
顯示某個 Unit 的所有底層參數
# systemctl show httpd.service
顯示某個 Unit 的指定屬性的值
# systemctl show -p CPUShares httpd.service
設置某個 Unit 的指定屬性
# sudo systemctl set-property httpd.service CPUShares=500


3、服務狀態:
顯示狀態
systemctl list-unit-files --type service –all
loaded:Unit 配置文件已處理
active(running)一次或多次持續處理的運行
active(exited)成功完成一次性的配置
active(waiting)運行中,等待一個事件
inactive不運行
enabled開機啟動
disabled開機不啟動
static開機不啟動,但可被另一個啟用的服務激活

4、hostnamectl
hostnamectl命令用於查看當前主機的信息。
顯示當前主機的信息
# hostnamectl
設置主機名。
# hostnamectl set-hostname rhel7

5、localectl
localectl命令用於查看本地化設置。
查看本地化設置
# localectl
# 設置本地化參數。
# localectl set-locale LANG=en_GB.utf8
# localectl set-keymap en_GB

6、 timedatectl
123456789 timedatectl
timedatectl命令用於查看當前時區設置。
查看當前時區設置
顯示所有可用的時區
# timedatectl list-timezones
# 設置當前時區
$# timedatectl set-timezone America/New_York
# timedatectl set-time YYYY-MM-DD
# timedatectl set-time HH:MM:SS

7、loginctl
loginctl命令用於查看當前登錄的用戶。
# 列出當前session
# loginctl list-sessions
# 列出當前登錄用戶
# loginctl list-users
# 列出顯示指定用戶的信息
# loginctl show-user (ruanyf) 用戶

四、unit
Systemd可以管理系統中所有資源。不同的資源統稱為unit(單位)。Unit表示不同類型的systemd對象,通過配置文件進程標識和配置;文件中主要包含了系統服務、監聽socket、保存的系統快照以及其它與init相關的信息。
1、Unit類型
Unit一共分為12種。
Sysstemctl –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目錄
Scope unit :不是由systemd啟動的外部進程
Slice unit :進程組
Timer unit :定時器


2、systemctl list-units命令可以查看當前系統的所有 Unit 。
列出正在運行的 Unit
# systemctl list-units
列出所有Unit,包括沒有找到配置文件的或者啟動失敗的
# systemctl list-units --all
列出所有沒有運行的 Unit
# systemctl list-units --all --state=inactive
列出所有加載失敗的 Unit
# systemctl list-units --failed
列出所有正在運行的、類型為 service 的 Unit
# systemctl list-units --type=service


3、unit狀態
systemctl status命令用於查看系統狀態和單個 Unit 的狀態。
顯示系統狀態
#systemctl status
顯示單個 Unit 的狀態
# sysystemctl status bluetooth.service
顯示遠程主機的某個 Unit 的狀態
# systemctl -H [email protected] status httpd.service
除了status命令,systemctl還提供了三個查詢狀態的簡單方法,主要供腳本內部的判斷語句使用。


顯示某個 Unit 是否正在運行
# systemctl is-active application.service
顯示某個 Unit 是否處於啟動失敗狀態
# systemctl is-failed application.service
顯示某個 Unit 服務是否建立了啟動鏈接
# systemctl is-enabled application.service
4、依賴關系
Unit 之間存在依賴關系:A 依賴於 B,就意味著 Systemd 在啟動 A 的時候,同時會去啟動 B。
#systemctl list-dependencies命令列出一個 Unit 的所有依賴。
# systemctl list-dependencies nginx.service
上面命令的輸出結果之中,有些依賴是 Target 類型(詳見下文),默認不會展開顯示。如果要展開 Target,就需要使用--all參數。
# systemctl list-dependencies --all nginx.service


五、unit配置文件
1、概述
每一個 Unit 都有一個配置文件,告訴 Systemd 怎麽啟動這個 Unit 。
Systemd 默認從目錄/etc/systemd/system/讀取配置文件。但是,裏面存放的大部分文件都是符號鏈接,指向目錄/usr/lib/systemd/system/,真正的配置文件存放在那個目錄。


systemctl enable httpd.service命令用於在上面兩個目錄之間,建立符號鏈接關系。(Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.)等同於 ln -s /usr/lib/systemd/system/httpd.service /etc/systemd/system/multi-user.target.wants/httpd.service。當然systemdctl diable httpd.service 則相當於刪除這個軟連接。

/usr/lib/system/system:每個服務最主要的啟動腳本設置,類似於之前的/etc/init.d/
/run/system/system:系統執行過程中所產生的服務腳本,與上面目錄優先運行。
/etc/systemd/system:管理員建立的執行腳本,類似於/etc/rc.d/rcN.d/Sxx的功能,比上面目錄優先運行。


2、配置文件狀態
systemctl list-unit-files命令用於列出所有配置文件。
列出所有配置文件
#systemctl list-unit-files
列出指定類型的配置文件
#systemctl list-unit-files --type=service


systemctl list-unit-files該命令會輸出一個列表,從中可以看到每個配置文件的狀態。
Unit config filestatus
lvm2-lvmetad.service disabled
lvm2-lvmetad.socket enabled
lvm2-lvmpolld.service disabled
lvm2-lvmpolld.socket enabled


這個列表顯示每個配置文件的狀態,一共有四種。
enabled:已建立啟動鏈接
disabled:沒建立啟動鏈接
static:該配置文件沒有[Install]部分(無法執行),只能作為其他配置文件的依賴
masked:該配置文件被禁止建立啟動鏈接
註意,從配置文件的狀態無法看出,該 Unit 是否正在運行。這必須執行前面提到的systemctl status命令。
# systemctl status httpd.service


3、配置文件格式
1)unit配置文件格式
[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
[unit] :定義與Unit類型無關的通用選項;用於提供unit的描述信息、 unit行為及依賴關系等
[Service]:與特定類型相關的專用選項;此處為Service類型
[Install]:定義由“ systemctl enable”以及"systemctl disable“命令在實現服務啟用或禁用時用到的一些選項


2、Unit段的常用選項:Description:簡短描述
Description:描述信息
After:定義unit的啟動次序,表示當前unit應該晚於哪些
unit啟動,其功能與Before相反
Requires:依賴到的其它units,強依賴,被依賴的units無法激活時,當前unit也無法激活
Wants:依賴到的其它units,弱依賴
Conflicts:定義units間的沖突關系
BindsTo:與Requires類似,它指定的 Unit 如果退出,會導致當前 Unit 停止運行
Before:如果該字段指定的 Unit 也要啟動,那麽必須在當前 Unit 之後啟動
Conflicts:這裏指定的 Unit 不能與當前 Unit 同時運行
Condition...:當前 Unit 運行必須滿足的條件,否則不會運行
Assert...:當前 Unit 運行必須滿足的條件,否則會報啟動失敗

3、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後運行
ExecRsload: 重啟當前服務時執行的命令
ExecStopPost:停止當前服務之後執行的命令
ExecStartSec:自動重啟當前服務間隔的秒數
ExecStop:指明停止unit要運行的命令或腳本
Restart:當設定Restart=1 時,則當次daemon服務意外終止後,會再次自動啟動此服務。
TimeoutSec:定義 Systemd 停止當前服務之前等待的秒數。
Environment:指定環境變量。
4、install 常用選項
Install段的常用選項:
Alias:別名,可使用systemctl command Alias.service
RequiredBy:被哪些units所依賴,強依賴
WantedBy:被哪些units所依賴,弱依賴
Also:安裝本服務的時候還要安裝別的相關服務

註意:對於新創建的unit文件,或者修改了的unit文件,要通知systemd重載此配置文件,而後可以選擇重啟。
# systemctl daemon-reload
# systemctl daemon-reload
#systemctl restart httpd.service
更加詳細的unit配置文件格式 請參考官方文檔
https://www.freedesktop.org/software/systemd/man/systemd.unit.html

六、Target
啟動計算機的時候,需要啟動大量的 Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些 Unit,顯然非常不方便。Systemd 的解決方案就是 Target。
簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啟動某個 Target 的時候,Systemd 就會啟動裏面所有的 Unit。從這個意義上說,Target 這個概念類似於"狀態點",啟動某個 Target 就好比啟動到某種狀態。
傳統的init啟動模式裏面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。
1、Target命令
查看當前系統的所有 Target
# systemctl list-unit-files --type=target
查看一個 Target 包含的所有 Unit
# systemctl list-dependencies multi-user.target
查看啟動時的默認 Target
# systemctl get-default
設置啟動時的默認 Target
# systemctl set-default multi-user.target


切換 Target 時,默認不關閉前一個 Target 啟動的進程, systemctl isolate 命令改變這種行為,
關閉前一個 Target 裏面所有不屬於後一個 Target 的進程 systemctl isolate multi-user.target


2、Target與傳統 RunLevel 的對應關系如下。


Traditional runlevel New target name Symbolically linked to...
Runlevel 0 | runlevel0.target -> poweroff.target
Runlevel 1 | runlevel1.target -> rescue.target
Runlevel 2 | runlevel2.target -> multi-user.target
Runlevel 3 | runlevel3.target -> multi-user.target
Runlevel 4 | runlevel4.target -> multi-user.target
Runlevel 5 | runlevel5.target -> graphical.target
Runlevel 6 | runlevel6.target -> reboot.target
3、它與init進程的主要差別如下。
(1)默認的 RunLevel(在/etc/inittab文件設置)現在被默認的 Target 取代,位置是/etc/systemd/system/default.target,通常符號鏈接到graphical.target(圖形界面)或者multi-user.target(多用戶命令行)。
(2)啟動腳本的位置,以前是/etc/init.d目錄,符號鏈接到不同的 RunLevel 目錄 (比如/etc/rc3.d、/etc/rc5.d等),現在則存放在/lib/systemd/system和/etc/systemd/system目錄。
(3)配置文件的位置,以前init進程的配置文件是/etc/inittab,各種服務的配置文件存放在/etc/sysconfig目錄。現在的配置文件主要存放在/lib/systemd目錄,在/etc/systemd目錄裏面的修改可以覆蓋原始設置。

七、日誌管理
Systemd 統一管理所有 Unit 的啟動日誌。帶來的好處就是,可以只用journalctl一個命令,查看所有日誌(內核日誌和應用日誌)。日誌的配置文件是/etc/systemd/journald.conf。

1、journalctl功能強大,用法非常多。
查看所有日誌(默認情況下 ,只保存本次啟動的日誌)
# journalctl
查看內核日誌(不顯示應用日誌)
# journalctl -k
查看系統本次啟動的日誌
# journalctl -b
# journalctl -b -0
查看上一次啟動的日誌(需更改設置)
# journalctl -b -1
查看指定時間的日誌
# journalctl --since="2012-10-30 18:17:16"
# journalctl --since "20 min ago"
# journalctl --since yesterday
# journalctl --since "2015-01-10" --until "2015-01-11 03:00"
# journalctl --since 09:00 --until "1 hour ago"
顯示尾部的最新10行日誌
# journalctl -n
顯示尾部指定行數的日誌
# journalctl -n 20
實時滾動顯示最新日誌
# journalctl -f
查看指定服務的日誌
# journalctl /usr/lib/systemd/systemd
查看指定進程的日誌
# journalctl _PID=1
查看某個路徑的腳本的日誌
# journalctl /usr/bin/bash
查看指定用戶的日誌
# journalctl _UID=33 --since today
查看某個 Unit 的日誌
# journalctl -u nginx.service
# journalctl -u nginx.service --since today
實時滾動顯示某個 Unit 的最新日誌
# journalctl -u nginx.service -f
合並顯示多個 Unit 的日誌
# journalctl -u nginx.service -u php-fpm.service --since today

2、查看指定優先級(及其以上級別)的日誌,共有8級
0: emerg
1: alert
2: crit
3: err
4: warning
5: notice
6: info
7: debug
# journalctl -p err -b
日誌默認分頁輸出,--no-pager 改為正常的標準輸出
# journalctl --no-pager
以 JSON 格式(單行)輸出
# journalctl -b -u nginx.service -o json
以 JSON 格式(多行)輸出,可讀性更好
# journalctl -b -u nginx.serviceqq
-o json-pretty
顯示日誌占據的硬盤空間
# journalctl --disk-usage
指定日誌文件占據的最大空間
# journalctl --vacuum-size=1G
指定日誌文件保存多久
# journalctl --vacuum-time=1years

CentOS 7 中 Systemd詳解