Systemd 入门及常用命令
目錄
- Systemd
- systemd架構
- systemd 系統管理
- 管理系統
- 查看啟動耗時
- 查看當前主機的信息
- Unit 資源
- 查看當前系統的所有 Unit
- 查看系統狀態和單個 Unit 的狀態
- Unit 管理
- 依賴關系
- Unit 配置文件
- 查看配置文件的內容
- Target
- target(Systemd) 與 runlevel(SysVinit)對應關系
- 與傳統/sbin/init進程的區別
- 日志管理
Systemd
??在計算機啟動時,BootLoader裝載上真正的根文件系統后執行/sbin/init進程,而現下Systemd(系統管理守護進程)取替了傳統的SysV init成為主流的 init 替代進程。最開始以GNU GPL協議授權開發,現在已轉為使用GNU LGPL協議,它是如今討論最熱烈的引導和服務管理程序,Linux系統啟動過程中init進程部分將交給systemd處理。
?
systemd架構
?
systemd 系統管理
??systemd是一組命令,涉及到系統管理的方方面面。
管理系統
# 重啟系統 $ sudo systemctl reboot# 關閉系統,切斷電源 $ sudo systemctl poweroff# CPU停止工作 $ sudo systemctl halt# 暫停系統 $ sudo systemctl suspend# 讓系統進入冬眠狀態 $ sudo systemctl hibernate# 讓系統進入交互式休眠狀態 $ sudo systemctl hybrid-sleep# 啟動進入救援狀態(單用戶狀態) $ sudo systemctl rescue?
查看啟動耗時
# 查看啟動耗時 $ systemd-analyze # 查看每個服務的啟動耗時 $ systemd-analyze blame# 圖形化顯示每個服務啟動的時間軸,結果保存至init.png systemd-analyze plot > init.png# 顯示瀑布狀的啟動過程流 $ systemd-analyze critical-chain# 顯示指定服務的啟動流 $ systemd-analyze critical-chain atd.service?
查看當前主機的信息
# 顯示當前主機的信息 $ hostnamectl# 設置主機名。 $ sudo hostnamectl set-hostname <name>其他命令如 timectl、loginctl、localctl 可自行查閱。
?
?
Unit 資源
??Systemd 可以管理所有系統資源。不同的資源統稱為 Unit(單位)。Unit 一共分成12種:
Service unit:系統服務 Target unit:多個 Unit 構成的一個組 Device Unit:硬件設備 Mount Unit:文件系統的掛載點 Automount Unit:自動掛載點 Path Unit:文件或路徑 Scope Unit:不是由 Systemd 啟動的外部進程 Slice Unit:進程組 Snapshot Unit:Systemd 快照,可以切回某個快照 Socket Unit:進程間通信的 socket Swap Unit:swap 文件 Timer Unit:定時器?
查看當前系統的所有 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?
查看系統狀態和單個 Unit 的狀態
# 顯示系統狀態 $ systemctl status# 顯示單個 Unit 的狀態 $ sysystemctl status bluetooth.service# 顯示遠程主機的某個 Unit 的狀態 $ systemctl -H root@rhel7.example.com status httpd.service?
Unit 管理
# 立即啟動一個服務 $ sudo systemctl start apache.service# 立即停止一個服務 $ sudo systemctl stop apache.service# 重啟一個服務 $ sudo systemctl restart apache.service# 殺死一個服務的所有子進程 $ sudo systemctl kill apache.service# 重新加載一個服務的配置文件 $ sudo systemctl reload apache.service# 重載所有修改過的配置文件 $ sudo systemctl daemon-reload# 顯示某個 Unit 的所有底層參數 $ systemctl show httpd.service# 顯示某個 Unit 的指定屬性的值 $ systemctl show -p CPUShares httpd.service# 設置某個 Unit 的指定屬性 $ sudo systemctl set-property httpd.service CPUShares=500?
依賴關系
??Unit 之間存在依賴關系:A 依賴于 B,就意味著 Systemd 在啟動 A 的時候,同時會去啟動 B。
# 列出一個 Unit 的所有依賴 $ systemctl list-dependencies --all nginx.service?
?
Unit 配置文件
??每一個 Unit 都有一個配置文件,告訴 Systemd 怎么啟動這個 Unit 。Systemd 默認從目錄 /etc/systemd/system/ 讀取配置文件。但是,里面存放的大部分文件都是符號鏈接,指向目錄 /usr/lib/systemd/system/,真正的配置文件存放在那個目錄。
??systemctl enable 命令用于在上面兩個目錄之間,建立符號鏈接關系。如果配置文件里面設置了開機啟動,systemctl enable 命令相當于激活開機啟動。與之對應的,systemctl disable 命令用于在兩個目錄之間,撤銷符號鏈接關系,相當于撤銷開機啟動。
??配置文件的后綴名,就是該 Unit 的種類,比如 sshd.socket 。如果省略,Systemd 默認后綴名為 .service,所以 sshd 會被理解成 sshd.service 。
?
查看配置文件的內容
??可以看到,配置文件分成幾個區塊。每個區塊的第一行,是用方括號表示的區別名,比如[Unit]。注意,配置文件的區塊名和字段名,都是大小寫敏感的。每個區塊內部是一些等號連接的鍵值對。
??[Unit]區塊通常是配置文件的第一個區塊,用來定義 Unit 的元數據,以及配置與其他 Unit 的關系。
??[Install]通常是配置文件的最后一個區塊,用來定義如何啟動,以及是否開機啟動。
??[Service]區塊用來 Service 的配置,只有 Service 類型的 Unit 才有這個區塊。
$ systemctl cat atd.service[Unit] Description=ATD daemon[Service] Type=forking ExecStart=/usr/bin/atd[Install] WantedBy=multi-user.target?
?
Target
??啟動計算機的時候,需要啟動大量的 Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些 Unit,顯然非常不方便。Systemd 的解決方案就是 Target。可以說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啟動某個 Target 的時候,Systemd 就會啟動里面所有的 Unit。傳統的 init 啟動模式里面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。
# 查看當前系統的所有 Target $ systemctl list-unit-files --type=target# 查看一個 Target 包含的所有 Unit $ systemctl list-dependencies multi-user.target# 查看啟動時的默認 Target $ systemctl get-default# 設置啟動時的默認 Target $ sudo systemctl set-default multi-user.target# 切換 Target 時,默認不關閉前一個 Target 啟動的進程, # systemctl isolate 命令改變這種行為, # 關閉前一個 Target 里面所有不屬于后一個 Target 的進程 $ sudo systemctl isolate multi-user.target?
target(Systemd) 與 runlevel(SysVinit)對應關系
| 0 | runlevel0.target | poweroff.target | 關閉系統 |
| 1 | runlevel1.target | rescue.target | 單用戶模式 |
| 2 | runlevel2.target | multi-user.target | 非圖形化,用戶可以通過多個控制臺或網絡登錄 |
| 3 | runlevel3.target | multi-user.target | 用戶定義/域特定運行級別,默認等同于 2 |
| 4 | runlevel4.target | multi-user.target | 用戶定義/域特定運行級別,默認等同于 2 |
| 5 | runlevel5.target | graphical.target | 多用戶,圖形化。通常為所有運行級別 3 的服務外加圖形化登錄 |
| 6 | runlevel6.target | reboot.target | 重啟 |
?
與傳統/sbin/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 。
# 查看所有日志(默認情況下 ,只保存本次啟動的日志) $ sudo journalctl# 查看內核日志(不顯示應用日志) $ sudo journalctl -k# 查看系統本次啟動的日志 $ sudo journalctl -b $ sudo journalctl -b -0# 查看指定時間的日志 $ sudo journalctl --since="2012-10-30 18:17:16" $ sudo journalctl --since "20 min ago" $ sudo journalctl --since yesterday $ sudo journalctl --since "2015-01-10" --until "2015-01-11 03:00" $ sudo journalctl --since 09:00 --until "1 hour ago"# 查看指定服務的日志 $ sudo journalctl /usr/lib/systemd/systemd# 查看指定進程的日志 $ sudo journalctl _PID=1# 查看指定用戶的日志 $ sudo journalctl _UID=33 --since today# 查看某個路徑的腳本的日志 $ sudo journalctl /usr/bin/bash# 查看某個 Unit 的日志 $ sudo journalctl -u nginx.service $ sudo journalctl -u nginx.service --since today# 以 JSON 格式(多行)輸出,可讀性更好 $ sudo journalctl -b -u nginx.serviceqq-o json-pretty?
內容參考:Systemd 入門教程:命令篇 - 阮一峰的網絡日志 (ruanyifeng.com)
總結
以上是生活随笔為你收集整理的Systemd 入门及常用命令的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Linux文件系统映像:Initranf
- 下一篇: Linux内核功能及架构