CentOS 7上的系統管理之:Systemd和systemctl

来源:https://www.cnblogs.com/alongdidi/archive/2019/11/25/systemd_systemctl.html
-Advertisement-
Play Games

參考資料: Chapter 10. Managing Services with systemd Red Hat Enterprise Linux 7 | Red Hat Customer Portal systemd - Wikipedia man手冊:systemd(1)和systemctl(1 ...


參考資料:

Chapter 10. Managing Services with systemd Red Hat Enterprise Linux 7 | Red Hat Customer Portal

systemd - Wikipedia

man手冊:systemd(1)和systemctl(1)

IBM developer works上,劉明老師關於CentOS 5/6/7的init系統的介紹

簡介

早期的CentOS 5系統上,使用的init系統是SysV init。這套系統運行穩定,使用shell腳本的形式,串列地一個個啟動進程,當前一個進程啟動完畢後,再啟動後一個。這種方式帶來的缺點是:

  • 電腦的啟動速度很慢,後面的進程必須等待前面的進程依次串列地啟動完畢方可啟動。
  • 有的服務可能在啟動後很長的一段時間或者幾乎不會使用到,例如伺服器中的列印服務。

發展到CentOS 6的時候,init系統換成了Upstart,這個系統有效的解決了上述的缺點,實現了並行啟動和按需啟動。

而到了CentOS 7的時候,則出現了Systemd這套init系統,它更加完善了並行啟動和按需啟動,使得啟動的速度更上一層樓。這裡的按需啟動,指的是某個服務被設置為開機啟動,當開機時該服務並沒有真正的啟動,只是註冊好了socket占用,等待第一次有請求進來的時候,Systemd懸掛該請求然後啟動服務,服務啟動完畢後就恢復該請求,從而實現按需啟動,這種方式也變相加速了系統的啟動速度。

Systemd不僅僅是一個服務,還可以用於管理系統自身的方方面面,例如日誌、類似crond的任務調度程式(timer)、電源管理等等。

Systemd支持向後相容(backward compatible)SysV init的腳本等其他的諸多特性,使得其目前在慢慢成為Linux發行版的一種標準,這是一件好事。

這篇文章所能闡述的也只是Systemd的皮毛而已。主要描述了運維人員在日常使用中應該掌握的systemctl命令,以及如何閱讀unit文件以及尋找幫助。

Unit

在Systemd中使用配置文件來進行管理,這些配置文件叫做unit。unit有許許多多的類型,如下。

Unit 類型 文件擴展名 描述
Service unit .service 用於管理系統的服務unit,最常用,一般由所安裝的服務所提供(httpd、MySQL等)
Target unit .target target unit表示的是期望系統運行於哪個狀態下,用戶的目標是什麼。比如運行於支持圖形顯示的狀態下,那麼它除了可以提供CLI的shell界面以外,還需要額外啟用許多服務等組件用於支持圖形界面,這些組件也是一個個的unit,所以target就是多個unit的集合(這些unit之間還有先後和依賴關係)。因此,target就是用來模擬以前的運行級別(runlevel)的概念。
Automount unit .automount 文件系統自動掛載點。
Device unit .device 一個被內核所識別的設備文件。
Mount unit .mount 一個文件系統的掛載點。
Path unit .path 文件系統中的一個文件或目錄。
Scope unit .scope 一個外部創建的進程。
Slice unit .slice 一組用於管理系統進程的分層組織的單元。
Snapshot unit .snapshop Systemd管理器所保存的一個狀態,因此稱之為快照。
Socket unit .socket 一個進程間通信(IPC)socket。
Swap unit .swap 一個swap設備或者swap文件。

Timer unit

.timer

一個Systemd timer。

Unit配置文件

unit文件存在於三個位置:

  • /usr/lib/systemd/system/:軟體程式包所提供的unit文件。例如httpd程式包提供了httpd.service文件。
  • /run/systemd/system/:運行時所創建的unit文件。優先順序高於已安裝的服務unit文件所在的目錄。
  • /etc/systemd/system/:通過systemctl enable所創建的和用於擴展一個服務所添加的unit文件目錄。優先順序高於運行時unit文件。

優先順序:/etc/systemd/system/ --> /run/systemd/system/ --> /usr/lib/systemd/system/。

Systemd配置文件

/etc/systemd/system.conf是Systemd的配置文件,用戶可以編輯此文件來修改值。想要恢復預設值的話直接刪除此文件即可。文件中每個選項的作用可以參考man手冊systemd-system.conf(5)。

主特性

  • 基於socket激活(socket-based):在引導時,系統針對所有支持這類激活的系統服務創建監聽socket,一旦服務啟動就將這些socket傳遞給它們。這不僅允許systemd並行啟動服務,還使得服務在重啟的時候不會丟失任何在其服務不可用期間發送給它的消息(因為相關的socket仍然可以訪問並且將所有的消息放入隊列中)。該特性需要使用socket unit。
  • 基於匯流排激活(bus-based):當第一次被客戶端程式訪問的時候,使用D-Bus用於IPC的系統服務可以按需啟動。該特性需要使用D-Bus服務文件。
  • 基於設備激活(device-based):當某種特定的硬體設備被插入或者可用時,支持基於設備激活的系統服務可以按需啟動。該特性需要使用device unit。
  • 基於路徑激活(path-based):當一個文件或者目錄改變其狀態時,支持基於路徑激活的系統服務可以按需啟動。該特性需要使用path unit。
  • 掛載和自動掛載點管理:Systemd監視和管理掛載和自動掛載點。該特性需要使用mount和automount unit。
  • 進擊的並行性(aggressive parallelization):由於具備基於socket激活的特性,只要所有監聽的socket準備就緒,systemd就可以並行啟動服務。結合系統服務的按需激活特性,併發激活有效地減少了系統啟動的時間。
  • 支持事務的(transactional)unit激活邏輯:在激活或者關閉(deactivate)一個unit之前,systemd會計算它的依賴關係,創建一個臨時事務,驗證事務的一致性。當一個事務出現不一致的情況時,systemd會在其報錯之前嘗試去校對它並從中移除一些不重要的工作。
  • 向後相容(backward compatibility)SysV init:支持遵循LSB標準的SysV init腳本。

相容性變化

Systemd在設計的時候儘可能做到與SysV和Upstart相容,不過還是有一些點是不同的,需要留意:

  • Systemd對於運行級別的支持是有限的,並不是所有的運行級別都支持。其對於運行級別的支持是通過target unit來實現的,類似一種映射關係,例如graphical.target映射到runlevel5。systemd程式包在發行的時候包含了runlevel命令,不過用戶因該儘量避免使用該命令。
  • systemctl程式不支持自定義子命令。在CentOS 6的SysV init腳本中,除了支持start、stop和restart這些基礎子命令以外,腳本作者還可以撰寫任何自己希望實現的功能實現額外的子命令。例如RHEL 6中的iptables腳本支持panic子命令,該子命令告訴系統進入panic模式,丟棄所有的流入和流出的數據包。而systemctl,僅支持文檔中列出的子命令。
  • 非由systemd所啟動的服務,無法收到systemctl管理。當使用systemd啟動服務的時候,systemd會記錄並追蹤服務的主進程PID,systemctl命令通過該PID來管理服務進程。若用戶通過程式的CLI程式啟動服務的話,那麼systemd就無法獲取並追蹤該PID了。
  • Systemd只能停止運行中的服務。在以前,RHEL 6和以往的版本中,系統使用【/etc/rc0.d/】中的字元鏈接來關閉所有可用的服務而不關心它們的狀態。在systemd中,只有運行中的服務會被關閉了。
  • 系統服務無法從標準輸入流中讀取數據。當systemd啟動一個服務的時候,會將/dev/null和服務的STDIN關聯起來,使得用戶無法與其交互。
  • 系統服務不會從調用它們的用戶和會話中繼承任何上下文(context,例如HOME和PATH這類環境變數)。每個服務運行在一個乾凈的執行上下文中。
  • 當載入一個SysV init腳本的時候,systemd從LSB頭中讀取依賴關係併在運行時解釋。
  • Systemd的服務unit有一個代碼寫死的5分鐘超時時長,用於處理那些運行出現故障的服務。這個時長可以在獨立的服務類unit文件中修改。

 

管理服務

在SysV init和Upstart中,使用【/etc/rc.d/init.d/】下的shell腳本(一般是bash)來管理服務,使用的命令是service和chkconfig。在Systemd中使用service類型的unit文件(.service文件)來管理,使用的命令統一為systemctl。

由於向後相容的特性的存在,舊命令依然可用,但是官方並不建議。新舊命令的對應關係如下。

service命令和systemctl命令對照表,service命令用於管理一個服務的啟動和停止。

service  systemctl  描述 
 service name start  systemctl start name.service  啟動一個服務
 service name stop  systemctl stop name.service  停止一個服務
 service name restart  systemctl restart name.service  重啟一個服務
 service name condrestart  systemctl try-restart name.serivce  只有當服務處於運行狀態時才重啟服務
 service name reload  systemctl reload name.service  重載服務,一般用於配置文件的修改後執行
 serivce name status

 systemctl status name.service

 systemctl is-active name.service

 查看服務的運行狀態
 service --status-all  systemctl list-units --type service --all  查看所有服務的運行狀態

chkconfig命令和systemctl命令對照表,chkconfig命令用於管理服務的開機啟動情況以及將服務納入chkconfig管理。

chkconfig systemctl 描述
 chkconfig name on  systemctl enable name.service  使服務開機啟動
 chkconfig name off  systemctl disable name.service  禁止服務開機啟動
 chkconfig --list name

 systemctl status name.service

 systemctl is-enable name.service

 查看服務是否開機啟動
 chkconfig --list  systemctl list-unit-files --type service  列出所有的服務並檢查其是否開機啟動
 chkconfig --list  systemctl list-dependencies --after  列出在指定的unit之前需要被啟動的服務
 chkconfig --list  systemctl list-dependencies --before  列出在指定的unit之後需要被啟動的服務

在書寫unit名稱的時候,一般是建議寫全名,這樣比較能顧名思義,例如“httpd.service”。不過簡寫,不寫unit類型尾碼,那麼systemctl也是可以識別的,如下2個命令的效果是一樣的,systemctl會自動識別unit類型。

~]# systemctl stop nfs-server.service
~]# systemctl stop nfs-server

