きょうのsystemd: 3つのレベルの「オフ」

概要

これは

0pointer.de

の翻訳。

3つのレベルの「オフ」

systemdではサービス(ないしは、その他のユニット)を3つのレベルでオフにできる。 これについて見てみよう。

1.サービスを停止することができる。これは単純にサービスのインスタンスを停止させることであり、それ以外はほとんど何もない。 アクティベーションのいくつかの方法(例えば、手動によるアクティベーション、ソケットアクティベーション、バスアクティベーション、システム起動時のアクティベーション、あるいは、ハードウェアの抜き差しによるアクティベーション)によって、停止させた後に、サービスが再び要求されれば、そのサービスは起動する。 サービスを止めるということは非常に単純で、一時的なもので、表層的な操作なのである。 これはNTPサーバーを停止させる方法の例である:

$ systemctl stop ntpd.service

これはざっくり言うと、SysVで動いている多くのシステムで利用可能な、次の伝統的なコマンドと同等だ:

$ service ntpd stop

実際、Fedora15では、後者のコマンドを実行すれば、透過的に前者へと変換されるようになっている。

2.サービスを無効にすることができる。 これはサービスがそのアクティベーションのトリガーによりフックされないようにする。 これは、サービスによっては、起動時にアクティベーションされたり、ソケットやバス、ハードウェアの抜き差し(その他、そのサービスに適用されているトリガー)でサービスがもはやアクティベートされないことを意味する。 しかし、必要であれば、手動で起動させることはまだできる。 もしすでに起動済みのインスタンスがある場合、サービスを無効にしてもそれを止めるような効果はない。 これはサービスを無効にする方法の例である:

$ systemctl disable ntpd.service

伝統的なFedoraのシステムでは、これは、ざっくり言うと次のコマンドに等しい:

$ chkconfig ntpd off

ここでも、Fedora15では後者のコマンドは、必要に応じて、透過的に前者へと変換される。

しばしば、サービスの停止と無効化を一緒におこないたい場合がある。というのも、現在のインスタンスを取り除いて、(手動でトリガーする場合をのぞいて)確実にそれが再び起動しないようにするためである。

$ systemctl disable ntpd.service
$ systemctl stop ntpd.service

これらのコマンドは例えば、Fedora上のsystemdサービスのパッケージを取り除く(訳注: deinstall)ときに使われる。

サービスの無効化は永続的な変更である。 元の状態に戻すまで、再起動を繰り返しても、その状態は保たれる。

3.サービスをマスクすることができる。 これはサービスの無効化と似ているが、極端である。 これは、サービスが自動的にもはや起動しなくなるようにするだけでなく、手動でさえもサービスを起動できなくさせるようにする。 これはsystemdのちょっとした隠し機能である。というのも、一般に使うものでもないし、ユーザーを混乱させてしまうかもしれないためだ。 しかし、やり方はこうだ:

$ ln -s /dev/null /etc/systemd/system/ntpd.service
$ systemctl daemon-reload

サービスファイルを/dev/nullへのシンボリックリンクにすることで、systemdに件のサービスを決して起動させず、完全に実行をブロックするように伝えることができる。 /etc/systemd/systemにあるユニットファイルは/lib/systemd/systemにある同じ名前のファイルを上書きする。 前者のディレクトリは管理者の領域であり、後者はパッケージマネージャーの領域である。 /etc/systemd/system/ntpd.serviceシンボリックリンクを差し込むことで、systemdがアップストリームが同梱しているサービスファイル/lib/systemd/system/ntpd.serviceを決して使わないようにすることになる。

systemdは/dev/nullシンボリックリンクの張られたユニットを認識することができ、これをmaskedと表示する。 手動で(例えばsystemctl start経由で)サービスを起動させようとしても、エラーで失敗するだろう。

SysVのシステムでは(公式には)似たようなトリックは存在しない。 しかし、いくつかの非公式のハックは存在していて、例えば、initスクリプトを修正して、頭の方にexit 0を置いたり、実行ビットを取り除いたりする方法がある。 しかし、これらの解決方法は様々な欠点がある。例えば、これらの方法はパッケージマネージャーからの妨害を受けてしまう。

サービスのマスクは永続的な変化で、サービスの無効化とかなり似ている。

さて、3つのレベルでサービスをオフにする方法を学んだが、ただ1点、問題が残されている。つまり、どうやってオンに戻すのか? まぁ、これはかなり対称的なものだ。 systemctl startを使ってsystemctl stopを元に戻す。 systemctl enableを使って、systemctl disableを元に戻す。 rmを使ってlnを元に戻す。

今日はここまで。読んでくれてありがとう!