天天看點

[Linux] Systemd 入門教程:指令篇

[Linux] Systemd 入門教程:指令篇

下面的指令用來啟動服務。

這種方法有兩個缺點。

一是啟動時間長。<code>init</code>程序是串行啟動,隻有前一個程序啟動完,才會啟動下一個程序。

二是啟動腳本複雜。<code>init</code>程序隻是執行啟動腳本,不管其他事情。腳本需要自己處理各種情況,這往往使得腳本變得很長。

Systemd 就是為了解決這些問題而誕生的。它的設計目标是,為系統的啟動和管理提供一套完整的解決方案。

根據 Linux 慣例,字母<code>d</code>是守護程序(daemon)的縮寫。 Systemd 這個名字的含義,就是它要守護整個系統。

[Linux] Systemd 入門教程:指令篇

使用了 Systemd,就不需要再用<code>init</code>了。Systemd 取代了<code>initd</code>,成為系統的第一個程序(PID 等于 1),其他程序都是它的子程序。

上面的指令檢視 Systemd 的版本。

[Linux] Systemd 入門教程:指令篇

(上圖為 Systemd 架構圖)

Systemd 并不是一個指令,而是一組指令,涉及到系統管理的方方面面。

<code>systemctl</code>是 Systemd 的主指令,用于管理系統。

<code>systemd-analyze</code>指令用于檢視啟動耗時。

<code>hostnamectl</code>指令用于檢視目前主機的資訊。

<code>localectl</code>指令用于檢視本地化設定。

<code>timedatectl</code>指令用于檢視目前時區設定。

<code>loginctl</code>指令用于檢視目前登入的使用者。

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:定時器

<code>systemctl list-units</code>指令可以檢視目前系統的所有 Unit 。

<code>systemctl status</code>指令用于檢視系統狀态和單個 Unit 的狀态。

除了<code>status</code>指令,<code>systemctl</code>還提供了三個查詢狀态的簡單方法,主要供腳本内部的判斷語句使用。

對于使用者來說,最常用的是下面這些指令,用于啟動和停止 Unit(主要是 service)。

Unit 之間存在依賴關系:A 依賴于 B,就意味着 Systemd 在啟動 A 的時候,同時會去啟動 B。

<code>systemctl list-dependencies</code>指令列出一個 Unit 的所有依賴。

上面指令的輸出結果之中,有些依賴是 Target 類型(詳見下文),預設不會展開顯示。如果要展開 Target,就需要使用<code>--all</code>參數。

每一個 Unit 都有一個配置檔案,告訴 Systemd 怎麼啟動這個 Unit 。

Systemd 預設從目錄<code>/etc/systemd/system/</code>讀取配置檔案。但是,裡面存放的大部分檔案都是符号連結,指向目錄<code>/usr/lib/systemd/system/</code>,真正的配置檔案存放在那個目錄。

<code>systemctl enable</code>指令用于在上面兩個目錄之間,建立符号連結關系。

如果配置檔案裡面設定了開機啟動,<code>systemctl enable</code>指令相當于激活開機啟動。

與之對應的,<code>systemctl disable</code>指令用于在兩個目錄之間,撤銷符号連結關系,相當于撤銷開機啟動。

配置檔案的字尾名,就是該 Unit 的種類,比如<code>sshd.socket</code>。如果省略,Systemd 預設字尾名為<code>.service</code>,是以<code>sshd</code>會被了解成<code>sshd.service</code>。

<code>systemctl list-unit-files</code>指令用于列出所有配置檔案。

這個指令會輸出一個清單。

這個清單顯示每個配置檔案的狀态,一共有四種。

enabled:已建立啟動連結 disabled:沒建立啟動連結 static:該配置檔案沒有<code>[Install]</code>部分(無法執行),隻能作為其他配置檔案的依賴 masked:該配置檔案被禁止建立啟動連結

注意,從配置檔案的狀态無法看出,該 Unit 是否正在運作。這必須執行前面提到的<code>systemctl status</code>指令。

一旦修改配置檔案,就要讓 SystemD 重新加載配置檔案,然後重新啟動,否則修改不會生效。

配置檔案就是普通的文本檔案,可以用文本編輯器打開。

<code>systemctl cat</code>指令可以檢視配置檔案的内容。

從上面的輸出可以看到,配置檔案分成幾個區塊。每個區塊的第一行,是用方括号表示的差別名,比如<code>[Unit]</code>。注意,配置檔案的區塊名和字段名,都是大小寫敏感的。

每個區塊内部是一些等号連接配接的鍵值對。

注意,鍵值對的等号兩側不能有空格。

<code>[Unit]</code>區塊通常是配置檔案的第一個區塊,用來定義 Unit 的中繼資料,以及配置與其他 Unit 的關系。它的主要字段如下。

<code>Description</code>:簡短描述 <code>Documentation</code>:文檔位址 <code>Requires</code>:目前 Unit 依賴的其他 Unit,如果它們沒有運作,目前 Unit 會啟動失敗 <code>Wants</code>:與目前 Unit 配合的其他 Unit,如果它們沒有運作,目前 Unit 不會啟動失敗 <code>BindsTo</code>:與<code>Requires</code>類似,它指定的 Unit 如果退出,會導緻目前 Unit 停止運作 <code>Before</code>:如果該字段指定的 Unit 也要啟動,那麼必須在目前 Unit 之後啟動 <code>After</code>:如果該字段指定的 Unit 也要啟動,那麼必須在目前 Unit 之前啟動 <code>Conflicts</code>:這裡指定的 Unit 不能與目前 Unit 同時運作 <code>Condition...</code>:目前 Unit 運作必須滿足的條件,否則不會運作 <code>Assert...</code>:目前 Unit 運作必須滿足的條件,否則會報啟動失敗

