日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Linux Systemd 詳細介紹: Unit、Unit File、Systemctl、Target

 曾淼Mark 2020-09-14

Systemd

簡介

CentOS 7 使用 Systemd 替換了SysV

Ubuntu 從 15.04 開始使用 Systemd

Systemd 是 Linux 系統(tǒng)工具,用來啟動守護進程,已成為大多數(shù)發(fā)行版的標(biāo)準(zhǔn)配置

特點

優(yōu)點:

  1. 按需啟動進程,減少系統(tǒng)資源消耗

  2. 并行啟動進程,提高系統(tǒng)啟動速度

    在 SysV-init 時代,將每個服務(wù)項目編號,依次執(zhí)行啟動腳本。Ubuntu 的 Upstart 解決了沒有直接依賴的啟動之間的并行啟動。而 Systemd 通過 Socket 緩存、DBus 緩存和建立臨時掛載點等方法進一步解決了啟動進程之間的依賴,做到了所有系統(tǒng)服務(wù)并發(fā)啟動。對于用戶自定義的服務(wù),Systemd 允許配置其啟動依賴項目,從而確保服務(wù)按必要的順序運行。

    SystemV Upstart 參考上一篇博文:Linux 初始化系統(tǒng) SystemV Upstart

  3. 使用 CGroup 監(jiān)視和管理進程的生命周期

    CGroup 提供了類似文件系統(tǒng)的接口,當(dāng)進程創(chuàng)建子進程時,子進程會繼承父進程的 CGroup。因此無論服務(wù)如何啟動新的子進程,所有的這些相關(guān)進程都會屬于同一個 CGroup

    在 Systemd 之前的主流應(yīng)用管理服務(wù)都是使用 進程樹 來跟蹤應(yīng)用的繼承關(guān)系的,而進程的父子關(guān)系很容易通過 兩次 fork 的方法脫離。

    而 Systemd 則提供通過 CGroup 跟蹤進程關(guān)系,引補了這個缺漏。通過 CGroup 不僅能夠?qū)崿F(xiàn)服務(wù)之間訪問隔離,限制特定應(yīng)用程序?qū)ο到y(tǒng)資源的訪問配額,還能更精確地管理服務(wù)的生命周期

  4. 統(tǒng)一管理服務(wù)日志

  5. 支持快照和系統(tǒng)恢復(fù)

缺點:

  1. 過于復(fù)雜,與操作系統(tǒng)的其他部分強耦合,違反"keep simple, keep stupid"的Unix 哲學(xué)

架構(gòu)圖

Unit(單元|服務(wù))

Systemd 可以管理所有系統(tǒng)資源:

  1. 將系統(tǒng)資源劃分為12類
  2. 將每個系統(tǒng)資源稱為一個 Unit。Unit 是 Systemd 管理系統(tǒng)資源的基本單位
  3. 使用一個 Unit File 作為 Unit 的單元文件,Systemd 通過單元文件控制 Unit 的啟動

例如,MySQL服務(wù)被 Systemd 視為一個 Unit,使用一個 mysql.service 作為啟動配置文件

Unit File(單元文件|配置文件)

單元文件中包含該單元的描述、屬性、啟動命令等

類型

Systemd 將系統(tǒng)資源劃分為12類,對應(yīng)12種類型的單元文件

系統(tǒng)資源類型 單元文件擴展名 單元文件描述
Service .service 封裝守護進程的啟動、停止、重啟和重載操作,是最常見的一種 Unit 文件
Target .target 定義 target 信息及依賴關(guān)系,一般僅包含 Unit 段
Device .device 對于 /dev 目錄下的硬件設(shè)備,主要用于定義設(shè)備之間的依賴關(guān)系
Mount .mount 定義文件系統(tǒng)的掛載點,可以替代過去的 /etc/fstab 配置文件
Automount .automount 用于控制自動掛載文件系統(tǒng),相當(dāng)于 SysV-init 的 autofs 服務(wù)
Path .path 用于監(jiān)控指定目錄或文件的變化,并觸發(fā)其它 Unit 運行
Scope .scope 這種 Unit 文件不是用戶創(chuàng)建的,而是 Systemd 運行時產(chǎn)生的,描述一些系統(tǒng)服務(wù)的分組信息
Slice .slice 用于表示一個 CGroup 的樹
Snapshot .snapshot 用于表示一個由 systemctl snapshot 命令創(chuàng)建的 Systemd Units 運行狀態(tài)快照,可以切回某個快照
Socket .socket 監(jiān)控來自于系統(tǒng)或網(wǎng)絡(luò)的數(shù)據(jù)消息
Swap .swap 定義一個用戶做虛擬內(nèi)存的交換分區(qū)
Timer .timer 用于配置在特定時間觸發(fā)的任務(wù),替代了 Crontab 的功能

對于操作單元文件的命令,如果缺省擴展名,則默認.service擴展名

而操作 target 的命令,例如 isolate,則默認.target擴展名

語法

單元文件的語法來源于 XDG桌面入口配置文件.desktop文件

