備註:

在 Oracle Linux 上使用 systemd

簡介

在本教學課程中,您將瞭解如何使用 systemctl 命令行公用程式管理和檢視 systemd 控制的 systemd 單位。本教學課程的適用對象是 Oracle Linux 8 或更新版本的使用者。

systemd 是啟動時的第一個程序,是系統關閉時終止的最終程序。systemd 主要用來管理系統服務或程序以及啟動時的系統初始化。不過,systemd 也能夠處理許多其他工作和功能,包括事件記錄、裝置管理、使用者登入、作業排程、時間同步及系統啟動。由於使用者可能較為熟悉替代軟體以供這些用途或不同的 Linux 發行套件可能偏好的方式,許多系統的功能並不完整使用。

系統內不同類型的行為或功能,會以系統性單位進行處理。例如,常駐程式程序或系統服務會以服務單元執行,而系統狀態通常則定義為目標單位。計時器單位可以定義為排程工作,就像使用系統 cron 服務一樣,以及使用掛載點為在系統 fstab 中配置掛載點的方式一樣。

systemd 可用來管理系統階層處理程序與功能,但也能夠管理在使用者空間中執行的處理程序。系統上的使用者可以設定和管理自己的服務,甚至可以設定讓這些服務在使用者終止階段作業後繼續執行。

目標

軟硬體需求

注意:使用免費實驗室環境時,請參閱 Oracle Linux Lab Basics 以取得連線和其他使用指示。

探索 systemd 單位檔案

連線至 Oracle Linux 8 執行處理後,您就可以開始對 systemctl 命令實驗,瞭解可用的不同單位。

  1. 執行 systemctl 指令,列出目前由 systemd 載入的所有 systemd 單位:

    systemctl
    

    使用鍵盤上的空格或 PgDn 鍵可逐頁完成輸出。

    此指令等同於執行:

    systemctl list-units
    

    輸出會顯示系統正在管理的所有目前使用中配置單位。在輸出中,您應該注意到有以不同後置標記命名的單位,包括以 '.device「、」.mount「、」service「、」.target「 和 」.timer「 後置標記的名稱。

    單位在啟動、執行、掛載或插入時,取決於其目的。單位在停止、卸載或中斷連線方面都可以處於非作用中狀態。若您想查看所有單位是否皆有效,您可執行以下作業:

    systemctl list-units --all
    

    這些指令的輸出會顯示不同類型的 systemd 單位:

    • automount:提供可視需要掛載檔案系統和平行啟動功能的自動掛載功能。
    • mount:控制檔案系統目前日期與時間顯示中的掛載點。
    • path:當檔案系統路徑資訊變更時,可以啟動服務。
    • scope:與服務單位類似,但管理外部處理,而非啟動它們。
    • service:啟動及控制常駐程式及其組成的程序。
    • slice:用來將階層 cgroup 樹狀結構中的系統程序 (例如服務單位和範圍單位) 分組,以供資源管理之用。
    • socket:封裝系統中的本機處理作業間通訊 (IPC) 或網路通訊端,這對於以通訊端為基礎的啟用很有用。
    • target:用於群組單元,或在啟動期間提供已知的同步化點。
    • timer:用來使用計時器觸發其他單位的啟動。這些提供先前可以使用 cron 服務管理的作業替代方式。
    • device:公開 systemd 中的核心裝置,也可用來實作裝置基礎啟用。
    • swap:封裝記憶體交換分割區或交換檔案。
  2. 使用 --type 選項,將單位清單限制為特定單位類型。

    • 使用 systemctl list-units --type services 指令列出系統上目前作用中的服務單位。

      systemctl list-units --type service
      
    • 再次執行相同的指令,但是包含 --all 選項,可以查看所有載入的單位,包括停用的單位 (如果有的話)。

      systemctl list-units --type service --all
      

您可以針對各種可用的服務類型重複這些指令,以便您隨時將資訊限制為僅有興趣使用的類型。

使用系統目標單位

