CentOS 7 使用 Systemd 替換了SysV
Ubuntu 從 15.04 開(kāi)始使用 Systemd
Systemd 是 Linux 系統工具,用來(lái)啟動(dòng)守護進(jìn)程,已成為大多數發(fā)行版的標準配置
優(yōu)點(diǎn):
按需啟動(dòng)進(jìn)程,減少系統資源消耗
并行啟動(dòng)進(jìn)程,提高系統啟動(dòng)速度
在 SysV-init 時(shí)代,將每個(gè)服務(wù)項目編號,依次執行啟動(dòng)腳本。Ubuntu 的 Upstart 解決了沒(méi)有直接依賴(lài)的啟動(dòng)之間的并行啟動(dòng)。而 Systemd 通過(guò) Socket 緩存、DBus 緩存和建立臨時(shí)掛載點(diǎn)等方法進(jìn)一步解決了啟動(dòng)進(jìn)程之間的依賴(lài),做到了所有系統服務(wù)并發(fā)啟動(dòng)。對于用戶(hù)自定義的服務(wù),Systemd 允許配置其啟動(dòng)依賴(lài)項目,從而確保服務(wù)按必要的順序運行。
SystemV Upstart 參考上一篇博文:Linux 初始化系統 SystemV Upstart
使用 CGroup 監視和管理進(jìn)程的生命周期
CGroup 提供了類(lèi)似文件系統的接口,當進(jìn)程創(chuàng )建子進(jìn)程時(shí),子進(jìn)程會(huì )繼承父進(jìn)程的 CGroup。因此無(wú)論服務(wù)如何啟動(dòng)新的子進(jìn)程,所有的這些相關(guān)進(jìn)程都會(huì )屬于同一個(gè) CGroup
在 Systemd 之前的主流應用管理服務(wù)都是使用 進(jìn)程樹(shù) 來(lái)跟蹤應用的繼承關(guān)系的,而進(jìn)程的父子關(guān)系很容易通過(guò) 兩次 fork 的方法脫離。
而 Systemd 則提供通過(guò) CGroup 跟蹤進(jìn)程關(guān)系,引補了這個(gè)缺漏。通過(guò) CGroup 不僅能夠實(shí)現服務(wù)之間訪(fǎng)問(wèn)隔離,限制特定應用程序對系統資源的訪(fǎng)問(wèn)配額,還能更精確地管理服務(wù)的生命周期
統一管理服務(wù)日志
支持快照和系統恢復
缺點(diǎn):