Unit 文件可以分為三個配置區(qū)段:

  • Unit 段:所有 Unit 文件通用,用來定義 Unit 的元數(shù)據(jù),以及配置與其他 Unit 的關(guān)系
  • Install 段:所有 Unit 文件通用,用來定義如何啟動,以及是否開機啟動
  • Service 段:服務(wù)(Service)類型的 Unit 文件(后綴為 .service)特有的,用于定義服務(wù)的具體管理和執(zhí)行動作

單元文件中的區(qū)段名和字段名大小寫敏感

每個區(qū)段內(nèi)都是一些等號連接的鍵值對(鍵值對的等號兩側(cè)不能有空格)

Unit 段

主要字段如下:

  • Description:當(dāng)前服務(wù)的簡單描述

  • Documentation:文檔地址,可以是一個或多個文檔的 URL 路徑

    【依賴關(guān)系】

  • Requires:與其它 Unit 的強依賴關(guān)系,如果其中任意一個 Unit 啟動失敗或異常退出,當(dāng)前 Unit 也會被退出

  • Wants:與其它 Unit 的弱依賴關(guān)系,如果其中任意一個 Unit 啟動失敗或異常退出,不影響當(dāng)前 Unit 繼續(xù)執(zhí)行

    只涉及依賴關(guān)系,默認情況下 兩個 Unit 同時啟動

    【啟動順序】

  • After:該字段指定的 Unit 全部啟動完成以后,才會啟動當(dāng)前 Unit

  • Before:該字段指定的 Unit 必須在當(dāng)前 Unit 啟動完成之后再啟動

    只涉及啟動順序,不影響啟動結(jié)果和運行情況

  • Binds To:與 Requires 相似,該字段指定的 Unit 如果退出,會導(dǎo)致當(dāng)前 Unit 停止運行

  • Part Of:一個 Bind To 作用的子集,僅在列出的 Unit 失敗或重啟時,終止或重啟當(dāng)前 Unit,而不會隨列出Unit 的啟動而啟動

http://manpages./manpages/bionic/en/man5/systemd.unit.5.html

Install 段

主要字段如下:

  • WantedBy:它的值是一個或多個 target,執(zhí)行enable命令時,符號鏈接會放入/etc/systemd/system目錄下以 target 名 + .wants后綴構(gòu)成的子目錄中
  • RequiredBy:它的值是一個或多個 target,執(zhí)行enable命令時,符號鏈接會放入/etc/systemd/system目錄下以 target 名 + .required后綴構(gòu)成的子目錄中
  • Alias:當(dāng)前 Unit 可用于啟動的別名
  • Also:當(dāng)前 Unit 被 enable/disable 時,會被同時操作的其他 Unit

http://manpages./manpages/bionic/en/man5/systemd.unit.5.html

Service 段

主要字段如下:

【啟動類型】

  • Type:定義啟動時的進程行為。它有以下幾種值。
    • Type=simple:默認值,ExecStart字段啟動的進程為主進程
      • 服務(wù)進程不會 fork,如果該服務(wù)要啟動其他服務(wù),不要使用此類型啟動,除非該服務(wù)是 socket 激活型
    • Type=forkingExecStart字段將以fork()方式從父進程創(chuàng)建子進程啟動,創(chuàng)建后父進程會立即退出,子進程成為主進程。
      • 通常需要指定PIDFile字段,以便 Systemd 能夠跟蹤服務(wù)的主進程
      • 對于常規(guī)的守護進程(daemon),除非你確定此啟動方式無法滿足需求,使用此類型啟動即可
    • Type=oneshot:只執(zhí)行一次,Systemd 會等當(dāng)前服務(wù)退出,再繼續(xù)往下執(zhí)行
      • 適用于只執(zhí)行一項任務(wù)、隨后立即退出的服務(wù)
      • 通常需要指定RemainAfterExit=yes字段,使得 Systemd 在服務(wù)進程退出之后仍然認為服務(wù)處于激活狀態(tài)
    • Type=dbus:當(dāng)前服務(wù)通過 D-Bus 信號啟動。當(dāng)指定的 BusName 出現(xiàn)在 DBus 系統(tǒng)總線上時,Systemd認為服務(wù)就緒
    • Type=notify:當(dāng)前服務(wù)啟動完畢會發(fā)出通知信號,通知 Systemd,然后 Systemd 再啟動其他服務(wù)
    • Type=idle:Systemd 會等到其他任務(wù)都執(zhí)行完,才會啟動該服務(wù)。
      • 一種使用場合是:讓該服務(wù)的輸出,不與其他服務(wù)的輸出相混合

