きょうのsystemd: 3つのレベルの「オフ」
概要
これは
の翻訳。
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
を元に戻す。
今日はここまで。読んでくれてありがとう!