Systemd 可以管理所有系統資源:
例如,MySQL服務(wù)被 Systemd 視為一個(gè) Unit,使用一個(gè) mysql.service 作為啟動(dòng)配置文件
單元文件中包含該單元的描述、屬性、啟動(dòng)命令等
Systemd 將系統資源劃分為12類(lèi),對應12種類(lèi)型的單元文件
| 系統資源類(lèi)型 | 單元文件擴展名 | 單元文件描述 |
|---|---|---|
| Service | .service | 封裝守護進(jìn)程的啟動(dòng)、停止、重啟和重載操作,是最常見(jiàn)的一種 Unit 文件 |
| Target | .target | 定義 target 信息及依賴(lài)關(guān)系,一般僅包含 Unit 段 |
| Device | .device | 對于 /dev 目錄下的硬件設備,主要用于定義設備之間的依賴(lài)關(guān)系 |
| Mount | .mount | 定義文件系統的掛載點(diǎn),可以替代過(guò)去的 /etc/fstab 配置文件 |
| Automount | .automount | 用于控制自動(dòng)掛載文件系統,相當于 SysV-init 的 autofs 服務(wù) |
| Path | .path | 用于監控指定目錄或文件的變化,并觸發(fā)其它 Unit 運行 |
| Scope | .scope | 這種 Unit 文件不是用戶(hù)創(chuàng )建的,而是 Systemd 運行時(shí)產(chǎn)生的,描述一些系統服務(wù)的分組信息 |
| Slice | .slice | 用于表示一個(gè) CGroup 的樹(shù) |
| Snapshot | .snapshot | 用于表示一個(gè)由 systemctl snapshot 命令創(chuàng )建的 Systemd Units 運行狀態(tài)快照,可以切回某個(gè)快照 |
| Socket | .socket | 監控來(lái)自于系統或網(wǎng)絡(luò )的數據消息 |
| Swap | .swap | 定義一個(gè)用戶(hù)做虛擬內存的交換分區 |
| Timer | .timer | 用于配置在特定時(shí)間觸發(fā)的任務(wù),替代了 Crontab 的功能 |
對于操作單元文件的命令,如果缺省擴展名,則默認
.service擴展名而操作 target 的命令,例如 isolate,則默認
.target擴展名
單元文件的語(yǔ)法來(lái)源于 XDG桌面入口配置文件.desktop文件
Unit 文件可以分為三個(gè)配置區段:
單元文件中的區段名和字段名大小寫(xiě)敏感
每個(gè)區段內都是一些等號連接的鍵值對(鍵值對的等號兩側不能有空格)
主要字段如下:
Description:當前服務(wù)的簡(jiǎn)單描述
Documentation:文檔地址,可以是一個(gè)或多個(gè)文檔的 URL 路徑
【依賴(lài)關(guān)系】
Requires:與其它 Unit 的強依賴(lài)關(guān)系,如果其中任意一個(gè) Unit 啟動(dòng)失敗或異常退出,當前 Unit 也會(huì )被退出
Wants:與其它 Unit 的弱依賴(lài)關(guān)系,如果其中任意一個(gè) Unit 啟動(dòng)失敗或異常退出,不影響當前 Unit 繼續執行
只涉及依賴(lài)關(guān)系,默認情況下 兩個(gè) Unit 同時(shí)啟動(dòng)
【啟動(dòng)順序】
After:該字段指定的 Unit 全部啟動(dòng)完成以后,才會(huì )啟動(dòng)當前 Unit
Before:該字段指定的 Unit 必須在當前 Unit 啟動(dòng)完成之后再啟動(dòng)
只涉及啟動(dòng)順序,不影響啟動(dòng)結果和運行情況
Binds To:與 Requires 相似,該字段指定的 Unit 如果退出,會(huì )導致當前 Unit 停止運行
Part Of:一個(gè) Bind To 作用的子集,僅在列出的 Unit 失敗或重啟時(shí),終止或重啟當前 Unit,而不會(huì )隨列出Unit 的啟動(dòng)而啟動(dòng)
http://manpages.ubuntu.com/manpages/bionic/en/man5/systemd.unit.5.html
主要字段如下:
WantedBy:它的值是一個(gè)或多個(gè) target,執行enable命令時(shí),符號鏈接會(huì )放入/etc/systemd/system目錄下以 target 名 + .wants后綴構成的子目錄中RequiredBy:它的值是一個(gè)或多個(gè) target,執行enable命令時(shí),符號鏈接會(huì )放入/etc/systemd/system目錄下以 target 名 + .required后綴構成的子目錄中Alias:當前 Unit 可用于啟動(dòng)的別名Also:當前 Unit 被 enable/disable 時(shí),會(huì )被同時(shí)操作的其他 Unithttp://manpages.ubuntu.com/manpages/bionic/en/man5/systemd.unit.5.html
主要字段如下:
【啟動(dòng)類(lèi)型】
Type:定義啟動(dòng)時(shí)的進(jìn)程行為。它有以下幾種值。Type=simple:默認值,ExecStart字段啟動(dòng)的進(jìn)程為主進(jìn)程Type=forking:ExecStart字段將以fork()方式從父進(jìn)程創(chuàng )建子進(jìn)程啟動(dòng),創(chuàng )建后父進(jìn)程會(huì )立即退出,子進(jìn)程成為主進(jìn)程。PIDFile字段,以便 Systemd 能夠跟蹤服務(wù)的主進(jìn)程Type=oneshot:只執行一次,Systemd 會(huì )等當前服務(wù)退出,再繼續往下執行RemainAfterExit=yes字段,使得 Systemd 在服務(wù)進(jìn)程退出之后仍然認為服務(wù)處于激活狀態(tài)Type=dbus:當前服務(wù)通過(guò) D-Bus 信號啟動(dòng)。當指定的 BusName 出現在 DBus 系統總線(xiàn)上時(shí),Systemd認為服務(wù)就緒Type=notify:當前服務(wù)啟動(dòng)完畢會(huì )發(fā)出通知信號,通知 Systemd,然后 Systemd 再啟動(dòng)其他服務(wù)Type=idle:Systemd 會(huì )等到其他任務(wù)都執行完,才會(huì )啟動(dòng)該服務(wù)。【啟動(dòng)行為】
ExecStart:?jiǎn)?dòng)當前服務(wù)的命令
ExecStart=/bin/echo execstart1ExecStart=ExecStart=/bin/echo execstart2順序執行設定的命令,把字段置空,表示清除之前的值
ExecStartPre:?jiǎn)?dòng)當前服務(wù)之前執行的命令
ExecStartPost:?jiǎn)?dòng)當前服務(wù)之后執行的命令
ExecReload:重啟當前服務(wù)時(shí)執行的命令
ExecStop:停止當前服務(wù)時(shí)執行的命令
ExecStopPost:停止當前服務(wù)之后執行的命令
RemainAfterExit:當前服務(wù)的所有進(jìn)程都退出的時(shí)候,Systemd 仍認為該服務(wù)是激活狀態(tài)
TimeoutSec:定義 Systemd 停止當前服務(wù)之前等待的秒數
注:所有的啟動(dòng)設置之前,都可以加上一個(gè)連詞號(
-),表示"抑制錯誤",即發(fā)生錯誤的時(shí)候,不影響其他命令的執行。比如,EnvironmentFile=-/etc/sysconfig/sshd(注意等號后面的那個(gè)連詞號),就表示即使/etc/sysconfig/sshd文件不存在,也不會(huì )拋出錯誤。
【重啟行為】
RestartSec:Systemd 重啟當前服務(wù)間隔的秒數KillMode:定義 Systemd 如何停止服務(wù),可能的值包括:Restart:定義何種情況 Systemd 會(huì )自動(dòng)重啟當前服務(wù),可能的值包括:【上下文】
PIDFile:指向當前服務(wù) PID file 的絕對路徑。
User:指定運行服務(wù)的用戶(hù)
Group:指定運行服務(wù)的用戶(hù)組
EnvironmentFile:指定當前服務(wù)的環(huán)境參數文件。該文件內部的key=value鍵值對,可以用$key的形式,在當前配置文件中獲取
啟動(dòng)
sshd,執行的命令是/usr/sbin/sshd -D $OPTIONS,其中的變量$OPTIONS就來(lái)自EnvironmentFile字段指定的環(huán)境參數文件。
http://manpages.ubuntu.com/manpages/bionic/en/man5/systemd.service.5.html
在 Unit 文件中,有時(shí)會(huì )需要使用到一些與運行環(huán)境有關(guān)的信息,例如節點(diǎn) ID、運行服務(wù)的用戶(hù)等。這些信息可以使用占位符來(lái)表示,然后在實(shí)際運行中動(dòng)態(tài)地替換為實(shí)際的值。
詳細了解見(jiàn) https://cloud.tencent.com/developer/article/1516125
在現實(shí)中,往往有一些應用需要被復制多份運行,就會(huì )用到模板文件
模板文件的寫(xiě)法與普通單元文件基本相同,只是模板文件名是以 @ 符號結尾。例如:apache@.service
通過(guò)模板文件啟動(dòng)服務(wù)實(shí)例時(shí),需要在其文件名的 @ 字符后面附加一個(gè)用于區分服務(wù)實(shí)例的參數字符串,通常這個(gè)參數是用于監控的端口號或控制臺 TTY 編譯號
systemctl start apache@8080.serviceSystemd 在運行服務(wù)時(shí),首先尋找跟單元名完全匹配的單元文件,如果沒(méi)有找到,才會(huì )嘗試選擇匹配模板
例如上面的命令,System 首先會(huì )在約定的目錄下尋找名為 apache@8080.service 的單元文件,如果沒(méi)有找到,而文件名中包含 @ 字符,它就會(huì )嘗試去掉后綴參數匹配模板文件。對于 apache@8080.service,Systemd 會(huì )找到 apache@.service 模板文件,并通過(guò)這個(gè)模板文件將服務(wù)實(shí)例化。
詳細了解見(jiàn) https://cloud.tencent.com/developer/article/1516125
systemctl list-unit-files 將會(huì )列出文件的 state,包括 static, enabled, disabled, masked, indirect
masked
service軟鏈接到/dev/null
該單元文件被禁止建立啟動(dòng)鏈接
static
該單元文件沒(méi)有[Install]部分(無(wú)法執行),只能作為其他配置文件的依賴(lài)
enabled
已建立啟動(dòng)鏈接
disabled
沒(méi)建立啟動(dòng)鏈接
關(guān)掉觸摸板配置文件
Unit]Description=Switch-off Touchpad[Service]Type=oneshotExecStart=/usr/bin/touchpad-off startExecStop=/usr/bin/touchpad-off stopRemainAfterExit=yes[Install]WantedBy=multi-user.targetRemainAfterExit字段設為yes,表示進(jìn)程退出以后,服務(wù)仍然保持執行。這樣的話(huà),一旦使用systemctl stop命令停止服務(wù),ExecStop指定的命令就會(huì )執行,從而重新開(kāi)啟觸摸板systemd-analyzeAnalyze and debug system manager, If no command is passed, Systemd-analyze time is implied
https://www.freedesktop.org/software/systemd/man/systemd-analyze.html
systemd-analyze time查看初始化耗時(shí)
systemd-analyze blame打印所有運行單元,按它們初始化的時(shí)間排序。此信息可用于優(yōu)化啟動(dòng)時(shí)間。注意,輸出可能具有誤導性,因為一個(gè)服務(wù)的初始化可能非常緩慢,因為它等待另一個(gè)服務(wù)的初始化完成
systemd-run
將一個(gè)指定的服務(wù)變成后臺服務(wù)
未測試
參考 https://www.freedesktop.org/software/systemd/man/systemd-run.html
systemctl是 Systemd 的主命令,用于管理系統
| 動(dòng)作 | SysV Init 指令 | Systemd 指令 |
|---|---|---|
| 啟動(dòng)某服務(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 | 停掉應用,刪除其配置文件 |
| 使服務(wù)開(kāi)機自啟動(dòng) | chkconfig --level 5 httpd on | systemctl enable httpd |
| 使服務(wù)開(kāi)機不自啟動(dòng) | chkconfig --level 5 httpd off | systemctl disable httpd |
| 查詢(xún)服務(wù)是否開(kāi)機自啟 | chkconfig --list | grep httpd | systemctl is-enabled httpd |
| 加入自定義服務(wù) | chkconfig --add test | systemctl load test |
| 顯示所有已啟動(dòng)的服務(wù) | chkconfig --list | systemctl list-unit-files | grep enabled |
--all顯示加載到內存的所有單元
--type-t --type=
顯示指定類(lèi)型(12種類(lèi)型)的單元
--state--state=
顯示指定狀態(tài)的單元或單元文件
單元狀態(tài)
輸入
systemctl list-units --state按Tab鍵,顯示所有可用的值單元文件狀態(tài)
另外還可以用 enabled static disabled 等
systemctl list-unit-files顯示的狀態(tài)
--failed--state=failed
顯示加載失敗的單元
systemctl --failed--version打印 Systemd 版本
lfp@legion:/lib/systemd/system$ systemctl --versionSystemd 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 對單元的管理,不涉及單元文件自身屬性和內容
list-units相當于systemctl
列出當前已加載的單元(內存)
默認情況下僅顯示處于激活狀態(tài)(正在運行)的單元
UNIT 單元名
LOAD 加載狀態(tài)
ACTIVE SUB 執行狀態(tài)(大狀態(tài) 子狀態(tài))
DESCRIPTION 描述
start啟動(dòng)單元
systemctl start mysql.servicestop停止單元
systemctl stop mysql.servicekill殺掉單元進(jìn)程
systemctl kill mysql.servicereload不終止單元,重新加載 針對該單元的 運行配置文件,而不是 針對 systemd的 該單元的啟動(dòng)配置文件
例如啟動(dòng) MySQL 服務(wù),reload 可以在不停止服務(wù)的情況下重載 MySQL 的配置文件
my.cnf
restart重啟單元
該單元在重啟之前擁有的資源不會(huì )被完全清空,比如文件描述符存儲設施
systemctl reload mysql.servicestatusstatus [unit | PID]
顯示單元或進(jìn)程所屬單元的運行信息
systemctl status mysql.service
Loaded行:配置文件的位置,是否設為開(kāi)機啟動(dòng)
Active行:表示正在運行
Main PID行:主進(jìn)程ID
CGroup塊:應用的所有子進(jìn)程日志塊:應用的日志
is-active判斷指定的單元是否處于激活狀態(tài)
# 默認會(huì )打印當前單元的狀態(tài),可以通過(guò) --quiet 參數取消打印lfp@legion:~$ systemctl is-active mysqlactiveis-failed判斷指定的單元是否處于啟動(dòng)失敗狀態(tài)
lfp@legion:~$ systemctl is-failed mysqlactivelist-dependencies查看單元之間的依賴(lài)關(guān)系
systemctl list-dependencies graphical.target systemctl list-dependencies mysql.serviceshowshow --property= Unit ?=> show -p Unit
顯示單元所有底層參數
lfp@legion:~$ systemctl show -p MainPID mysqlMainPID=1061set-property在單元啟動(dòng)的時(shí)候設置運行時(shí)的某個(gè)屬性,立即生效,并保存在磁盤(pán)中作為啟動(dòng)配置
如果添加了--runtime則重啟后失效
并非所有的屬性都可以設置,只是 systemd.resource-control 包含的屬性
isolate切換到某個(gè) target(系統狀態(tài)),立即停止該 target 未包含的單元進(jìn)程。也可以理解為切換 runlevel
如果沒(méi)有指定擴展名,則默認.target
只有當.target單元文件中的AllowIsolate=yes時(shí),才能使用 isolate 切換;也可以用IgnoreOnIsolate=yes字段來(lái)拒絕使用 isolate 切換
systemctl isolate multi-user.targetcat顯示單元配置文件的備份文件,包括插入式配置drop-ins,可以完整的看到單元服務(wù)的配置。注意這里打印的依據是磁盤(pán)的上內容,如果用戶(hù)修改了配置文件(磁盤(pán)已修改)但是未執行daemon-reload命令(內存中未更新),那么該命令顯示的配置和實(shí)際執行情況有出入
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 的內容# /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 對單元文件自身屬性和內容的管理
list-unit-files列出所有已安裝的單元文件和它們的啟用狀態(tài)
和
list-units的區別是
- list-units 僅顯示當前已加載到內存中的單元
- list-unit-files 會(huì )讀取單元文件內容,列出所有單元,包括存在于硬盤(pán)未加載進(jìn)內存的單元
實(shí)際測試結果:
systemctl list-unit-files 顯示“348 Unit files listed”
systemctl list-units --all 顯示“405 loaded units listed”
systemctl list-units 顯示 “232 loaded units listed”
enable使某個(gè)單元開(kāi)機自啟動(dòng)
這會(huì )根據單元文件內容中的[Install]指定的 target 組,創(chuàng )建一個(gè)軟鏈接
lfp@legion:/etc/systemd/system$ vim v2rayL.service# 文件內容 [Install] 段......[Install]WantedBy=multi-user.target......lfp@legion:/etc/systemd/system$ systemctl is-enabled v2rayL.service disabledlfp@legion:/etc/systemd/system$ systemctl enable v2rayL.service # 根據 [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取消某個(gè)單元開(kāi)機自啟動(dòng)設置,刪除軟鏈接
這會(huì )刪除所有指向該單元文件的軟鏈接,不僅僅是 enable 操作創(chuàng )建的
reenabledisable 和 enable 的結合,根據單元文件內容中的 [Install] 段,重置軟鏈接
is-enabled檢查某個(gè)單元是否是開(kāi)機自啟動(dòng)的(建立的啟動(dòng)鏈接)
lfp@legion:~$ systemctl is-enabled mysqlenabledget-default獲取默認啟動(dòng) target,default-target 是指向該 target 的軟鏈接
set-default設置默認啟動(dòng) target,同時(shí)修改 default-target 指向設定的 target
systemctl set-default multi-user.targetdaemon-reload重新加載所有的單元文件和依賴(lài)關(guān)系
對單元文件有修改的時(shí)候,需要執行該命令重新加載文件內容
rebootsystemctl reboot重啟系統(異步操作)
it will return after the reboot operation is enqueued, without waiting for it to complete
poweroff關(guān)閉系統,切斷電源(異步操作)
halt僅CPU停止工作,其他硬件仍處于開(kāi)機狀態(tài)(異步操作)
suspend暫停系統(異步操作)
將觸發(fā)執行suspend.target
hibernate讓系統進(jìn)入冬眠狀態(tài)(異步操作)
將觸發(fā)執行hibernate.target
/run/systemd/system/
單元(服務(wù))運行時(shí)生成的配置文件所在目錄/etc/systemd/system/
系統或用戶(hù)自定義的配置文件,初始化過(guò)程中Systemd只執行/etc/systemd/system目錄里面的配置文件
/lib/systemd/system/
軟件安裝時(shí)添加的配置文件,類(lèi)似于 /etc/init.d/
對于支持 Systemd 的程序,安裝的時(shí)候,會(huì )自動(dòng)的在 /lib/systemd/system 目錄添加一個(gè)配置文件
其他目錄都是軟鏈接
/etc/systemd/system/default.target
Systemd 執行的第一個(gè)單元文件,符號鏈接到默認啟動(dòng) target 對應的 .target 單元文件
SysV 的啟動(dòng)腳本放在/etc/init.d目錄下
Systemd 的單元文件放在/etc/systemd/system 和 /lib/systemd/system目錄下
當一個(gè)程序在3個(gè)目錄下都存在啟動(dòng)方式時(shí),優(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.servicelfp@legion:/lib/systemd/system$ ll-rw-r--r-- 1 root root 499 5月 20 01:20 mysql.service/etc/systemd/system 里面的同名service會(huì )覆蓋/lib/systemd/system 里面的
注意查看文件信息,該同名文件不能是指向 /lib/systemd/system 的軟鏈接
軟鏈接不會(huì )覆蓋而會(huì )同步
如果某個(gè)程序不存在Systemd 單元文件,那么會(huì )執行/etc/init.d里面的啟動(dòng)腳本
根據啟動(dòng)過(guò)程,
/etc/systemd/system/multi-user.target.wants/目錄下是很多指向/lib/systemd/system/目錄的軟鏈接,所以?xún)蓚€(gè)目錄下的單元文件會(huì )互相同步。如果
/etc/systemd/system/和/etc/systemd/system/multi-user.target.wants/同時(shí)存在單元文件,測試發(fā)現,不管是手動(dòng)啟動(dòng)還是開(kāi)機自啟動(dòng),使用的都是/etc/systemd/system/目錄下的service單元文件
/etc/init.d目錄下的腳本mysql 修改 mysql.service 為mysql.service.bak 然后通過(guò)service mysql restart啟動(dòng)/etc/init.d/mysql腳本
下面是啟動(dòng)后的一些信息

注:在恢復
mysql.service之前,需要先通過(guò)service mysql stop利用/etc/init.d/mysql腳本中的stop結束上面的進(jìn)程,否則一旦恢復,service mysql stop執行的操作就不是/etc/init.d/mysql腳本中的stop,無(wú)法結束上面的進(jìn)程,出現命令無(wú)法正常執行的情況
結束上面的進(jìn)程,恢復mysql.service,重新啟動(dòng)

/etc/systemd/system 覆蓋測試未修改前,查看MySQL的狀態(tài)
lfp@legion:~$ service mysql status● mysql.service - MySQL Community Server# 可以發(fā)現這里的 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.pid4月 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 下面的文件復制到 /etc/systemd/system/ 下面
sudo cp /lib/systemd/system/mysql.service /etc/systemd/system/修改 mysql.service
sudo vim /etc/systemd/system/mysql.service?

重啟 mysql.service ,系統提示需要重新加載
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ā)現這里是修改之后的,覆蓋了 /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.pi4月 26 00:47:02 legion Systemd[1]: Starting MySQL Community Server hahahaha...4月 26 00:47:02 legion Systemd[1兩個(gè)含義
系統的某個(gè)狀態(tài)稱(chēng)為一個(gè) target(類(lèi)似于"狀態(tài)點(diǎn)")
達到某個(gè)系統狀態(tài),所需的一個(gè)或多個(gè)資源(Unit)稱(chēng)為一個(gè) target(一個(gè) Unit 組)
target是一個(gè)抽象的系統資源,不像MySQL有實(shí)體
如果一個(gè)target只包含一個(gè)Unit,那么該 target,沒(méi)有對應的目錄,指的就是這個(gè) Unit
例如
hibernate.target只包含systemd-hibernate.service一個(gè)Unit如果一個(gè)target包含多個(gè)Unit,那么該target,有對應的 xxx.target.wants 目錄,指的是目錄里面所有的Unit
例如
multi-user.target包含位于/etc/systemd/system/multi-user.target.wants目錄下的多個(gè) Unit
target也是一個(gè) Target 類(lèi)型的系統資源,有對應的單元文件 xxx.target
Systemd 使用 target 來(lái)劃分和管理資源(Unit),啟動(dòng)(激活)某個(gè) xxx.target 單元文件,通過(guò)執行該 target 包含的 Unit,使系統達到某種狀態(tài)
對于狀態(tài)點(diǎn)的理解:
例如,執行
systemd suspend命令讓系統暫停,會(huì )觸發(fā)啟動(dòng)suspend.target,然后執行里面的systemd-suspend.serviceUnit,使系統達到一個(gè)暫停的狀態(tài)
傳統的init啟動(dòng)模式里面,有 RunLevel 的概念,跟 Target 的作用很類(lèi)似。不同的是,RunLevel 是互斥的,不可能多個(gè) RunLevel 同時(shí)啟動(dòng),但是多個(gè) Target 可以同時(shí)啟動(dòng)
runlevel是 SysV init 初始化系統中的概念,在Systemd初始化系統中使用的是 Target,他們之間的映射關(guān)系是
| Runlevel | Target | 說(shuō)明 |
|---|---|---|
| 0 | poweroff.target | 關(guān)閉系統 |
| 1 | rescue.target | 維護模式 |
| 2,3,4 | multi-user.target | 多用戶(hù),無(wú)圖形系統(命令行界面) |
| 5 | graphical.target | 多用戶(hù),圖形化系統(圖形用戶(hù)界面) |
| 6 | reboot.target | 重啟系統 |

讀入 /boot 目錄下的內核文件
內核文件加載完之后,開(kāi)始執行第一個(gè)程序/sbin/init 初始化進(jìn)程,由 Systemd 初始化系統引導,完成相關(guān)的初始化工作
Systemd 執行default.target ,獲知設定的啟動(dòng) target
實(shí)際上
default.target是指向設定的啟動(dòng) target 的軟鏈接
Systemd 執行啟動(dòng) target 對應的單元文件。根據單元文件中定義的依賴(lài)關(guān)系,傳遞控制權,依次執行其他 target 單元文件,同時(shí)啟動(dòng)每個(gè) target 包含的單元
對于圖形化界面,默認 target 是 graphical,Systemd 執行位于
/lib/systemd/system/目錄下的 graphical.target 單元文件,根據 target 單元文件中定義的依賴(lài)關(guān)系,依次啟動(dòng)其他 target 單元文件以及各個(gè) target 包含的位于/etc/systemd/system/目錄下的單元例如: graphical.target 的依賴(lài)關(guān)系是
[Unit]Description=Graphical InterfaceDocumentation=man:systemd.special(7)Requires=multi-user.target #Wants=display-manager.service #Conflicts=rescue.service rescue.targetAfter=multi-user.target rescue.service rescue.target display-manager.service #AllowIsolate=yes因此,依次啟動(dòng) multi-user.target --> basic.target --> sysinit.target --> local-fs.target -->local-fs-pre.target --> ...
同時(shí)啟動(dòng)每個(gè) target 包含的位于
/etc/systemd/system/目錄下的UnitSysV對應的 rc5.d --> /etc/init.d 目錄下的指定的腳本就不會(huì )在開(kāi)機的時(shí)候執行了
systemctl get-default
lfp@legion:~$ runlevelN 5lfp@legion:~$ systemctl get-defaultgraphical.targetsystemctl set-default [xxx.target]
# Ubuntu18.04# 圖形用戶(hù)界面 切換 命令行界面sudo systemctl set-default multi-user.target# 命令行界面 切換 圖形用戶(hù)界面 systemctl set-default graphical.target reboot # 命令行界面 想進(jìn)入 圖形用戶(hù)界面(僅進(jìn)入一次,重啟系統后仍然會(huì )進(jìn)入命令行模式) sudo systemctl start lightdm直接修改/lib/systemd/system目錄下的單元文件
如果軟件包更新,修改會(huì )被丟棄
將/lib/systemd/system中的單元文件復制到/etc/systemd/system/
如果軟件包更新,不會(huì )同步更新
在/etc/systemd/system/ 中添加配置(推薦)
步驟:
/etc/systemd/system/ 目錄下新建<單元名>.d目錄<單元名>.d目錄下,新建<單元名>.conf文件<單元名>.conf文件中修改配置測試:
創(chuàng )建目錄及文件
# /mysql.service.dlfp@legion:/etc/systemd/system/mysql.service.d$ lsmysql.conf修改配置
# MySQL Systemd service config file# 不需要所有的組,僅添加需要修改的組及選項[Unit]Description=MySQL Community Server config test[Service]ExecStartPost=/home/lfp/bin/espeak.sh重啟測試
lfp@legion:/etc/systemd/system/mysql.service.d$ systemctl daemon-reloadlfp@legion:/etc/systemd/system/mysql.service.d$ systemctl restart mysql.servicelfp@legion:/etc/systemd/system/mysql.service.d$ systemctl status mysql.servicelfp@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# 新增的動(dòng)作執行成功 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.pid5月 21 20:18:02 legion espeak.sh[4703]: ALSA lib pcm_route.c:867:(find_matching_chmap) Found no matching channel maprc.local文件/lib/systemd/rc.local.service
# 如果存在,就自動(dòng)添加到 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 CompatibilityDocumentation=man:systemd-rc-local-generator(8)ConditionFileIsExecutable=/etc/rc.localAfter=network.target[Service]Type=forkingExecStart=/etc/rc.local startTimeoutSec=0RemainAfterExit=yesGuessMainPID=no創(chuàng )建 rc.local 文件,賦予可執行權限,即可添加啟動(dòng)命令
sudo touch /etc/rc.localchmod 755 /etc/rc.locallfp@legion:/etc$ vim rc.local#!/bin/sh -eecho "test rc.local" > /usr/local/rclocal.logecho "rc.local `date +%Y-%m-%d-%H:%M:%S`" >/home/lfp/log/rclocal.logexit 0hostnamectl statusShow 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-64Systemd 統一管理所有 Unit 的啟動(dòng)日志。帶來(lái)的好處就是,可以只用journalctl一個(gè)命令,查看所有日志(內核日志和應用日志)。
配置文件
/etc/systemd/journald.conf
日志保存目錄
/var/log/journal/
默認日志最大限制為所在文件系統容量的 10%,可通過(guò) /etc/systemd/journald.conf 中的 SystemMaxUse 字段來(lái)指定
該目錄是 systemd 軟件包的一部分。若被刪除,systemd 不會(huì )自動(dòng)創(chuàng )建它,直到下次升級軟件包時(shí)重建該目錄。如果該目錄缺失,systemd 會(huì )將日志記錄寫(xiě)入 /run/systemd/journal。這意味著(zhù),系統重啟后日志將丟失。
journalctl -u [服務(wù)名]查看指定單元的日志
journalctl -bhttp://manpages.ubuntu.com/manpages/bionic/en/man1/systemctl.1.html
http://manpages.ubuntu.com/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.ruanyifeng.com/blog/2016/03/systemd-tutorial-commands.html
http://www.ruanyifeng.com/blog/2016/03/systemd-tutorial-part-two.html
https://linoxide.com/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-
聯(lián)系客服