【啟動行為】

  • ExecStart:啟動當(dāng)前服務(wù)的命令

    ExecStart=/bin/echo execstart1
    ExecStart=
    ExecStart=/bin/echo execstart2
    

    順序執(zhí)行設(shè)定的命令,把字段置空,表示清除之前的值

  • ExecStartPre:啟動當(dāng)前服務(wù)之前執(zhí)行的命令

  • ExecStartPost:啟動當(dāng)前服務(wù)之后執(zhí)行的命令

  • ExecReload:重啟當(dāng)前服務(wù)時執(zhí)行的命令

  • ExecStop:停止當(dāng)前服務(wù)時執(zhí)行的命令

  • ExecStopPost:停止當(dāng)前服務(wù)之后執(zhí)行的命令

  • RemainAfterExit:當(dāng)前服務(wù)的所有進程都退出的時候,Systemd 仍認為該服務(wù)是激活狀態(tài)

    • 這個配置主要是提供給一些并非常駐內(nèi)存,而是啟動注冊后立即退出,然后等待消息按需啟動的特殊類型服務(wù)使用的
  • TimeoutSec:定義 Systemd 停止當(dāng)前服務(wù)之前等待的秒數(shù)

    注:所有的啟動設(shè)置之前,都可以加上一個連詞號(-),表示"抑制錯誤",即發(fā)生錯誤的時候,不影響其他命令的執(zhí)行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等號后面的那個連詞號),就表示即使/etc/sysconfig/sshd文件不存在,也不會拋出錯誤。

【重啟行為】

  • RestartSec:Systemd 重啟當(dāng)前服務(wù)間隔的秒數(shù)
  • KillMode:定義 Systemd 如何停止服務(wù),可能的值包括:
    • control-group(默認值):當(dāng)前控制組里面的所有子進程,都會被殺掉
    • process:只殺主進程(sshd 服務(wù),推薦值)
    • mixed:主進程將收到 SIGTERM 信號,子進程收到 SIGKILL 信號
    • none:沒有進程會被殺掉,只是執(zhí)行服務(wù)的 stop 命令。
  • Restart:定義何種情況 Systemd 會自動重啟當(dāng)前服務(wù),可能的值包括:
    • no(默認值):退出后不會重啟
    • on-success:只有正常退出時(退出狀態(tài)碼為0),才會重啟
    • on-failure:非正常退出時(退出狀態(tài)碼非0),包括被信號終止和超時,才會重啟(守護進程,推薦值)
    • on-abnormal:只有被信號終止和超時,才會重啟(對于允許發(fā)生錯誤退出的服務(wù),推薦值)
    • on-abort:只有在收到?jīng)]有捕捉到的信號終止時,才會重啟
    • on-watchdog:超時退出,才會重啟
    • always:不管是什么退出原因,總是重啟

【上下文】

  • PIDFile:指向當(dāng)前服務(wù) PID file 的絕對路徑。

  • User:指定運行服務(wù)的用戶

  • Group:指定運行服務(wù)的用戶組

  • EnvironmentFile:指定當(dāng)前服務(wù)的環(huán)境參數(shù)文件。該文件內(nèi)部的key=value鍵值對,可以用$key的形式,在當(dāng)前配置文件中獲取

    啟動sshd,執(zhí)行的命令是/usr/sbin/sshd -D $OPTIONS,其中的變量$OPTIONS就來自EnvironmentFile字段指定的環(huán)境參數(shù)文件。

http://manpages./manpages/bionic/en/man5/systemd.service.5.html

占位符

在 Unit 文件中,有時會需要使用到一些與運行環(huán)境有關(guān)的信息,例如節(jié)點 ID、運行服務(wù)的用戶等。這些信息可以使用占位符來表示,然后在實際運行中動態(tài)地替換為實際的值。

詳細了解見 https://cloud.tencent.com/developer/article/1516125

模板

在現(xiàn)實中,往往有一些應(yīng)用需要被復(fù)制多份運行,就會用到模板文件

模板文件的寫法與普通單元文件基本相同,只是模板文件名是以 @ 符號結(jié)尾。例如:apache@.service

通過模板文件啟動服務(wù)實例時,需要在其文件名的 @ 字符后面附加一個用于區(qū)分服務(wù)實例的參數(shù)字符串,通常這個參數(shù)是用于監(jiān)控的端口號或控制臺 TTY 編譯號

systemctl start apache@8080.service

Systemd 在運行服務(wù)時,首先尋找跟單元名完全匹配的單元文件,如果沒有找到,才會嘗試選擇匹配模板

例如上面的命令,System 首先會在約定的目錄下尋找名為 apache@8080.service 的單元文件,如果沒有找到,而文件名中包含 @ 字符,它就會嘗試去掉后綴參數(shù)匹配模板文件。對于 apache@8080.service,Systemd 會找到 apache@.service 模板文件,并通過這個模板文件將服務(wù)實例化。

詳細了解見 https://cloud.tencent.com/developer/article/1516125

狀態(tài)

systemctl list-unit-files 將會列出文件的 state,包括 static, enabled, disabled, masked, indirect

  • masked

    service軟鏈接到/dev/null

    該單元文件被禁止建立啟動鏈接

  • static

    該單元文件沒有[Install]部分(無法執(zhí)行),只能作為其他配置文件的依賴

  • enabled

    已建立啟動鏈接

  • disabled

    沒建立啟動鏈接

https://ask/a/731674

