systemdとは何をしているものなのか

Posted on Mar 28, 2022

概要

Linuxを触った方なら一度は「systemd」という名前を聞いたことがあるかもしれません。今日はこいつが何者なのかを紹介しようと思います。
systemdは一言で言えば複雑なシステム(巨大な航空機)を操縦するパイロットのようなものです。

簡単な歴史

現在のほとんどのディストリビューションは、アンチsystemdを掲げるなどの思想が強いディストリビューションでない限りsystemdが標準です。
systemdはRedHatのエンジニアによって開発されました。PluseAudioと同じ開発者であり、この方は後にFlatpakの基礎となる考えを考案した人でもあります。

実際にどう動くのか

systemdはカーネルが起動してからシステムを利用可能な状態にするのが主な役割です。ブートローダーがカーネルを読み込み、カーネルの起動が完了するとカーネルは/sbin/initをPID1として実行します。systemdを使用する環境だとこれはsystemdの実行ファイルへのシンボリックリンクとなっているので、systemdがPID1として起動します。


さてここからがsystemdの出番です。カーネルのみが起動している状態ではグラフィカルシェルはもちろん、CLIですら使用できず最低限の機能しか起動していない状態です。
ここでsystemdは必要なサービスやプロセスを次々と起動させシステムを利用可能な状態にします。航空機で例えるのであれば離陸し水平に飛行できるようになるまでの段階です。

ここからがやや複雑な部分です。systemdはユニットと呼ばれる設定ファイルを元にシステムを構成し起動させます。
ユニットには、サービスの起動に関する設定やパーティションのマウントに関する設定などの複数の種類があります。
ここで実際にどんなユニットがあるのかお手元の環境で見てみましょう。
systemctl list-unit-files を適当な環境で実行してみてください。

ユニットの種類

完全なリストはここから見れます。

.mount

パーティションのマウントに関する設定。一部は/etc/fstabを元に自動生成される。

.path

パスの変更を監視する設定。パスのディレクトリやファイルの内容が変わったら実行するコマンドを定義する。

.service

プロセス(デーモン)の起動に関する設定

  • そのサービスが何か別のサービスに依存しているのか、どのサービスが起動した段階でそのプロセスを起動させるべきなのか
  • そのプロセスを起動させる際に実行するコマンド
  • プロセスが異常終了した際にどうするか

などが記述されています。

.target

ユニットの集まり。複数のユニットをグループ分けにする。詳細は後述

ターゲットとは何か

例えばLiunxディストリビューションを起動させるといっても最終的にグラフィカルシェルを起動させるのか、あるいはコマンドラインモードで起動させサーバーとして使うのかなど様々です。
この際に役立つのが.targetユニットです。どのモードで起動させるかを設定するのに.targetは使われます。

systemdは /etc/systemd/system/default.target の内容が最終的に起動することを目標にユニットの設定を解析し起動順序を設定し、それに沿って各サービスを起動させたりファイルシステムをマウントしたりします。
このdefault.targetはデスクトップ環境ではgraphical.targetへのシンボリックリンクになっています。

そしてサーバーなどの環境ではmulti-user.targetへのシンボリックリンクとなっています

他にもpoweroff.target(電源オフ)やrescue.target(レスキューモード)、reboot.target(再起動)など様々なターゲットがあります。
勘が良い方なら気づくかもしれませんがpoweroff.targetはシャットダウン時に、reboot.targetは再起動時に利用されます。忘れられがちですが、システムをシャットダウンするときにもsystemdは仕事をします。サービスやプロセスを順次安全に終了させるのが役割です。航空機で言えば着陸です。

いざ起動やシャットダウンをしたからといって安心できるわけではありません。何らかのプロセスが異常終了し、システムの一部の機能が利用できなくなることがあります。このような際にsystemdは停止したデーモンを再起動しシステムの修復を試みます。(ただしサービスの設定ファイルに異常終了時再起動するという設定がない場合は何もしませんが、重要なサービスの設定ファイルに大体再起動するよう書かれています)
大抵の場合、これで自体は収束します。航空機の例えで言うのであれば飛行中に何らかのアクシデントが発生し、それにパイロット(ここではsystemd)が対応するようなものです。

まとめ

ここまで見てきたとおり、systemdはLinuxシステムにおいて極めて重要なプログラムであると言えます。それと同時に複雑なシステムの全体像を設定しやすくしてくれています。

systemdが最初から全ての人に歓迎されていたわけではありません。UNIX哲学に反しているなどでGnome3論争と合わさり一時期コミュニティが大荒れ状態になったこともあるそうです。ですがsystemdが現在標準であり、Linuxディストリビューションをより扱いやすいものにしてくれたという事実は変わりません。
普段何気なく使っているディストリビューションでも、こうして掘り下げてみると面白い発見がありました。systemdは現在も進化を続けており、今度時間があったらsystemd-bootやsystemd-homedも試してみたいなと個人的には考えています。
最後まで読んでいただきありがとうございました。