unit的名稱如果比較長,可以定義一個簡短的別名,想查看別名的話使用如下命令。show子命令可以查看很多unit的信息。

[root@c7-server ~]# systemctl show httpd.service -p Names
Names=httpd.service

如果結合chroot命令來運行systemctl命令的話,大部分命令是不可用的,除了systemctl enable和systemctl disable,詳見官方文檔

列出服務

列出所有當前已載入的服務。

[root@c7-server ~]# systemctl list-units --type service
  UNIT                               LOAD   ACTIVE SUB     DESCRIPTION
  abrt-ccpp.service                  loaded active exited  Install ABRT coredump hook
  abrt-oops.service                  loaded active running ABRT kernel log watcher
  abrt-xorg.service                  loaded active running ABRT Xorg log watcher
...
● kdump.service                      loaded failed failed  Crash recovery kernel arming
...

UNIT:unit的完整名稱。

LOAD:載入的情況。

ACTIVE:高級激活狀態。

SUB:低級激活狀態。這個狀態會取決於unit的類型有不同的狀態值。

DESCRIPTION:描述。

預設情況下列出的是已激活的服務(不過從上述結果來看,狀態為failed的也可以被列出),想要查看已載入的所有狀態的服務的話,需要傳遞--all選項。

註:--type和--all均有縮寫版,為了顧名思義,這裡儘量都參照官方文檔,給出了完整版選項。