示例

  1. 關(guān)掉觸摸板配置文件

    Unit]
    Description=Switch-off Touchpad
    
    [Service]
    Type=oneshot
    ExecStart=/usr/bin/touchpad-off start
    ExecStop=/usr/bin/touchpad-off stop
    RemainAfterExit=yes
    
    [Install]
    WantedBy=multi-user.target
    
    • oneshot 表明這個服務(wù)只要運行一次就夠了,不需要長期運行
    • RemainAfterExit字段設(shè)為yes,表示進程退出以后,服務(wù)仍然保持執(zhí)行。這樣的話,一旦使用systemctl stop命令停止服務(wù),ExecStop指定的命令就會執(zhí)行,從而重新開啟觸摸板

Systemd 內(nèi)建命令

systemd-analyze

Analyze and debug system manager, If no command is passed, Systemd-analyze time is implied

https://www./software/systemd/man/systemd-analyze.html

systemd-analyze time

查看初始化耗時

systemd-analyze blame

打印所有運行單元,按它們初始化的時間排序。此信息可用于優(yōu)化啟動時間。注意,輸出可能具有誤導(dǎo)性,因為一個服務(wù)的初始化可能非常緩慢,因為它等待另一個服務(wù)的初始化完成

systemd-run

將一個指定的服務(wù)變成后臺服務(wù)

未測試

參考 https://www./software/systemd/man/systemd-run.html

systemctl 系統(tǒng)服務(wù)管理命令

systemctl是 Systemd 的主命令,用于管理系統(tǒng)

與 service 命令的區(qū)別

  1. systemctl 融合了 service 和 chkconfig 的功能
  2. 在 Ubuntu18.04 中沒有自帶 chkconfig 命令;service 命令實際上重定向到 systemctl 命令
動作 SysV Init 指令 Systemd 指令
啟動某服務(wù) service httpd start systemctl start httpd
停止某服務(wù) service httpd stop systemctl stop httpd
重啟某服務(wù) service httpd restart systemctl restart httpd
檢查服務(wù)狀態(tài) service httpd status systemctl status httpd
刪除某服務(wù) chkconfig --del httpd 停掉應(yīng)用,刪除其配置文件
使服務(wù)開機自啟動 chkconfig --level 5 httpd on systemctl enable httpd
使服務(wù)開機不自啟動 chkconfig --level 5 httpd off systemctl disable httpd
查詢服務(wù)是否開機自啟 chkconfig --list | grep httpd systemctl is-enabled httpd
加入自定義服務(wù) chkconfig --add test systemctl load test
顯示所有已啟動的服務(wù) chkconfig --list systemctl list-unit-files | grep enabled

參數(shù)

--all

顯示加載到內(nèi)存的所有單元

--type

-t --type=

顯示指定類型(12種類型)的單元

--state

--state=

顯示指定狀態(tài)的單元或單元文件

  • 單元狀態(tài)

    輸入 systemctl list-units --stateTab鍵,顯示所有可用的值

  • 單元文件狀態(tài)

    另外還可以用 enabled static disabled 等systemctl list-unit-files 顯示的狀態(tài)

--failed

--state=failed

顯示加載失敗的單元

 systemctl --failed
--version

打印 Systemd 版本

lfp@legion:/lib/systemd/system$ systemctl --version
Systemd 237
+PAM +AUDIT +SELINUX +IMA +APPARMOR +SMACK +SYSVINIT +UTMP +LIBCRYPTSETUP +GCRYPT +GNUTLS +ACL +XZ +LZ4 +SECCOMP +BLKID +ELFUTILS +KMOD -IDN2 +IDN -PCRE2 default-hierarchy=hybrid

單元命令

我的理解

  • systemd 對單元的管理,不涉及單元文件自身屬性和內(nèi)容
list-units

相當(dāng)于systemctl

列出當(dāng)前已加載的單元(內(nèi)存)

默認情況下僅顯示處于激活狀態(tài)(正在運行)的單元

UNIT 單元名

LOAD 加載狀態(tài)

ACTIVE SUB 執(zhí)行狀態(tài)(大狀態(tài) 子狀態(tài))

DESCRIPTION 描述

start

啟動單元

systemctl start mysql.service
stop

停止單元

systemctl stop mysql.service
kill

殺掉單元進程

systemctl kill mysql.service
reload

不終止單元,重新加載 針對該單元的 運行配置文件,而不是 針對 systemd的 該單元的啟動配置文件

例如啟動 MySQL 服務(wù),reload 可以在不停止服務(wù)的情況下重載 MySQL 的配置文件 my.cnf

restart

重啟單元

該單元在重啟之前擁有的資源不會被完全清空,比如文件描述符存儲設(shè)施

systemctl reload mysql.service
status

status [unit | PID]

顯示單元或進程所屬單元的運行信息

systemctl status mysql.service

Loaded行:配置文件的位置,是否設(shè)為開機啟動

Active行:表示正在運行

Main PID行:主進程ID

CGroup塊:應(yīng)用的所有子進程

日志塊:應(yīng)用的日志

is-active

判斷指定的單元是否處于激活狀態(tài)

# 默認會打印當(dāng)前單元的狀態(tài),可以通過 --quiet 參數(shù)取消打印
lfp@legion:~$ systemctl is-active mysql
active
is-failed

判斷指定的單元是否處于啟動失敗狀態(tài)

lfp@legion:~$ systemctl is-failed mysql
active
list-dependencies