<code>[Install]</code>通常是配置檔案的最後一個區塊,用來定義如何啟動,以及是否開機啟動。它的主要字段如下。

<code>WantedBy</code>:它的值是一個或多個 Target,目前 Unit 激活時(enable)符号連結會放入<code>/etc/systemd/system</code>目錄下面以 Target 名 + <code>.wants</code>字尾構成的子目錄中 <code>RequiredBy</code>:它的值是一個或多個 Target,目前 Unit 激活時,符号連結會放入<code>/etc/systemd/system</code>目錄下面以 Target 名 + <code>.required</code>字尾構成的子目錄中 <code>Alias</code>:目前 Unit 可用于啟動的别名 <code>Also</code>:目前 Unit 激活(enable)時,會被同時激活的其他 Unit

<code>[Service]</code>區塊用來 Service 的配置,隻有 Service 類型的 Unit 才有這個區塊。它的主要字段如下。

<code>Type</code>:定義啟動時的程序行為。它有以下幾種值。 <code>Type=simple</code>:預設值,執行<code>ExecStart</code>指定的指令,啟動主程序 <code>Type=forking</code>:以 fork 方式從父程序建立子程序,建立後父程序會立即退出 <code>Type=oneshot</code>:一次性程序,Systemd 會等目前服務退出,再繼續往下執行 <code>Type=dbus</code>:目前服務通過D-Bus啟動 <code>Type=notify</code>:目前服務啟動完畢,會通知<code>Systemd</code>,再繼續往下執行 <code>Type=idle</code>:若有其他任務執行完畢,目前服務才會運作 <code>ExecStart</code>:啟動目前服務的指令 <code>ExecStartPre</code>:啟動目前服務之前執行的指令 <code>ExecStartPost</code>:啟動目前服務之後執行的指令 <code>ExecReload</code>:重新開機目前服務時執行的指令 <code>ExecStop</code>:停止目前服務時執行的指令 <code>ExecStopPost</code>:停止當其服務之後執行的指令 <code>RestartSec</code>:自動重新開機目前服務間隔的秒數 <code>Restart</code>:定義何種情況 Systemd 會自動重新開機目前服務,可能的值包括<code>always</code>(總是重新開機)、<code>on-success</code>、<code>on-failure</code>、<code>on-abnormal</code>、<code>on-abort</code>、<code>on-watchdog</code> <code>TimeoutSec</code>:定義 Systemd 停止目前服務之前等待的秒數 <code>Environment</code>:指定環境變量

啟動計算機的時候,需要啟動大量的 Unit。如果每一次啟動,都要一一寫明本次啟動需要哪些 Unit,顯然非常不友善。Systemd 的解決方案就是 Target。

簡單說,Target 就是一個 Unit 組,包含許多相關的 Unit 。啟動某個 Target 的時候,Systemd 就會啟動裡面所有的 Unit。從這個意義上說,Target 這個概念類似于"狀态點",啟動某個 Target 就好比啟動到某種狀态。

傳統的<code>init</code>啟動模式裡面,有 RunLevel 的概念,跟 Target 的作用很類似。不同的是,RunLevel 是互斥的,不可能多個 RunLevel 同時啟動,但是多個 Target 可以同時啟動。

Target 與 傳統 RunLevel 的對應關系如下。

它與<code>init</code>程序的主要差别如下。

(1)預設的 RunLevel(在<code>/etc/inittab</code>檔案設定)現在被預設的 Target 取代,位置是<code>/etc/systemd/system/default.target</code>,通常符号連結到<code>graphical.target</code>(圖形界面)或者<code>multi-user.target</code>(多使用者指令行)。 (2)啟動腳本的位置,以前是<code>/etc/init.d</code>目錄,符号連結到不同的 RunLevel 目錄 (比如<code>/etc/rc3.d</code>、<code>/etc/rc5.d</code>等),現在則存放在<code>/lib/systemd/system</code>和<code>/etc/systemd/system</code>目錄。 (3)配置檔案的位置,以前<code>init</code>程序的配置檔案是<code>/etc/inittab</code>,各種服務的配置檔案存放在<code>/etc/sysconfig</code>目錄。現在的配置檔案主要存放在<code>/lib/systemd</code>目錄,在<code>/etc/systemd</code>目錄裡面的修改可以覆寫原始設定。

Systemd 統一管理所有 Unit 的啟動日志。帶來的好處就是,可以隻用<code>journalctl</code>一個指令,檢視所有日志(核心日志和應用日志)。日志的配置檔案是<code>/etc/systemd/journald.conf</code>。

<code>journalctl</code>功能強大,用法非常多。

(完)

本文轉自demoblog部落格園部落格,原文連結http://www.cnblogs.com/0616--ataozhijia/p/8037867.html如需轉載請自行聯系原作者

demoblog

繼續閱讀