systemd工具介绍
文章目錄
- 一、背景
- 二、命令
- 1、systemctl(主命令,用于管理系統)
- 2、systemd-analyze(用于查看啟動耗時)
- 3、hostnamectl(用于查看當前主機的信息)
- 4、localectl(用于查看本地化設置)
- 5、timedatectl(用于查看當前時區設置)
- 6、loginctl(用于查看當前登錄的用戶)
- 三、Unit(單元)
- 1、分類
- 2、狀態
- 3、管理
- 4、依賴關系
- 四、Unit配置文件
- 1、概述
- 2、狀態
- 3、格式
- 3、區塊
- (1)[Unit]
- (2)[Service]
- (3)[Install]
- 五、Target
- 六、日志管理
一、背景
????????systemd是一個專用于Linux操作系統的系統與服務管理器。 當作為啟動進程(PID=1)運行時, 它將作為初始化系統運行, 也就是啟動并維護各種用戶空間的服務。
二、命令
????????systemd并不是一個命令,而是一組命令,涉及到系統管理的方方面面。
1、systemctl(主命令,用于管理系統)
- systemctl --version:查看版本。
- systemctl reboot:重啟系統。
- systemctl poweroff:關閉系統,切斷電源。
- systemctl halt:CPU停止工作。
- systemctl suspend:暫停系統。
- systemctl hibernate:讓系統進入冬眠狀態。
- systemctl hybrid-sleep:讓系統進入交互式休眠狀態。
- systemctl rescue:啟動進入救援狀態(單用戶狀態)。
2、systemd-analyze(用于查看啟動耗時)
- systemd-analyze:查看啟動耗時。
- systemd-analyze blame:查看每個服務的啟動耗時。
- systemd-analyze critical-chain:顯示瀑布狀的啟動過程流。
- systemd-analyze critical-chain 單元.service:顯示指定服務的啟動流。
- systemd-analyze plot > startup.svg:應用和服務啟動時間火焰圖。如:
3、hostnamectl(用于查看當前主機的信息)
- hostnamectl:顯示當前主機的信息。
- hostnamectl set-hostname 主機名:設置主機名。
4、localectl(用于查看本地化設置)
- localectl:查看本地化設置。
- localectl set-locale LANG=en_GB.utf8
localectl set-keymap en_GB
設置本地化參數。
5、timedatectl(用于查看當前時區設置)
- timedatectl:查看當前時區設置。
- timedatectl list-timezones:顯示所有可用的時區。
- timedatectl set-timezone America/New_York
timedatectl set-time YYYY-MM-DD
timedatectl set-time HH:MM:SS - timedatectl set-ntp 開關[true, false]:開啟/關閉ntp(網絡時間同步)。
設置當前時區。
6、loginctl(用于查看當前登錄的用戶)
- loginctl list-sessions:列出當前session。
- loginctl list-users:列出當前登錄用戶。
- loginctl show-user root:列出顯示指定用戶的信息。
三、Unit(單元)
1、分類
????????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:定時器。
命令
- systemctl list-units:查看當前系統的所有Unit。
- systemctl list-units --all:列出所有Unit,包括沒有找到配置文件的或者啟動失敗的。
- systemctl list-units --all --state=inactive:列出所有沒有運行的Unit。
- systemctl list-units --failed:列出所有加載失敗的Unit。
- systemctl list-units --type=service:列出所有正在運行的、類型為service的Unit。
2、狀態
- systemctl status:顯示系統狀態。
- sysystemctl status 單元.service:顯示單個Unit的狀態。
- systemctl -H root@192.168.1.100 status 單元.service:顯示遠程主機的某個Unit的狀態。
- systemctl is-active 單元.service:顯示某個Unit是否正在運行。
- systemctl is-failed 單元.service:顯示某個Unit是否處于啟動失敗狀態。
- systemctl is-enabled 單元.service:顯示某個Unit是否建立了啟動鏈接。
3、管理
- systemctl start 單元.service:立即啟動一個服務。
- systemctl stop 單元.service:立即停止一個服務。
- systemctl restart 單元.service:重啟一個服務。
- systemctl kill 單元.service:殺死一個服務的所有子進程。
- systemctl reload 單元.service:重新加載一個服務的配置文件。
- systemctl show 單元.service:顯示某個Unit的所有底層參數。
- systemctl daemon-reload:重載所有修改過的配置文件。
- systemctl show -p CPUShares 單元.service:顯示某個Unit的指定屬性的值。
- systemctl set-property httpd.service CPUShares=500:設置某個Unit的指定屬性。
4、依賴關系
????????Unit之間存在依賴關系:A依賴于B,就意味著systemd在啟動A的時候,同時會去啟動B。
- systemctl list-dependencies 單元.service:列出一個Unit的所有依賴。
????????上面命令的輸出結果之中,有些依賴是Target類型(詳見下文),默認不會展開顯示。如果要展開Target,就需要使用--all參數。
- systemctl list-dependencies --all 單元.service
四、Unit配置文件
1、概述
????????每一個Unit都有一個配置文件,告訴systemd怎么啟動這個Unit 。systemd默認從目錄/etc/systemd/system/讀取配置文件,但是里面存放的大部分文件都是符號鏈接,指向目錄/usr/lib/systemd/system/(真正的配置文件存放在該目錄)。systemctl enable命令用于在上面兩個目錄之間,建立符號鏈接關系。
systemctl enable test.service 等同于 ln -s '/usr/lib/systemd/system/test.service' '/etc/systemd/system/multi-user.target.wants/test.service'????????如果配置文件里面設置了開機啟動,systemctl enable命令相當于激活開機啟動。與之對應的systemctl disable命令用于在兩個目錄之間,撤銷符號鏈接關系,相當于撤銷開機啟動。
systemctl disable test.service????????配置文件的后綴名,就是該Unit的種類,比如sshd.socket。如果省略,systemd默認后綴名為.service,所以sshd會被理解成sshd.service。
2、狀態
- systemctl list-unit-files:列出所有配置文件。
- systemctl list-unit-files --type=service:列出指定類型的配置文件。
- systemctl list-unit-files:輸出一個列表,列表顯示每個配置文件的狀態,一共有4種:
- enabled:已建立啟動鏈接。
- disabled:沒建立啟動鏈接。
- static:該配置文件沒有[Install]部分(無法執行),只能作為其他配置文件的依賴。
- masked:該配置文件被禁止建立啟動鏈接。
????????一旦修改配置文件,就要讓systemd重新加載配置文件,然后重新啟動,否則修改不會生效。
systemctl daemon-reload systemctl restart 單元.service3、格式
????????配置文件就是普通的文本文件,可以用文本編輯器打開。systemctl cat 單元.service命令可以查看配置文件的內容。例如:
root@jaron:/home# systemctl cat sshd # /lib/systemd/system/ssh.service [Unit] Description=OpenBSD Secure Shell server After=network.target auditd.service ConditionPathExists=!/etc/ssh/sshd_not_to_be_run[Service] EnvironmentFile=-/etc/default/ssh ExecStartPre=/usr/sbin/sshd -t ExecStart=/usr/sbin/sshd -D $SSHD_OPTS ExecReload=/usr/sbin/sshd -t ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartPreventExitStatus=255 Type=notify[Install] WantedBy=multi-user.target Alias=sshd.service root@jaron:/#????????從上面的輸出可以看到,配置文件分成幾個區塊。每個區塊的第一行,是用方括號表示的區別名,比如[Unit]。每個區塊內部是一些等號連接的鍵值對。注意: 配置文件的區塊名和字段名都是大小寫敏感的,鍵值對的等號兩側不能有空格。
3、區塊
完整字段清單。
(1)[Unit]
????????[Unit]區塊通常是配置文件的第一個區塊,用來定義Unit的元數據,以及配置與其他Unit的關系。它的主要字段如下:
- Description:簡短描述。
- Documentation:文檔地址。
- DefaultDependencies:是否關閉默認依賴,值為[yes, no],默認為yes。注意: 當After字段指定為graphical.target(表示等界面系統啟動后才啟動)時,則本字段需要設置為no才生效。
- Requires:當前Unit依賴的其他Unit,如果它們沒有運行,當前Unit會啟動失敗。
- Wants:與當前Unit配合的其他Unit,如果它們沒有運行,當前Unit不會啟動失敗。
- BindsTo:與Requires類似,它指定的Unit如果退出,會導致當前Unit停止運行。
- Before:如果該字段指定的Unit也要啟動,那么必須在當前Unit之后啟動。
- After:如果該字段指定的Unit也要啟動,那么必須在當前Unit之前啟動。
- Conflicts:這里指定的Unit不能與當前Unit同時運行。
- Condition...:當前Unit運行必須滿足的條件,否則不會運行。
- Assert...:當前Unit運行必須滿足的條件,否則會報啟動失敗。
(2)[Service]
????????[Service]區塊用來Service的配置,只有Service類型的Unit才有這個區塊。它的主要字段如下:
- Type:定義啟動時的進程行為。它有以下幾種值。
- Type=simple:默認值,執行ExecStart指定的命令,啟動主進程。
- Type=forking:以fork方式從父進程創建子進程,創建后父進程會立即退出。
- Type=oneshot:一次性進程,systemd會等當前服務退出,再繼續往下執行。
- Type=dbus:當前服務通過D-Bus啟動。
- Type=notify:當前服務啟動完畢,會通知systemd,再繼續往下執行。
- Type=idle:若有其他任務執行完畢,當前服務才會運行。
- ExecStart:啟動當前服務的命令。
- ExecStartPre:啟動當前服務之前執行的命令。
- ExecStartPost:啟動當前服務之后執行的命令。
- ExecReload:重啟當前服務時執行的命令。
- ExecStop:停止當前服務時執行的命令。
- ExecStopPost:停止當前服務之后執行的命令。
- RestartSec:自動重啟當前服務間隔的秒數。
- Restart:定義何種情況systemd會自動重啟當前服務,可能的值包括always(總是重啟)、on-success、on-failure、on-abnormal、on-abort、on-watchdog。
- TimeoutSec:定義systemd停止當前服務之前等待的秒數。
- Environment:指定環境變量。
(3)[Install]
????????[Install]通常是配置文件的最后一個區塊,用來定義如何啟動,以及是否開機啟動。它的主要字段如下:
- WantedBy:它的值是一個或多個Target,當前Unit激活時(enable)符號鏈接會放入/etc/systemd/system目錄下面名稱為Target名.wants子目錄中。
- RequiredBy:它的值是一個或多個Target,當前Unit 激活時,符號鏈接會放入/etc/systemd/system目錄下面名稱為Target名.required的子目錄中。
- Alias:當前Unit可用于啟動的別名。
- Also:當前Unit激活(enable)時,會被同時激活的其他Unit。
五、Target
????????啟動計算機的時候,需要啟動大量的Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些Unit,顯然非常不方便。systemd的解決方案就是Target。
????????簡單說,Target就是一個Unit組,包含許多相關的Unit 。啟動某個Target的時候,systemd就會啟動里面所有的Unit。從這個意義上說,Target這個概念類似于"狀態點",啟動某個Target就好比啟動到某種狀態。
????????傳統的init啟動模式里面,有RunLevel的概念,跟Target的作用很類似。不同的是,RunLevel是互斥的,不可能多個RunLevel同時啟動,但是多個Target可以同時啟動。
- systemctl list-unit-files --type=target:查看當前系統的所有Target。
- systemctl list-dependencies multi-user.target:查看一個Target包含的所有Unit。
- systemctl get-default:查看啟動時的默認Target。
- systemctl set-default multi-user.target:設置啟動時的默認Target。
- systemctl isolate multi-user.target:關閉前一個Target里面所有不屬于后一個Target的進程。
????????Target與傳統RunLevel 的對應關系如下:
| 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 |
| ????????它與init進程的主要差別如下: |
- 默認的 RunLevel(在/etc/inittab文件設置)現在被默認的Target取代,位置是/etc/systemd/system/default.target,通常符號鏈接到graphical.target(圖形界面)或者multi-user.target(多用戶命令行)。
- 啟動腳本的位置,以前是/etc/init.d目錄,符號鏈接到不同的RunLevel目錄 (比如/etc/rc3.d、/etc/rc5.d等),現在則存放在/lib/systemd/system和/etc/systemd/system目錄。
- 配置文件的位置,以前init進程的配置文件是/etc/inittab,各種服務的配置文件存放在/etc/sysconfig目錄。現在的配置文件主要存放在/lib/systemd目錄,在/etc/systemd目錄里面的修改可以覆蓋原始設置。
六、日志管理
????????systemd統一管理所有Unit的啟動日志。帶來的好處就是,可以只用journalctl一個命令,查看所有日志(內核日志和應用日志)。日志的配置文件是/etc/systemd/journald.conf。
- journalctl:查看所有日志(默認情況下 ,只保存本次啟動的日志)。
- journalctl -k:查看內核日志(不顯示應用日志)。
- 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"
查看指定時間的日志。 - journalctl -n:顯示尾部的最新10行日志。
- journalctl -n 行數:顯示尾部指定行數的日志。
- journalctl -f:實時滾動顯示最新日志。
- journalctl _PID=1:查看指定進程的日志。
- journalctl /usr/bin/bash:查看某個路徑的腳本的日志。
- journalctl _UID=33 --since today:查看指定用戶的日志。
- journalctl -u 單元.service
journalctl -u 單元.service --since today
查看某個Unit的日志。 - journalctl -u 單元.service -f:實時滾動顯示某個Unit的最新日志。
- journalctl -u 單元1.service -u 單元2.service --since today:合并顯示多個Unit的日志。
- journalctl -p err -b:查看指定優先級(及其以上級別)的日志,共有8級:
- 0: emerg
- 1: alert
- 2: crit
- 3: err
- 4: warning
- 5: notice
- 6: info
- 7: debug
- journalctl --no-pager:日志默認分頁輸出,--no-pager改為正常的標準輸出。
- journalctl -b -u 單元.service -o json:以JSON格式(單行)輸出。
- journalctl -b -u 單元.serviceqq -o json-pretty:以JSON格式(多行)輸出,可讀性更好。
- journalctl --disk-usage:顯示日志占據的硬盤空間。
- journalctl --vacuum-size=1G:指定日志文件占據的最大空間。
- journalctl --vacuum-time=1years:指定日志文件保存多久。
總結
以上是生活随笔為你收集整理的systemd工具介绍的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: doodoo.js发布1.1.0 --
- 下一篇: date format picture