查看單元之間的依賴關(guān)系

systemctl list-dependencies graphical.target 
systemctl list-dependencies mysql.service
show

show --property= Unit ?=> show -p Unit

顯示單元所有底層參數(shù)

lfp@legion:~$ systemctl show -p MainPID mysql
MainPID=1061
set-property

在單元啟動的時候設(shè)置運行時的某個屬性,立即生效,并保存在磁盤中作為啟動配置

如果添加了--runtime則重啟后失效

并非所有的屬性都可以設(shè)置,只是 systemd.resource-control 包含的屬性

isolate

切換到某個 target(系統(tǒng)狀態(tài)),立即停止該 target 未包含的單元進程。也可以理解為切換 runlevel

如果沒有指定擴展名,則默認.target

只有當(dāng).target單元文件中的AllowIsolate=yes時,才能使用 isolate 切換;也可以用IgnoreOnIsolate=yes字段來拒絕使用 isolate 切換

systemctl isolate multi-user.target
cat

顯示單元配置文件的備份文件,包括插入式配置drop-ins,可以完整的看到單元服務(wù)的配置。注意這里打印的依據(jù)是磁盤的上內(nèi)容,如果用戶修改了配置文件(磁盤已修改)但是未執(zhí)行daemon-reload命令(內(nèi)存中未更新),那么該命令顯示的配置和實際執(zhí)行情況有出入

lfp@legion:~$ systemctl cat mysql.service 
# /lib/systemd/system/mysql.service
# MySQL Systemd service file

[Unit]
Description=MySQL Community Server
...

[Install]
WantedBy=multi-user.target

[Service]
Type=forking
...
# 這段就顯示的是 插入式配置 drop-in 的內(nèi)容
# /etc/systemd/system/mysql.service.d/mysql.conf
# MySQL Systemd service file

[Unit]
# Description=MySQL Community Server conf

[Service]
# ExecStartPost=/home/lfp/bin/espeak.sh

單元文件命令

我的理解

  • systemd 對單元文件自身屬性和內(nèi)容的管理
list-unit-files

列出所有已安裝的單元文件和它們的啟用狀態(tài)

list-units的區(qū)別是

  • list-units 僅顯示當(dāng)前已加載到內(nèi)存中的單元
  • list-unit-files 會讀取單元文件內(nèi)容,列出所有單元,包括存在于硬盤未加載進內(nèi)存的單元

實際測試結(jié)果:

systemctl list-unit-files 顯示“348 Unit files listed”

systemctl list-units --all 顯示“405 loaded units listed”

systemctl list-units 顯示 “232 loaded units listed”

enable

使某個單元開機自啟動

這會根據(jù)單元文件內(nèi)容中的[Install]指定的 target 組,創(chuàng)建一個軟鏈接

lfp@legion:/etc/systemd/system$ vim v2rayL.service
# 文件內(nèi)容 [Install] 段
......
[Install]
WantedBy=multi-user.target
......

lfp@legion:/etc/systemd/system$ systemctl is-enabled v2rayL.service 
disabled
lfp@legion:/etc/systemd/system$ systemctl enable v2rayL.service 
# 根據(jù) [Install] 段指定的組,添加軟鏈接
Created symlink /etc/systemd/system/multi-user.target.wants/v2rayL.service → /etc/systemd/system/v2rayL.service.
lfp@legion:/etc/systemd/system$ systemctl is-enabled v2rayL.service 
enabled
disable

取消某個單元開機自啟動設(shè)置,刪除軟鏈接

這會刪除所有指向該單元文件的軟鏈接,不僅僅是 enable 操作創(chuàng)建的

reenable

disable 和 enable 的結(jié)合,根據(jù)單元文件內(nèi)容中的 [Install] 段,重置軟鏈接

is-enabled

檢查某個單元是否是開機自啟動的(建立的啟動鏈接)

lfp@legion:~$ systemctl is-enabled mysql
enabled
get-default

獲取默認啟動 target,default-target 是指向該 target 的軟鏈接

set-default

設(shè)置默認啟動 target,同時修改 default-target 指向設(shè)定的 target

systemctl set-default multi-user.target

生命周期管理命令

daemon-reload

重新加載所有的單元文件和依賴關(guān)系

對單元文件有修改的時候,需要執(zhí)行該命令重新加載文件內(nèi)容

系統(tǒng)管理命令

reboot
systemctl reboot

重啟系統(tǒng)(異步操作)

it will return after the reboot operation is enqueued, without waiting for it to complete

poweroff

關(guān)閉系統(tǒng),切斷電源(異步操作)

halt

僅CPU停止工作,其他硬件仍處于開機狀態(tài)(異步操作)

suspend

暫停系統(tǒng)(異步操作)

將觸發(fā)執(zhí)行suspend.target

hibernate

讓系統(tǒng)進入冬眠狀態(tài)(異步操作)

將觸發(fā)執(zhí)行hibernate.target

目錄、文件

/run/systemd/system/

單元(服務(wù))運行時生成的配置文件所在目錄 /etc/systemd/system/