從結果上來看,LOAD狀態為not-found的也可以被列出。

[root@c7-server ~]# systemctl list-units --type service --all
  UNIT                                                  LOAD      ACTIVE   SUB     DESCRIPTION
  abrt-ccpp.service                                     loaded    active   exited  Install ABRT coredump hook
  abrt-oops.service                                     loaded    active   running ABRT kernel log watcher
  abrt-vmcore.service                                   loaded    inactive dead    Harvest vmcores for ABRT
...
● apparmor.service                                      not-found inactive dead    apparmor.service
...
● kdump.service                                         loaded    failed   failed  Crash recovery kernel arming
...

查看所有已安裝的服務類unit單元,並可查看其是否開機啟動。

[root@c7-server ~]# systemctl list-unit-files
UNIT FILE                                     STATE   
proc-sys-fs-binfmt_misc.automount             static
...
tmp.mount                                     disabled
...
cups.path                                     enabled
...
sssd-autofs.service                           indirect
...

顯示服務狀態

[root@c7-server ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: inactive (dead)
     Docs: man:httpd(8)
           man:apachectl(8)
[root@c7-server ~]# systemctl start httpd.service
[root@c7-server ~]# systemctl status httpd.service
● httpd.service - The Apache HTTP Server
   Loaded: loaded (/usr/lib/systemd/system/httpd.service; disabled; vendor preset: disabled)
   Active: active (running) since Fri 2019-11-22 11:49:33 CST; 1s ago
     Docs: man:httpd(8)
           man:apachectl(8)
 Main PID: 3193 (httpd)
   Status: "Processing requests..."
    Tasks: 6
   CGroup: /system.slice/httpd.service
           ├─3193 /usr/sbin/httpd -DFOREGROUND
           ├─3195 /usr/sbin/httpd -DFOREGROUND
           ├─3196 /usr/sbin/httpd -DFOREGROUND
           ├─3197 /usr/sbin/httpd -DFOREGROUND
           ├─3199 /usr/sbin/httpd -DFOREGROUND
           └─3201 /usr/sbin/httpd -DFOREGROUND

Nov 22 11:49:32 c7-server systemd[1]: Starting The Apache HTTP Server...
Nov 22 11:49:33 c7-server systemd[1]: Started The Apache HTTP Server.

服務處於啟動或停止的狀態時,有不同的狀態信息顯示。使用root用戶執行此命令,還可以顯示日誌信息。

如果僅希望查看服務是否啟動,是否開機啟動的話,可使用如下命令。

[root@c7-server ~]# systemctl is-active httpd.service
active
[root@c7-server ~]# systemctl is-enabled httpd.service
disabled

啟動、停止和重啟等

~]# systemctl start httpd.service
~]# systemctl stop httpd.service
~]# systemctl restart httpd.service