目標單位用於將不同的單位群組在一起,以將系統帶至特定狀態,以便系統可針對特定用途運作。

  1. 列出可用的 target 單位。

    systemctl list-units --type target
    

    單位可能需要載入其他單位,或可配置成與特定單位衝突。例如,multi-user.target 需要 basic.target 才能運作,而且與 rescue.servicerescue.target 單位衝突。單位也會指定要載入以運作的其他單位。

    如此一來,目標可以鏈結在一起以設定特定狀態,但也可用於模組化,以觸發替代狀態。

  2. 檢視預設目標單位。

    預設目標單位會定義開機後的預設系統狀態。

    • 使用 systemctl get-default 指令來檢視預設使用的目標單位。預設目標單位由 /etc/systemd/system/default.target 檔案表示。

      systemctl get-default
      
    • 使用 ls -l 指令列出 /etc/systemd/system/default.target 檔案的相關資訊。

      ls -l /etc/systemd/system/default.target
      

      注意:default.target 檔案是目前預設目標單位檔案的符號連結。

  3. 變更預設目標單位。

    • 使用 systemctl set-default 指令將預設目標單位變更為 graphical.target 單位。

      systemctl set-default graphical.target
      
    • 使用 ls –l 指令來確認 default.target 檔案現在是 graphical.target 檔案的符號連結。

      ls -l /etc/systemd/system/default.target
      

      注意:變更預設目標單位會移除現有的 default.target 符號連結,然後重新建立指向新預設目標單位的符號連結。

  4. 探索目標以瞭解詳細資訊。

    • 使用 systemctl show 命令來取得任何特定目標的詳細資訊。

      systemctl show multi-user.target
      

      輸出會顯示您所指定目標的所有參數。請注意,您可以識別目標所需的單位、希望與衝突,也可以查看此目標之前與之後必須執行的單位。

    • 使用 systemctl list-dependencies 命令來顯示特定目標所需的相依性或想要達到其狀態的樹狀結構:

      systemctl list-dependencies default.target
      

      此指令顯示啟動預設目標時啟動的所有單位。單位鏈會遞迴顯示在樹狀目錄中,這樣可以完整評估目標在開始時的達成程度。如果您已將 graphical.target 設為預設目標,您可以看到系統要執行 display-manager.service 以載入圖形顯示,但是它也會執行 multi-user.target 來執行圖形顯示前所需的所有作業。

使用 systemctl 啟用、停用以及遮罩單位

可以停用或啟用單位,也可以遮蔽,使其永遠不會在任何情況下執行。某些單位是靜態的單位,通常都是可用的,因為它們是其他單位的依存關係。systemctl list-units 指令只能用來顯示系統上使用中或非作用中的單位。

  1. 列出系統上所有可用單位及其狀態:

    systemctl list-unit-files
    

    許多可用單位都是靜態的。開機時的啟用單位開始。停用的單位是系統上可用的單位,但未在啟動時配置到。系統上有遮罩的單位,但已主動設定為無法啟動它們的狀態。

  2. 使用 systemctl status 指令來檢視有關 nfs-server.service 單位的詳細資訊。

    systemctl status nfs-server.service
    

    systemctl 指令可讓您在參照服務單位時刪除 .service 副檔名。

    status 命令指示單位是否啟用、作用中、非作用中、停用或遮罩。

    若為命令檔式解決方案,systemctl 會在單行中提供輸出狀態的簡短命令:

    • 使用 systemctl is-active 指令來檢查 nfs-server 服務是否正在執行 (作用中) 或不在執行中 (非作用中)。

      systemctl is-active nfs-server
      
    • 使用 systemctl is-enabled 指令來檢查 nfs-server 服務是否啟用或停用。服務啟用後,會在系統重新啟動時啟動。

      systemctl is-enabled nfs-server
      
  3. 啟用服務以在啟動時啟動。

    使用 systemctl enable 指令可啟用 nfs-server 服務。

    sudo systemctl enable --now nfs-server
    

    如果指令變更系統狀態或配置,您必須使用管理員權限執行 systemctl 指令。您可以使用 --now 選項,在啟用服務的同時額外啟動服務。

    注意:這個指令藉由為服務啟動的最低層次系統狀態目標建立符號連結來啟用服務。在輸出中,該命令會為 multi-user 目標建立符號連結 nfs-server.service

    請使用 systemctl status command 來確認 nfs-server 服務現在已啟用並在執行中。

    systemctl status nfs-server
    
  4. 停用和停止服務。

    使用 systemctl disable 指令來停用 nfs-server 服務。另請注意,systemctl disable 指令會刪除服務的 systemctl 連結。

    sudo systemctl disable nfs-server
    

    使用 systemctl stop 指令停止 nfs-server 服務。

    sudo systemctl stop nfs-server
    

    當您停用服務時,可以使用 --now 選項來結合這些步驟。

  5. 遮罩和取消遮罩單位。

    在某些情況下,您可能希望完全停用單位。通常,如果特定單位與系統上某些其他功能衝突,或者基於策略原因,您可能會這麼做。

    使用 systemctl mask 指令來遮罩 nfs-server 服務:

    sudo systemctl mask nfs-server
    

    系統會建立符號連結,以確保 systemd 單元配置指向 /dev/null。這樣可避免服務或啟動服務。

    確認遮罩時,無法啟動 nfs-server 單元:

    sudo systemctl start nfs-server
    

    服務無法啟動,而且傳回錯誤來指示已遮罩服務。

    取消遮罩單位使其回到原始狀態,並允許使用者啟動或啟用服務。

    sudo systemctl unmask nfs-server
    

