環境
OS: Manjaro 19.1 (たしか)
systemdの概念的な
systemd は、Linux システムの最初に起動されるデーモンプロセス (PID: 1)。
他のプロセスを起動し、すべてのプロセスの先祖プロセスとなる。
また (そのため) 他のデーモンプロセスを管理する目的をもつ。
systemctl コマンド
systemd を調査したり操作するにはsystemctl
コマンドを主に使う。
systemctl
コマンドを実行すると、以下のように unit のリストがドバっと出てくる。
$ systemctl
UNIT LOAD ACTIVE SUB DESCRIPTION
sys-module-fuse.device loaded active plugged /sys/module/fuse
-.mount loaded active mounted Root Mount
boot-efi.mount loaded active mounted /boot/efi
systemd-journald.service loaded active running Journal Service
systemd-logind.service loaded active running Login Service
user@1000.service loaded failed failed User Manager for UID 1000
...
manページによるとsystemctl
コマンド (= systemctl list-units
コマンド) は、「systemdがメモリに保持している unit のリストを表示する」とのこと。
unit とは。
unit とは
- その操作方法や管理方法を systemd が知っているあらゆるリソースのことを unit と呼ぶ。
- unit file と呼ばれる設定ファイルによって定義される。
まあつまり systemd が管理するオブジェクト単位かなと。
unit を操作していく
例えば、以下のように unit を指定して、その状態をみたりする。
$ systemctl status bluetooth.service
上記のbluetooth.service
が unit。
一旦概観を挟む。
unit は、例えば service (.service
) や mount point (.mount
) 、device (.device
) 、socket (.socket
) などであるらしい。(ここ詳しくは理解していない。)
systemctl コマンドを使う際は unit のフルネームが必要。
つまりさっきのbluetooth.service
がそれ。
ただ短縮形を使えるルールもある。3つ。
- suffix を省略すると、systemctl は
.service
と理解する。つまりbluetooth.service
はbluetooth
と書ける。 - mount point は自動的に
.mount
unit と解釈される。/home
はhome.mount
に等しい。 - device も自動的に
.device
unit と解釈される。/dev/sda2
はdev-sda2.device
に等しい。
ふたたび、さっきのコマンドに戻る。
出力結果は以下。
$ systemctl status bluetooth.service
● bluetooth.service - Bluetooth service
Loaded: loaded (/usr/lib/systemd/system/bluetooth.service; enabled; vendor preset: enabled)
Active: active (running) since Wed 2017-01-04 13:54:04 EST; 1 weeks 0 days ago
Docs: man:bluetoothd(8)
Main PID: 930 (bluetoothd)
Status: "Running"
Tasks: 1
Memory: 648.0K
CPU: 435ms
CGroup: /system.slice/bluetooth.service
└─930 /usr/lib/bluetooth/bluetoothd
Jan 12 10:46:45 example.com bluetoothd[8900]: Not enough free handles to register service
Jan 12 10:46:45 example.com bluetoothd[8900]: Current Time Service could not be registered
Jan 12 10:46:45 example.com bluetoothd[8900]: gatt-time-server: Input/output error (5)
Loaded 行には、unit がメモリにロードされていたらloaded
と表示される。
その他の値としては、error
、not-found
、bad-setting
、masked
。
さらに括弧内には、unit file のパスや、現在 enable かどうか (boot時に起動されるかどうか)、が表示される。
unit file
ここで unit file がでてきた。
さっきの出力結果から bluetooth.service は /usr/lib/systemd/system/bluetooth.service で定義されているらしい。
(実際にファイルを見てみると案外シンプルな内容。)
unit file については、manページがあるらしいのでざっくり見る。(systemd.unit(5)
)
いくつかのセクションからなる、さまざまなディレクティブが存在するらしい。
これらが unit を定義しているのだろう。
また、System Unit Search Path というところに/usr/lib/systemd/system/*
というのがあった。
さっきの bluetoooth.service unit の unit file はこのディレクトリから探されていたっぽい。
とにかく unit と同じ名前の unit file が特定のディレクトリに置いてあり、unit はそのファイルで定義されていることが分かった。
systemctlの具体的なコマンド
なんとなく systemd の unit 管理方法をわかった気になったので、今度は具体的なコマンドについて見ていく。
systemctl status <unit>
実行状況やunit fileのpath、pid、最新ログなどが表示される。
systemctl start <unit>
即座に起動する。
systemctl stop <unit>
即座に止める。
systemctl enabled <unit>
enable にする。
(boot時に起動する設定にする。)
まとめ
systemd は、特定のディレクトリにある unit file を見て、操作単位である unit を管理する。
systemctl コマンドによってこれらはユーザーから管理/操作できる。
どんな unit が動いているのか見たり、状態を調べたりして遊べそう。
参考
systemctl manページ
Arch Linux wiki
https://wiki.archlinux.org/index.php/Systemd#Using_units
Understanding Systemd Units and Unit Files
https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files
Wikipedia
https://en.wikipedia.org/wiki/Systemd