如果服務原本是停止的狀態,則執行restart會啟用該服務。如果我們希望只有當服務當前是啟動的狀態才重啟的話,那麼應該執行try-restart。

~]# systemctl try-restart httpd.service

某些服務支持在不打斷運行狀態的情況下重載服務從而讀取配置文件。

~]# systemctl reload httpd.service

如果服務不支持重載的話,服務會忽略systemd的reload操作。為了方便,確保修改的配置文件一定會生效,可以執行如下2個子命令。

reload-or-restart:嘗試reload,如果服務不支持就restart。

reload-or-try-restart:嘗試reload,如果服務不支持就try-restart。如果服務本身沒啟動,那麼再執行了此命令後應該也不會啟動,需要手工啟動。啟動時,服務就會去讀取配置文件了。

~]# systemctl reload-or-restart httpd.service
~]# systemctl reload-or-try-restart httpd.service

開機啟動

~]# systemctl enable httpd.service
~]# systemctl disable httpd.service

當我們設置開機啟動的時候,systemd會讀取服務的配置文件(/usr/lib/systemd/system/httpd.service)中的[Install]部分。

[Install]
WantedBy=multi-user.target

根據此部分的內容創建字元鏈接。

Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

如果服務本身是開機啟動的,那麼再執行一次enable的話並不會創建字元鏈接文件。想確保其一定創建的話,可使用reenable。

~]# systemctl reenable httpd.service
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.
Created symlink from /etc/systemd/system/multi-user.target.wants/httpd.service to /usr/lib/systemd/system/httpd.service.

關閉開機啟動,就是刪除字元鏈接了。

~]# systemctl disable httpd.service
Removed symlink /etc/systemd/system/multi-user.target.wants/httpd.service.

systemd支持mask操作,如果一個服務被mask了,那麼它無法被手動啟動或者被其他服務所啟動,也無法被設置為開機啟動。

[root@c7-server ~]# systemctl mask httpd.service
Created symlink from /etc/systemd/system/httpd.service to /dev/null.
[root@c7-server ~]# systemctl start httpd.service
Failed to start httpd.service: Unit is masked.
[root@c7-server ~]# systemctl enable httpd.service
Failed to execute operation: Cannot send after transport endpoint shutdown

可使用unmask來取消mask。

~]# systemctl unmask httpd.service
Removed symlink /etc/systemd/system/httpd.service.

啟動一個衝突的服務

在systemd中存在積極的(positive)依賴和消極的(negative)依賴。啟動某個特定的服務,可能會要求啟動一個或多個其他服務(此為積極的依賴),或者要求停止一個或多個其他服務(此為消極的依賴)。

當你嘗試啟動某個服務的時候,systemd會自動解決這些依賴關係。註意,systemd不會顯式通知用戶。如果你已經啟動了一個服務A(比如postfix),然後你嘗試啟動服務B(比如sendmail),服務B和服務A有消極的依賴關係,那麼當你啟動服務B的時候,服務A會自動被停止。

