3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

systemdをざっくり理解したい

Last updated at Posted at 2020-11-03

環境

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.servicebluetoothと書ける。
  • mount point は自動的に.mountunit と解釈される。/homehome.mountに等しい。
  • device も自動的に.deviceunit と解釈される。/dev/sda2dev-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と表示される。
その他の値としては、errornot-foundbad-settingmasked
さらに括弧内には、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

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?