為使用者空間單位設定 systemd

一般而言,systemd 可用來管理系統階層的單位。使用者需要系統管理者階層的存取權,才能管理以此方式設定的系統單元。在某些環境以及某些單位類型中,使用者可能希望使用系統的能力在使用者空間內執行單位。例如,使用者可能會想要使用系統計時器單元功能來排定工作;或者使用者可能想執行特定應用程式或服務作為服務單元,而服務單位不需要根層級權限即可執行。

systemd 在登入時為使用者啟動 systemd 使用者程序。使用者會依照下列順序處理位於下列目錄中的單位:

如果不想使用任何 systemd 指令的 --user 選項,即可指示系統使用使用者空間中的作業。

  1. 列出使用者目前可用的單位檔案。

    systemctl --user list-unit-files
    

    請注意,可用單位的清單會比在沒有 --user 選項的情況下發出相同的指令時明顯短。

    在新系統上,這些單位檔案的大部分位於 /usr/lib/systemd/user。列出此目錄中的檔案以檢視位於此處的單位:

    ls -la /usr/lib/systemd/user/
    
  2. 建立一個代管系統單元檔案的目錄。

    mkdir -p $HOME/.config/systemd/user
    
  3. 建立專屬的系統服務單位。

    cat << EOF > $HOME/.config/systemd/user/uptime.service
    [Unit]
    Description="Logs system uptime and load average"
    Wants=uptime.timer
    
    [Service]
    ExecStart=/usr/bin/uptime
    
    [Install]
    WantedBy=default.target
    
    EOF
    

    此服務單位提供三個配置區段。

    Unit 區段提供單位與任何需求的描述。在此情況下,Wants 項目會定義尚未存在之計時器單位的虛弱需求。如果列出為 Wants 項目的單位可以使用,但如果找不到父項單位或執行,則不會阻止父項單位執行。

    Service 區段定義此特定服務單元執行時的行為。我們依賴此處可用選項的許多預設值,而且只需指定 ExecStart 行,這指定啟動服務時所執行的指令。在此情況下,會執行 uptime 指令來記錄系統正常運作時間和負載值。

    Install 區段定義服務在啟用後應如何安裝在系統上。尤其是,服務會新增為 'default.target「 WantedBy 的服務。這代表服務已啟用成為此使用者預設目標的一部分。

  4. 執行 systemd 單位並檢查其輸出。

    由於您已新增單位,在嘗試執行服務之前,通常最好先重新載入系統配置:

    systemctl --user daemon-reload
    

    現在,開始新的單位 。

    systemctl --user start uptime
    

    檢查命令是否如預期般執行。您可以檢查服務的狀態,檢查服務是否已執行:

    systemctl --user status uptime
    

    注意:這些指令會使用 --user 選項在使用者空間內執行。

    若要從執行的 uptime 指令檢查輸出,請使用 journalctl 指令檢視日誌並指定標記選項,檢視指令的特定日誌:

    journalctl -t uptime
    

    您可以啟用此服務,讓使用者第一次登入系統時即啟動此服務。

    systemctl --user enable uptime
    

    請注意,服務會在使用者第一次登入系統時執行。系統啟動時不會自動啟動。通常,使用者登出之後或所有使用者階段作業被終止後,使用者空間中執行的服務就會終止。本教學課程稍後會討論啟用使用者服務的持續性。

使用 systemd 計時器單位

在本練習中,您將在先前的練習上建立,以便讓計時器單位在特定時間或間隔定期執行另一個系統單元。計時器單位可在系統階層與使用者階層皆定義,且可用來定義何時應執行另一單位。計時器單位可以對排定的事件提供精細的控制,並可用作讓 cron 常駐程式處理更細微的配置。

許多系統服務都包含計時器單位,以在執行時進行控制。dnf-automatic 套裝軟體中包含了計時器單元的絕佳範例,可供系統在定期 dnf 更新執行時,保持最新的狀態。若要在系統層級查看此動作,請安裝套裝軟體並啟用計時器單位:

sudo dnf install -y dnf-automatic
sudo systemctl enable dnf-automatic.timer

您可以檢視單位檔案來查看此單位的設定方式:

cat /usr/lib/systemd/system/dnf-automatic.timer

此單位中的無表格內容,包含預期符合 network-online.targetWants 行。組態之 Timer 區段中的 OnCalendar 項目表示此動作每天在 06h00 執行。此外,也有興趣的 RandomizedDelaySec 項目,有助於防止計時器單位完全同時間發射,並突然推進系統負載。

