Ubuntu Weekly Recipe

第598回 systemdユニットの設定を変える

この記事を読むのに必要な時間:およそ 5 分

drop-inファイルで一部を書き換える

続いて,drop-inファイルを使ってユニット設定の一部を変更する方法を紹介します。

drop-inファイルを使う方法では,ユニット設定全体ではなく,変更したい設定箇所だけを上書きできます。 drop-inファイルは/etc/systemd/system/ユニット名.d/内に作成された.confという拡張子を持つファイルです。このdrop-inファイルではユニット設定ファイルの記述と同じ階層構造・形式[]でセクションを区切る,ディレクティブ=値で記載する)で設定変更箇所を記入します。

まずは,先ほど作業した/etc/systemd/system/apache2.serviceは掃除して,設定を読み込み直しておきます。

$ sudo rm /etc/systemd/system/apache2.service
$ sudo systemctl daemon-reload

それでは実際にdrop-inファイルを作ってみます。

$ sudo mkdir /etc/systemd/system/apache2.service.d # drop-inファイルを配置するディレクトリを作成する
$ sudo vi /etc/systemd/system/apache2.service.d/description.conf # drop-inファイルを作成する
$ cat /etc/systemd/system/apache2.service.d/description.conf
[Unit]
Description=The Apache HTTP Server(Overridden by drop-in file)
$ sudo systemctl daeamon-reload

状況を確認します。 読み込まれている設定ファイルを確認します。

$ systemctl cat apache2.service
# /lib/systemd/system/apache2.service
[Unit]
Description=The Apache HTTP Server
(略)

# /etc/systemd/system/apache2.service.d/description.conf
[Unit]
Description=The Apache HTTP Server(Overridden by drop-in file)

このように/lib/systemd/system/apache2.service/etc/systemd/system/apache2.service.d/description.confの両方が読み込まれていることを確認できます。

では実際にどちらのDescription=が有効になっているかを確認します。 再びsystemctl statusを使っても良いのですが,今回はsystemdが認識しているユニット情報を表示するsystemctl showコマンドで確認してみます※4⁠。

※4
今回はあまり関係ありませんが,ユニットの種類ごとに決められた暗黙的な依存関係(implicit dependencies)など「設定ファイルには書かれてないけど適用されている設定」もあるため,systemdがユニットをどう認識しているかを確認するには,詳細を表示できるsystemctl showコマンドを使うとより正確です(逆に言うと情報量がかなり多いですが⁠⁠。
$ systemctl show apache2.****service --property Description
Description=The Apache HTTP Server(Overridden by drop-in file)

この結果からわかるとおり,Description=はdrop-inファイルの設定で書き換えられています。

確認の結果をまとめると,以下のとおりです。

  • systemdはapache2.serviceの設定ファイルとして/lib/systemd/system/apache2.serviceとdrop-inファイル/etc/systemd/system/apache2.service.d/description.confの両方を読み込んでいる。
  • Description=/etc/systemd/system/apache2.service.d/description.confの内容が優先され,Description=The Apache HTTP Server(Overridden by drop-in file)となっている。
drop-inファイルに関するTips

ユニット設定のうち,複数回繰り返すことでリストにできる設定は,同じようにdrop-inすると変更ではなく追加されます。 ゼロから設定し直したい場合は,一度設定を空にしてから,再設定する必要があります。

リストにできる設定の有名な例がExecStart=※5で,具体的には以下のように設定を一度クリアすることで,ゼロから設定できます。

※5
とはいえ,複数回ExecStart=を指定できるのはType=oneshotのもののみです。また,ExecStart=を書き換えるくらいなら,ダミーの.serviceユニットを作るのが良いとは思われます。
[Service]
ExecStart=
ExecStart=/bin/echo 'Hello world from drop-in!'

なお,依存関係やアクティベート順序もリストにできる設定ですが,これらは空の値を許容しません。そのため上記の手法のように,drop-inでいったん消してゼロから再設定することはできませんので,まるごと上書きする方法を使ってください※6⁠。

※6
依存関係やアクティベート順序もdrop-inで追加することは可能です。

また,必要とされる場面は多くないと考えられるものの,/etc/systemd/systemのユニット設定ファイルとdrop-inファイルは併用できます。 今回の記事の手順でいえば,/etc/systemd/system/apache2.serviceの掃除せずにdrop-inファイルで書き換える作業を始めてしまった人は,以下のようにdrop-inのほうが優先されていることがわかります。

$ systemctl cat apache2.service
# /etc/systemd/system/apache2.service
[Unit]
Description=The Apache HTTP Server(This unit file is in /etc/systemd/system)
(略)
# /etc/systemd/system/apache2.service.d/description.conf
[Unit]
Description=The Apache HTTP Server(Overridden by drop-in file)
$ systemctl status apache2
● apache2.service - The Apache HTTP Server(Overridden by drop-in file)
(略)

なお,drop-inファイルは複数配置することが可能です。しかし,パスではなくファイル名の辞書順で読み込まれます※7⁠。

※7
パスではなく,ファイル名と説明しているのは例えば,/lib/systemd/system配下にもdrop-inを配置することが可能なためです。Ubuntuのインストール時のデフォルトでも/lib/systemd/system配下にいくつかのdrop-inファイルが存在するため,気になる方は実際に確認してみてください。

まるごと上書きとdrop-inの比較

最後に,ユニット設定ファイルをまるごと置き換えるユニット設定の上書きと変更したい箇所だけをdrop-inファイルで変更する方法を,おさらいも兼ねて比較します。

/etc/systemd/systemに同名のユニット設定ファイルを置いてまるごと上書きする方法は,パッケージで提供されるユニット設定ファイルの影響をまったく受けないという点が特徴です。 また,前述のとおり,依存関係やアクティベート順序をゼロから設定しなおしたい場合は,こちらの方法を使うしかありません。 裏を返せばパッケージで提供されるユニット設定ファイルで仮に「より良い設定※8⁠」が施された場合などに恩恵を受けられないというデメリットがあります。

※8
例えばプログラムの改善により,⁠以前はAを推奨していたが今後Bが推奨される」といった状況などが考えられます。

drop-inファイルを使う方法の特徴は,まるごと上書きする方法をひっくり返したものとなります。 つまり,drop-inファイルを使う方法では(多くの場合)パッケージ由来のユニット設定ファイルのうち,指定した箇所のみを変更します。そのため,その他の設定はパッケージ由来のユニット設定ファイルのまま使うことができます。 こちらも裏を返せばパッケージ由来のユニット設定ファイルの影響を受けるため,パッケージの更新に伴いユニット設定ファイルが変更された場合,drop-inファイルで変更した内容と矛盾が生じる可能性があるのはデメリットです。 また,依存関係やアクティベート順序は追加のみが可能でゼロから設定しなおすことはできません。

基本的に,どちらの方法が優れているというわけではなく,どちらがより都合が良いかという観点で考えて,使い分けるのがいいでしょう。

なにはともあれ,⁠パッケージ由来のユニット設定ファイルを直接書き換えてしまい,パッケージの更新でせっかくのカスタマイズが飛んでしまう」という例がすこしでもなくなれば,筆者としては幸いです。

著者プロフィール

たなかあきら

Ubuntu Japanese Team Member。ちょっとお高い電子辞書を買ったので,楽しく翻訳をしていたところ,気づいたらメンバーになっていました。