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