註:sendmail和postfix都是郵件服務,之間存在消極的依賴關係。

 

TARGET

Systemd上使用target來模仿以前的運行級別的概念。不過要註意,這隻是模仿,並不代表完全一樣。target可以看作是一系列的unit的集合從而實現某個運行級別的功能。並且這些target之間會存在一個依賴鏈的關係。例如想啟動圖形界面(graphical.target)的話,就需要啟動圖形服務(gdm.service)或者賬戶服務(accounts-daemon.service)並且需要激活multi-user.target。同樣地,multi-user.target需要啟動網路服務(NetworkManager.service)或者D-Bus(dbus.service)並激活basic.target。basic.target也有自己的依賴。

運行級別和target的對應關係如下表。

運行級別 Target Units 描述
0 runlevel0.target, poweroff.target 關閉系統並關閉電源
1 runlevel1.target, rescue.target 救援模式
2 runlevel2.target, multi-user.target 非圖形的多用戶模式
3 runlevel3.target, multi-user.target 非圖形的多用戶模式
4 runlevel4.target, multi-user.target 非圖形的多用戶模式
5 runlevel5.target, graphical.target 帶圖形的多用戶模式
6 runlevel6.target, reboot.target 重啟

查看、切換運行級別/target的新舊命令如下表所示,應儘量避免使用舊的命令。

舊命令 新命令 描述
runlevel systemctl list-units --type target 查看當前系統運行於哪個target下
telinit runlevel systemctl isolate name.target 修改當前的target

查看預設target

~]# systemctl get-default
graphical.target

這個值的獲取,其實是去檢索字元鏈接。

~]# ls -l /etc/systemd/system/default.target
lrwxrwxrwx. 1 root root 36 Oct 17 15:06 /etc/systemd/system/default.target -> /lib/systemd/system/graphical.target

查看當前target

~]# systemctl list-units --type target
UNIT                   LOAD   ACTIVE SUB    DESCRIPTION
basic.target           loaded active active Basic System
bluetooth.target       loaded active active Bluetooth
cryptsetup.target      loaded active active Local Encrypted Volumes
getty-pre.target       loaded active active Login Prompts (Pre)
getty.target           loaded active active Login Prompts
graphical.target       loaded active active Graphical Interface
local-fs-pre.target    loaded active active Local File Systems (Pre)
local-fs.target        loaded active active Local File Systems
multi-user.target      loaded active active Multi-User System
network-online.target  loaded active active Network is Online
network-pre.target     loaded active active Network (Pre)
network.target         loaded active active Network
nfs-client.target      loaded active active NFS client services
nss-user-lookup.target loaded active active User and Group Name Lookups
paths.target           loaded active active Paths
remote-fs-pre.target   loaded active active Remote File Systems (Pre)
remote-fs.target       loaded active active Remote File Systems
rpc_pipefs.target      loaded active active rpc_pipefs.target
slices.target          loaded active active Slices
sockets.target         loaded active active Sockets
sound.target           loaded active active Sound Card
swap.target            loaded active active Swap
sysinit.target         loaded active active System Initialization
timers.target          loaded active active Timers

這個命令查詢出來的,是當前已載入並激活的target。那麼我們如何從裡面找到當前的target是什麼呢?

在bootup(7)的man手冊中有描述,並不是所有的unit都是並行啟動的,局部並行,整體依然是有先後次序之分的。例如:

sysinit.target --> basic.target --> multi-user.target --> graphical.target

rescue.target和emergency.target應該都是單獨出現,也就是說:

見到rescue.target或者emergency.target或者graphical.target,那麼就是對應的target,這三者之間不會有並存的關係。

見到multi-user.target,就看看有沒有graphical.target,沒有的話那就是multi-user.target。

設置預設target

~]# systemctl set-default multi-user.target
Removed symlink /etc/systemd/system/default.target.
Created symlink from /etc/systemd/system/default.target to /usr/lib/systemd/system/multi-user.target.

修改當前的target

類似於以前的切換運行級別。

~]# systemctl isolate multi-user.target

執行了該命令以後,我在Xshell的終端不會斷開,不過VMware中的虛擬機已經退出了GUI進入了CLI。

切換救援(rescue)模式

