systemdをざっくり理解したい

# 環境

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