系統(tǒng)或用戶自定義的配置文件,初始化過程中Systemd只執(zhí)行/etc/systemd/system目錄里面的配置文件

/lib/systemd/system/

軟件安裝時添加的配置文件,類似于 /etc/init.d/

對于支持 Systemd 的程序,安裝的時候,會自動的在 /lib/systemd/system 目錄添加一個配置文件

其他目錄都是軟鏈接

/etc/systemd/system/default.target

Systemd 執(zhí)行的第一個單元文件,符號鏈接到默認啟動 target 對應(yīng)的 .target 單元文件

優(yōu)先級

SysV 的啟動腳本放在/etc/init.d目錄下

Systemd 的單元文件放在/etc/systemd/system/lib/systemd/system目錄下

當(dāng)一個程序在3個目錄下都存在啟動方式時,優(yōu)先級是/etc/systemd/system --> /lib/systemd/system --> /etc/init.d

lfp@legion:/etc/init.d$ ll
-rwxr-xr-x   1 root root  5650 5月  19 22:09 mysql*

lfp@legion:/etc/systemd/system$ ll
-rw-r--r--  1 root root  511 5月  20 01:42  mysql.service

lfp@legion:/lib/systemd/system$ ll
-rw-r--r--  1 root root   499 5月  20 01:20  mysql.service
  • /etc/systemd/system 里面的同名service會覆蓋/lib/systemd/system 里面的

    注意查看文件信息,該同名文件不能是指向 /lib/systemd/system 的軟鏈接

    軟鏈接不會覆蓋而會同步

  • 如果某個程序不存在Systemd 單元文件,那么會執(zhí)行/etc/init.d里面的啟動腳本

根據(jù)啟動過程, /etc/systemd/system/multi-user.target.wants/ 目錄下是很多指向 /lib/systemd/system/目錄的軟鏈接,所以兩個目錄下的單元文件會互相同步。

如果/etc/systemd/system//etc/systemd/system/multi-user.target.wants/ 同時存在單元文件,測試發(fā)現(xiàn),不管是手動啟動還是開機自啟動,使用的都是 /etc/systemd/system/ 目錄下的service單元文件

測試
執(zhí)行/etc/init.d目錄下的腳本

mysql 修改 mysql.servicemysql.service.bak 然后通過service mysql restart啟動/etc/init.d/mysql腳本

下面是啟動后的一些信息

注:在恢復(fù)mysql.service之前,需要先通過service mysql stop 利用/etc/init.d/mysql腳本中的stop結(jié)束上面的進程,否則一旦恢復(fù),service mysql stop 執(zhí)行的操作就不是 /etc/init.d/mysql腳本中的stop,無法結(jié)束上面的進程,出現(xiàn)命令無法正常執(zhí)行的情況

結(jié)束上面的進程,恢復(fù)mysql.service,重新啟動

/etc/systemd/system 覆蓋測試

未修改前,查看MySQL的狀態(tài)

lfp@legion:~$ service mysql status
● mysql.service - MySQL Community Server
# 可以發(fā)現(xiàn)這里的 mysql.service 是在 /lib/systemd/system 下面
   Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: en
   Active: active (running) since Sat 2020-04-25 18:34:30 CST; 5h 33min ago
 Main PID: 988 (mysqld)
    Tasks: 28 (limit: 4915)
   CGroup: /system.slice/mysql.service
           └─988 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid

4月 25 18:34:30 legion Systemd[1]: Starting MySQL Community Server...
4月 25 18:34:30 legion Systemd[1]: Started MySQL Community Server.

將 /lib/systemd/system 下面的文件復(fù)制到 /etc/systemd/system/ 下面

sudo cp /lib/systemd/system/mysql.service /etc/systemd/system/

修改 mysql.service

sudo vim /etc/systemd/system/mysql.service

?

重啟 mysql.service ,系統(tǒng)提示需要重新加載