當正常的系統啟動流程失敗的時候,可以進入救援模式。救援模式是一種單用戶的模式,用於讓用戶修複系統。在救援模式中,OS嘗試掛載所有的文件系統並啟動一些重要的系統服務,但它不會激活網路服務也只允許單用戶同時登錄。類似於以前的單用戶模式。

~]# systemctl rescue

切換至救援模式以後,Xshell終端全部退出並無法登陸,並收到廣播通知。

Broadcast message from root@c7-server on pts/1 (Fri 2019-11-22 17:14:20 CST):

The system is going down to rescue mode NOW!

如果管理員不想讓用戶收到這個通知,可以使用--no-wall選項。

VMware控制台退出登錄並要求root密碼重新登錄。

也可以使用isolate子命令切換至救援模式,但是isolate的方式,不會向其他用戶發送切換救援模式的通知。

~]# systemctl isolate recue.target

切換緊急(emergency)模式

緊急模式是最小化的系統環境,相比救援模式,它所提供的服務就更少了,僅用於當進入救援模式都失敗的時候。

緊急模式中,僅以只讀的方式掛載根文件系統,其他的所有本地文件系統均不掛載,不會激活網路服務,只啟動少許基本服務,需要root密碼。

同樣也支持isoloate切換方式和--no-walls選項。同樣會退出Xshell的終端,僅在VMware控制台允許登錄。因此就不截圖了,貼命令即可。

~]# systemctl emergency
~]# systemctl emergency --no-walls
~]# systemctl isolate emergency.target

 

電源管理

在systemd中使用systemctl統一了電源管理,新舊命令對照表如下:

舊命令 新命令 描述
halt systemctl halt 停止系統
poweroff systemctl poweroff 關機
reboot systemctl reboot 重啟
pm-suspend systemctl suspend 懸掛系統
pm-hibernate systemctl hibernate 休眠系統
pm-suspend-hybrid systemctl hybrid-sleep 休眠並懸掛系統

關機

在Linux中,關閉系統指的是halt,它會停止所有的進程以及CPU,但是並沒有關閉掉電源。而poweroff則比較接近於我們所理解的關機。

如果在VMware中halt了一個系統,那麼它會提示你需要手工關閉電腦的電源才可完成關機。而poweroff則不用。

 

 

因此在Linux環境下的關機,應該是使用poweroff來取代halt。

正確關機:

~]# systemctl poweroff

同樣,關機命令會向系統中的用戶發送消息,支持--no-wall選項不發送消息。

~]# systemctl poweroff --no-all

關機也可以通過shutdown命令。雖然該命令也會調用systemctl來完成關機,但是它支持延時關機和取消延時關機。

~]# shutdown --poweroff hh:mm
~]# shutdown --halt +m
~]# shutdown -c

時間的參數,可以修改為now,等同於+0,表示立即關機。

重啟

~]# systemctl reboot
~]# systemctl reboot --no-wall

懸掛和休眠

懸掛(suspend)指的是將系統的運行狀態保存在記憶體中同時伴隨記憶體模塊異常,並關閉機器中的大部分設備。當用戶回到電腦面前時,可以從記憶體中恢復。由於是從記憶體中恢復並且避免了再一次引導系統,因此它的恢復速度比休眠(hibernation)要快。

如果在懸掛期間電源出現故障,那麼系統的狀態就會丟失了。

~]# systemctl suspend

休眠(hibernate)和懸掛的作用相似,都是保存系統的狀態避免了再次重新引導系統,區別在於休眠是將系統的狀態保存在磁碟中。因此其恢復系統的速度較慢。

~]# systemctl hibernate

還有一個休眠並懸掛系統。

~]# systemctl hybrid-sleep

感覺作為運維,休眠和懸掛應該是不怎麼會在伺服器上所使用的,因此瞭解下常見的關機和重啟操作即可。

 

創建和修改unit文件

創建和修改unit文件是理解systemd工作的重點和難點,對於服務的開發人員來說,應該是必備的技能。對於我目前的運維階段來說,只要達到會看即可,因此這裡先暫時留白,感興趣的可以直接看開頭參考資料中的紅帽文檔。

Unit文件存在於文章開頭處提到的三個目錄,其中“/etc/systemd/system/”目錄是留給管理員自定義的,因此我們自定義的unit文件建議放該目錄下。

Unit文件的文件名:

unit_name.type_extension

unit名和類型都是可替換的,合在一起叫做完整(full)的unit文件名。

例如sshd有兩個常見的unit文件:sshd.service和sshd.socket。

