😶‍🌫️

systemdの奥深い世界に足を踏み入れる

に公開

systemdの深淵に触れる

「systemdの思想と機能」という書籍を購入したので理解したことを書き記す。
systemdって普段はデーモンの自動起動とか起動停止とかでしかほとんど意識しないので、ちょっとタイトルに興味をひかれて購入。
以前にEC2のUserData周りを知りたくて起動時の順序を理解してたときとか、シャットダウン直前の処理を追加したくなった時に調査したのだが、表面上の理解をするだけでも苦戦した覚えがあるので改めて挑戦。

systemdはLinuxを世界征服した(らしい)

本章タイトルは、書店で立ち読み中に見かけた言葉だが、ハッカーなり立ての自分としてはLinuxの世界征服という言葉に非常に魅力を感じた。つまりsystemdを掌握すればさらにLinuxの高みに行けると言っても過言ではないという希望を胸に即座に購入した。

世界征服というのは、これまで独立したプロジェクトとして扱われていたudevやブートローダーやネットワーク管理等をsysmtedが扱いだしたということらしい。

改めてdpkg -L systemd | grep bin/を実行してみたが、たしかにたくさんのパッケージがあった。
まあ各パッケージが何をしているのかは名前から推測することしかできないが。

systemdはunitという単位でリソースを管理する

unitというのはsystemdを使っていればなんとなく目にすることもあるだろう。
systemdが管理対象をunitとして定義していて、unit単位で操作したり、依存関係を定義したりする。
unitにもいろんな種類があるみたい。

systemdのunitの種類

unitには以下の種類が定義されている

  • service
  • device
  • mount
  • automount
  • swap
  • path
  • socket
  • timer
  • scope
  • slice
  • target
    筆者はserviceとtargetしかほぼ意識したことがなかった。
    targetもなんとなくそんなのがあるらしい程度の理解だが。

何のunitがあるのかチェック

筆者はKali Linuxで実行しており、あまり出力結果は参考にならないと思われるので出力は載せてない。
まずはunitの一覧を出力する

systemctl list-unit-files

458個も出力された。多すぎてよくわからんので条件を絞ってみる。
typeでservcieを指定して、自動起動が設定されているenabledだけを指定

systemctl list-unit-files --type=service --state=enabled

18個まで減った。パッと見では何のサービスかわからないものも動いている。
後で最低限、自動起動しているサービスぐらいは何者なのか調べておこう。。

次に実際に起動しているサービスタイプのunitをチェック。

さっきのコマンドsystemctl list-unit-filesは設定ファイル(unit file)上で定義されている結果の出力。つまり見ている箇所はunit file。
今回のコマンドsystemctl list-unitsは、実際にunitが起動しているかどうかの結果の出力。つまり見ている箇所はunit。
という違いがあることに注意。

systemctl list-units --type=service

50個もあった。自動起動のunitと数が一致するわけではないみたい。
なんで差分が出るんだろう。

次にunitの状態を確認。

systemctl show ssh.service

値が大量に出力されるも、多すぎてすべてを理解するのは骨が折れそうなので断念。
ほぼすべての情報がここで見れそうな気がするし、とりあえず見方はわかったのでOK。

unit fileを見てみる

unit fileはいくつかのディレクトリに散らばっていることもあるらしい。
まず特定のunitのunit file状態がどうなっているかを確認するコマンドはこれ。
直接unit fileを見に行くとドロップインやオーバーライドを見逃す可能性が高いから、systemctl catコマンドで見ることが推奨とのこと。

# systemctl cat chronyd.service
No files found for chronyd.service.

あれ、出力されない。
どうやらKali Linuxではデフォルトではsystemd-timesyncd.serviceがNTPサービスとして使われているらしい。
気を取り直してsshで実行。

# systemctl cat ssh.service
# /usr/lib/systemd/system/ssh.service
[Unit]
...以下略

sshだとうまくいった。
今日はここまで。続きはまた次回。

Discussion