此處提供的範例為一組更複雜的單位。為了更加瞭解計時器單位如何運作,請在使用者空間中新增計時器單位,以排定您在前一個練習中建立的 uptime.service,讓它定期執行。

  1. 建立計時器單位檔案。

    cat <<EOF > $HOME/.config/systemd/user/uptime.timer
    [Unit]
    Description=Timer for the uptime service that logs uptime
    Requires=uptime.service
    
    [Timer]
    Unit=uptime.service
    OnCalendar=*-*-* *:*:00
    
    [Install]
    WantedBy=timers.target
    

    此檔案指定執行此計時器單位需要 uptime.service。此需求比 Wants 定義中定義的值更強,而且不符合需求時,單位就不會執行。

    Timer 區段定義使用 OnCalendar 項目載入 uptime.service 單位。OnCalendar 項目函數與 crontab 定義中的選項類似,但提供更精細度。在此案例中,單位定義為在 00 秒的每分鐘執行。

  2. 由於您修改了系統配置,請重新載入系統常駐程式並重新啟動正常運作時間服務,讓它能夠接收新的計時器單位:

    systemctl --user daemon-reload
    systemctl --user restart uptime
    
  3. 列出單位以檢查 uptime.serviceuptime.timer 單位是否正在執行。

    systemctl --user list-units
    
  4. 監督日誌中的日誌輸出,以查看由正常運作時間服務每分鐘觸發的正常運作時間輸出。

    journalctl -f -t uptime
    

    數分鐘後,應該會顯示幾行的輸出。如果您注意到付款結案,您可能會注意到正常運作時間指令在 1 分鐘內不會始終觸發。這是 systemd 計時器功能中的意圖。計時器工作是隨機觸發的,可以允許工作延遲最多到一分鐘。這有助於避免計時器完全同時觸發。您可以將下列組態項目新增至計時器單位 Timer 區段,強制讓計時器在排定事件的 1 個條件內設定正確性,讓計時器更為精確:

    AccuracySec=1us
    

    不過,對大多數作業而言,允許程度的不精確性是讓工作無法同步地執行。

    當您完成監視時,可以使用 Ctrl-C 鍵組合來結束分錄。

設定登出之後要繼續的使用者空間處理作業

使用者登出或使用者的所有階段作業已終止時,啟動和擁有的服務和處理作業會被終止。有數種方法可以用來在 systemd 中變更此預設行為。此處會探索兩個選項。

使用 loginctl 命令來啟用 systemd 指頭使用者

loginctl 指令可以用來變更特定使用者的預設行為,並在使用者的階段作業終止後啟用該使用者的程序以「猜測者」。

  1. 使用 loginctl 公用程式為特定使用者啟用連結。在此執行處理中,啟用 'oracle「 使用者的系統化歌手行為:

    sudo loginctl enable-linger oracle
    
  2. 若要驗證是否套用此設定,請檢查 /var/lib/systemd/linger 目錄中使用者同名的檔案。

    ls /var/lib/systemd/linger/oracle
    

    指令應該驗證檔案是否存在。

編輯 systemd logind.conf 檔案

Systemd 可管理使用者登入事件,並提供可以編輯的組態檔,以設定與使用者階段作業相關之不同事件的預設行為。此組態檔位於 /etc/systemd/logind.conf

  1. /etc/systemd/logind.conf 上現有組態的內容傾印至畫面以複查:

    cat /etc/systemd/logind.conf
    

    大多數的選項都是註解,但會顯示編譯時間預設值。此檔案中有三個選項,當使用者的階段作業終止時,可以控制 systemd 處理在使用者空間中執行的程序的方式。

    • KillUserProcesses:此選項可控制階段作業結束時,使用者處理作業是否預設終止。將此選項設為 'no「,可讓系統在任何使用者登出系統之後執行使用者處理作業。
    • KillExcludeUsers:如果啟用 KillUserProcesses 選項,此選項可讓您指定使用空格區隔的使用者清單,以便讓處理作業在階段作業終止後繼續執行。將使用者名稱新增至此清單的行為類似於使用 loginctl 命令將使用者新增至 systemd 歌手群組。
    • KillOnlyUsers:如果停用 KillUserProcesses 選項,則可以使用這個參數指定使用者清單,讓使用者在登出之後應該終止處理作業。

影片演示

如果您使用 Oracle Linux 8 系統的更多相關資訊,請參閱 https://www.youtube.com/watch?v=9uDvnZKhU8Ahttps://www.youtube.com/watch?v=Tkxs-wfZrnw

Oracle Linux 8 上的系統和服務管理程式

Oracle Linux 8 上的 systemd 目標單元

其他資訊

其他學習資源

探索 docs.oracle.com/learn 上的其他實驗室,或是存取更多免費學習內容至 Oracle Learning YouTube 通道。此外,瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning Explorer。

如需產品文件,請瀏覽 Oracle Help Center