如果我們想對一個unit做選項補充的話,可以新增一個“.d”目錄併在其下創建補充的配置文件。例如當我們想為sshd.service增加自定義的配置選項時,可以創建sshd.service.d/custom.conf配置文件。詳見文檔

另外,還可以存在“sshd.service.wants/”和“sshd.service.requires/”目錄,這些目錄下都是字元鏈接文件,鏈接到其他的unit文件,以此來決定sshd.service的依賴關係。字元鏈接會自動產生,也可人為創建。詳見文檔

瞭解unit文件的結構

Unit文件由典型的三部分構成:

  • [Unit]:包含通用的選項,不受unit類型所影響。這部分主要提供了unit的簡單描述信息,指定其行為,定義其依賴關係。
  • [unit type]:這部分的選項,是和unit類型相關的。即如果是.service類的unit,就有其相關的特定選項。
  • [Install]:在通過systemctl enable或者disable的時候,所涉及到的選項。

[Unit]和[Install]的選項的完整參考手冊,可見systemd.unit(5);[unit type]的選項,則需要根據unit的類型來確定。可通過以下命令查找對應的man手冊。

~]# man -k systemd
...
systemd.scope (5)    - Scope unit configuration
systemd.service (5)  - Service unit configuration
systemd.slice (5)    - Slice unit configuration
systemd.snapshot (5) - Snapshot unit configuration
systemd.socket (5)   - Socket unit configuration
...
systemd.swap (5)     - Swap unit configuration
systemd.target (5)   - Target unit configuration
...

當編輯或者新建了unit的文件,需要使用該命令重載systemd,使其知曉。

~]# systemctl daemon-reload

 

總結

最後對於unit文件的具體描述比較少,在初級運維的時候可能就夠用了。但是在慢慢深入後,對於系統的排錯或者需要開發服務的時候,就需要來瞭解這塊的內容了,到時候若有遇到再來補充。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 最近項目里有遇到一些併發的問題,想實現一個隊列來將併發的請求一個一個串列處理,可以理解為使用消息隊列處理併發問題,之前實現過一個簡單的 `EventBus`,於是想在 `EventBus` 的基礎上改造一下,加一個隊列,改造成類似消息隊列的處理模式。消息的處理(Consumer)直接使用 .netc... ...
  • 為什麼要使用泛型倉儲?好處是? 前兩章在autofac註入的時候,用的User類作為例子,寫了增刪改查四個介面,也就是倉儲的GRUD。 當我們再添加一個實體(比如Student)時,StudentRepository跟UserRepository代碼幾乎一樣的代碼,重覆量很大,為了減少冗餘、提高工作 ...
  • MiniProfiler 是一款性能分析的輕量級程式,可以基於action(request)記錄每個階段的耗時時長,還是可以顯示訪問資料庫時的SQL(支持EF、EF Code First)等 一、安裝程式包 通過Nuget安裝MiniProfiler : Install-Package MiniPr ...
  • Swagger 是一款自動生成線上介面文檔+功能測試功能軟體 一、安裝程式包 通過管理 NuGet 程式包安裝,搜索Swashbuckle.AspNetCore 二、配置 Swagger 將 Swagger 添加到 Startup.ConfigureServices 方法中的服務集合中: //註入S ...
  • 一、準備工作 通過程式包管理器控制台安裝AutoFac: Install-Package Autofac.Extensions.DependencyInjection 創建新類庫(.NetCore 2.2類庫),存放介面跟實現類,命名為NetCoreWebApi.Repository。 創建用戶倉儲 ...
  • 一、Linux目錄結構 二、Linux安裝JDK ...
  • http://home.eeworld.com.cn/my/space-uid-716241-blogid-655190.html 一、I2C協議簡介 I2C是兩線式串列匯流排,用於連接微控制器及其外圍設備。兩根信號線分別是: 時鐘信號線SCL和數據信號線SDA。 二、I2C匯流排傳輸時序 2.1 I2 ...
  • 回到目錄 BJT晶體管的交流分析(也叫小信號分析)是模擬電路中的一個難點,也可以說是模電中的一個分水嶺。如果你能夠把BJT交流分析的原理全都搞懂,那之後的學習就是一馬平川了。後面的大部分內容,諸如:場效應管、運放分析、功率放大器等等,基本上已經沒有什麼可以再難得倒你了。甚至可以說,市面上一般的模擬電 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...