lfp@legion:~$ systemctl restart mysql.service 
Warning: The Unit file, source configuration file or drop-ins of mysql.service changed on disk. 
Run 'systemctl daemon-reload' to reload units.
lfp@legion:~$ systemctl daemon-reload#  重新加載
lfp@legion:~$ systemctl restart mysql.service # 重啟
lfp@legion:~$ systemctl status mysql.service 
● mysql.service - MySQL Community Server hahahaha# 發(fā)現(xiàn)這里是修改之后的,覆蓋了 /lib/systemd/lib 中的
#                                 這里也可以看到加載路徑
   Loaded: loaded (/etc/systemd/system/mysql.service; enabled; vendor preset: en
   Active: active (running) since Sun 【2020-04-26】 00:47:02 CST; 5s ago
  Process: 21590 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/m
  Process: 21581 ExecStartPre=/usr/share/mysql/mysql-Systemd-start pre (code=exi
 Main PID: 21592 (mysqld)
    Tasks: 27 (limit: 4915)
   CGroup: /system.slice/mysql.service
           └─21592 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pi

4月 26 00:47:02 legion Systemd[1]: Starting MySQL Community Server hahahaha...
4月 26 00:47:02 legion Systemd[1

Target

兩個含義

  1. 系統(tǒng)的某個狀態(tài)稱為一個 target(類似于"狀態(tài)點")

  2. 達到某個系統(tǒng)狀態(tài),所需的一個或多個資源(Unit)稱為一個 target(一個 Unit 組)

    1. target是一個抽象的系統(tǒng)資源,不像MySQL有實體

    2. 如果一個target只包含一個Unit,那么該 target,沒有對應(yīng)的目錄,指的就是這個 Unit

      例如 hibernate.target 只包含 systemd-hibernate.service一個Unit

      如果一個target包含多個Unit,那么該target,有對應(yīng)的 xxx.target.wants 目錄,指的是目錄里面所有的Unit

      例如 multi-user.target 包含位于/etc/systemd/system/multi-user.target.wants目錄下的多個 Unit

target也是一個 Target 類型的系統(tǒng)資源,有對應(yīng)的單元文件 xxx.target

Systemd 使用 target 來劃分和管理資源(Unit),啟動(激活)某個 xxx.target 單元文件,通過執(zhí)行該 target 包含的 Unit,使系統(tǒng)達到某種狀態(tài)

對于狀態(tài)點的理解:

例如,執(zhí)行systemd suspend命令讓系統(tǒng)暫停,會觸發(fā)啟動suspend.target,然后執(zhí)行里面的systemd-suspend.service Unit,使系統(tǒng)達到一個暫停的狀態(tài)

傳統(tǒng)的init啟動模式里面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動

啟動 target

runlevel是 SysV init 初始化系統(tǒng)中的概念,在Systemd初始化系統(tǒng)中使用的是 Target,他們之間的映射關(guān)系是

Runlevel Target 說明
0 poweroff.target 關(guān)閉系統(tǒng)
1 rescue.target 維護模式
2,3,4 multi-user.target 多用戶,無圖形系統(tǒng)(命令行界面)
5 graphical.target 多用戶,圖形化系統(tǒng)(圖形用戶界面)
6 reboot.target 重啟系統(tǒng)

啟動過程

  1. 讀入 /boot 目錄下的內(nèi)核文件

  2. 內(nèi)核文件加載完之后,開始執(zhí)行第一個程序/sbin/init 初始化進程,由 Systemd 初始化系統(tǒng)引導(dǎo),完成相關(guān)的初始化工作

  3. Systemd 執(zhí)行default.target ,獲知設(shè)定的啟動 target

    實際上 default.target 是指向設(shè)定的啟動 target 的軟鏈接

  4. Systemd 執(zhí)行啟動 target 對應(yīng)的單元文件。根據(jù)單元文件中定義的依賴關(guān)系,傳遞控制權(quán),依次執(zhí)行其他 target 單元文件,同時啟動每個 target 包含的單元

    對于圖形化界面,默認 target 是 graphical,Systemd 執(zhí)行位于/lib/systemd/system/ 目錄下的 graphical.target 單元文件,根據(jù) target 單元文件中定義的依賴關(guān)系,依次啟動其他 target 單元文件以及各個 target 包含的位于/etc/systemd/system/目錄下的單元

    例如: graphical.target 的依賴關(guān)系是

    [Unit]
    Description=Graphical Interface
    Documentation=man:systemd.special(7)
    Requires=multi-user.target #
    Wants=display-manager.service #
    Conflicts=rescue.service rescue.target
    After=multi-user.target rescue.service rescue.target display-manager.service #
    AllowIsolate=yes
    

    因此,依次啟動 multi-user.target --> basic.target --> sysinit.target --> local-fs.target -->local-fs-pre.target --> ...

    同時啟動每個 target 包含的位于/etc/systemd/system/目錄下的Unit

    SysV對應(yīng)的 rc5.d --> /etc/init.d 目錄下的指定的腳本就不會在開機的時候執(zhí)行了

查看默認 target

systemctl get-default

lfp@legion:~$ runlevel
N 5
lfp@legion:~$ systemctl get-default
graphical.target

修改默認 target

systemctl set-default [xxx.target]

# Ubuntu18.04
# 圖形用戶界面 切換 命令行界面
sudo systemctl set-default multi-user.target
# 命令行界面 切換 圖形用戶界面
 systemctl set-default graphical.target
 reboot
 # 命令行界面 想進入 圖形用戶界面(僅進入一次,重啟系統(tǒng)后仍然會進入命令行模式)
 sudo systemctl start lightdm

https://ask.csdn.net/questions/695344

https://ask/a/788465

其他操作

修改配置文件

  1. 直接修改/lib/systemd/system目錄下的單元文件

    如果軟件包更新,修改會被丟棄

  2. /lib/systemd/system中的單元文件復(fù)制到/etc/systemd/system/

    如果軟件包更新,不會同步更新

  3. /etc/systemd/system/ 中添加配置(推薦)

添加配置

步驟:

  1. /etc/systemd/system/ 目錄下新建<單元名>.d目錄
  2. <單元名>.d目錄下,新建<單元名>.conf文件
  3. <單元名>.conf文件中修改配置

測試:

  1. 創(chuàng)建目錄及文件

    # /mysql.service.d
    lfp@legion:/etc/systemd/system/mysql.service.d$ ls
    mysql.conf
    
  2. 修改配置

    # MySQL Systemd service config file
    # 不需要所有的組,僅添加需要修改的組及選項
    
    [Unit]
    Description=MySQL Community Server config test
    
    [Service]
    ExecStartPost=/home/lfp/bin/espeak.sh
    
  3. 重啟測試

    lfp@legion:/etc/systemd/system/mysql.service.d$ systemctl daemon-reload
    lfp@legion:/etc/systemd/system/mysql.service.d$ systemctl restart mysql.service
    lfp@legion:/etc/systemd/system/mysql.service.d$ systemctl status mysql.service
    lfp@legion:/etc/systemd/system/mysql.service.d$ systemctl status mysql.service
    #                               描述已經(jīng)被修改
    ● mysql.service - MySQL Community Server config test
       Loaded: loaded (/lib/systemd/system/mysql.service; enabled; vendor preset: enabled)
    # 加入了配置文件
      Drop-In: /etc/systemd/system/mysql.service.d
               └─mysql.conf
       Active: active (running) since Thu 2020-05-21 20:18:02 CST; 12min ago
    # 新增的動作執(zhí)行成功
      Process: 4703 ExecStartPost=/home/lfp/bin/espeak.sh (code=exited, status=0/SUCCESS)
      Process: 4672 ExecStart=/usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid (code=exited, status=0/SUCCESS)
      Process: 4663 ExecStartPre=/usr/share/mysql/mysql-Systemd-start pre (code=exited, status=0/SUCCESS)
     Main PID: 4674 (mysqld)
        Tasks: 27 (limit: 4915)
       CGroup: /system.slice/mysql.service
               └─4674 /usr/sbin/mysqld --daemonize --pid-file=/run/mysqld/mysqld.pid
    
    5月 21 20:18:02 legion espeak.sh[4703]: ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel map
    

添加開機啟動服務(wù)

  1. 添加啟動配置文件
  2. 通過 rc.local文件

/lib/systemd/rc.local.service

# 如果存在,就自動添加到 multi-user.target
# This Unit gets pulled automatically into multi-user.target by
# Systemd-rc-local-generator if /etc/rc.local is executable.
[Unit]
Description=/etc/rc.local Compatibility
Documentation=man:systemd-rc-local-generator(8)
ConditionFileIsExecutable=/etc/rc.local
After=network.target

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
RemainAfterExit=yes
GuessMainPID=no

創(chuàng)建 rc.local 文件,賦予可執(zhí)行權(quán)限,即可添加啟動命令

sudo touch /etc/rc.local
chmod 755 /etc/rc.local

lfp@legion:/etc$ vim rc.local
#!/bin/sh -e
echo "test rc.local" > /usr/local/rclocal.log
echo "rc.local `date +%Y-%m-%d-%H:%M:%S`" >/home/lfp/log/rclocal.log
exit 0

system 工具集

hostnamectl 主機名管理命令

hostnamectl
hostnamectl status

Show current system hostname and related information

lfp@legion:/lib/systemd/system$ hostnamectl status
   Static hostname: legion
         Icon name: computer-laptop
           Chassis: laptop
        Machine ID: b28xxxxxxxx2ecafa29e
           Boot ID: 21xxxxxxxxxxxx1d3a47504d
  Operating System: Ubuntu 18.04.4 LTS
            Kernel: Linux 5.3.0-51-generic
      Architecture: x86-64

journalctl 日志管理命令

Systemd 統(tǒng)一管理所有 Unit 的啟動日志。帶來的好處就是,可以只用journalctl一個命令,查看所有日志(內(nèi)核日志和應(yīng)用日志)。

配置文件

/etc/systemd/journald.conf

日志保存目錄

/var/log/journal/

默認日志最大限制為所在文件系統(tǒng)容量的 10%,可通過 /etc/systemd/journald.conf 中的 SystemMaxUse 字段來指定

該目錄是 systemd 軟件包的一部分。若被刪除,systemd 不會自動創(chuàng)建它,直到下次升級軟件包時重建該目錄。如果該目錄缺失,systemd 會將日志記錄寫入 /run/systemd/journal。這意味著,系統(tǒng)重啟后日志將丟失。

journalctl -u [服務(wù)名]

查看指定單元的日志

journalctl -b
  • journalctl -b -0 顯示本次啟動的信息
  • journalctl -b -1 顯示上次啟動的信息
  • journalctl -b -2 顯示上上次啟動的信息

參考

http://manpages./manpages/bionic/en/man1/systemctl.1.html

http://manpages./manpages/bionic/en/man5/systemd.unit.5.html

https://www.cnblogs.com/yingsong/p/6012180.html

https://www.cnblogs.com/sparkdev/p/8472711.html

http://www./blog/2016/03/systemd-tutorial-commands.html

http://www./blog/2016/03/systemd-tutorial-part-two.html

https:///linux-how-to/systemd-boot-process/

https://cloud.tencent.com/developer/article/1516125

https://www.cnblogs.com/sparkdev/p/8472711.html

https://www.ibm.com/developerworks/cn/linux/1407_liuming_init3/index.html?ca=drs-

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多