Ubuntu Weekly Recipe

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

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

第557回では,systemdユニットの依存関係を読む方法を紹介しました。 今回は,systemdユニットの設定を変更する方法を紹介します。

事前準備

systemdユニットの設定変更は最悪の場合,システムが正常に起動しなくなる恐れもあります。したがって手順を実際に試す際には,壊れても大丈夫なように検証用の仮想マシンなどを用意してください

また,本稿では題材としてApacheの設定を変更する手順を解説しますので,以下のようにインストールしておきます。

$ sudo apt -y install apache2

systemdユニットの設定の在り処

さて,apache2パッケージのインストールが完了したら,systemdユニットを見てみましょう。ここは第557回のおさらいです。 インストール直後の状態だと以下のように表示されているはずです。

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

ユニットの設定ファイルのパスとして/lib/systemd/system/apache2.serviceが表示されています。これを変更すれば……と思った方はちょっと待ってください! そもそも,/lib/systemd/system/apache2.serviceはどこから来たものなのでしょうか? 答えは以下のコマンドで確認できます。

$ dpkg -S /lib/systemd/system/apache2.service
apache2: /lib/systemd/system/apache2.service

この結果は/lib/systemd/system/apache2.serviceファイルは先ほどインストールしたapache2パッケージにより配置されたものであることを示しています。 つまり,この設定ファイルをせっかくカスタマイズしても,apache2パッケージが更新されるたびにパッケージのデフォルト設定に置き換えられてしまうため,設定を維持できません

このようにUbuntuでは※1/lib/systemd/system/配下にはパッケージ由来のユニット設定ファイルを置くというルールになっており,これらを直接変更することはしません。

※1
他のディストリビューションではパッケージ由来のユニット設定ファイルが置かれる場所は違う可能性があります。例えば,Red Hat Enterprise Linux(RHEL)ではパッケージ由来のユニット設定ファイルは/usr/lib/systemd/systemに配置されます。

ユニット設定の変え方

では,ユニット設定を変えたい場合,どのような方法があるのでしょうか?

具体的な方法は,ユニット設定ファイルをまるごと上書きする方法と,drop-inファイルで一部を書き換える方法の2つがあります。それぞれ順に説明します。

ユニット設定ファイルをまるごと上書きする

/lib/systemd/system/のほかにもsystemdがユニット設定ファイルを読み込むパスの1つとして/etc/systemd/systemがあります※2⁠。そして,systemdは同名のユニット設定ファイルがある場合/lib/systemd/system/よりも/etc/systemd/systemを優先して読み込みます。

※2
厳密には他にもたくさんあります。気になる方はman 5 systemd.unitにリストがありますので確認してください。

そのため,/lib/systemd/system/apache2.serviceファイルを/etc/systemd/system/apache2.serviceとしてコピーして,後者をお好み通りに書き換えることで,ユニット設定をまるごと上書きする(差し替える)ことができます。

それでは,実際にやってみましょう。 ユニットの説明を記載するDescription=ディレクティブは変更しても無害と考えられますので,今回はこれを変更します。

まずは改めて変更前の状態を確認します。

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

この結果より以下がわかります。

  • systemdはapache2.serviceの設定ファイルとして/lib/systemd/system/apache2.serviceを読み込んでいる。
  • systemctl statusで表示されるユニット情報は/lib/systemd/system/apache2.serviceに記載されているとおりapache2.service - The Apache HTTP Serverとなっている。

それでは,このユニット設定を書き換えます。どこパスのファイルを読み込んでいるかをわかりやすくするため,Description=(This unit file is in /etc/systemd/system)を追記します。

$ sudo cp /lib/systemd/system/apache2.service /etc/systemd/system/apache2.service
$ sudo vi /etc/systemd/system/apache2.service # Desciprion= の内容を書き換える
$ diff /lib/systemd/system/apache2.service /etc/systemd/system/apache2.service # 変更差分を確認する
2c2
< Description=The Apache HTTP Server
---
> Description=The Apache HTTP Server(This unit file is in /etc/systemd/system)
$ sudo systemctl daemon-reload # ユニット設定をリロードする

同じく,上書き後の状態を確認します。

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

この結果から以下のことがわかります。

  • systemdはapache2.serviceの設定ファイルとして/etc/systemd/system/apache2.serviceのみを読み込んでいる。
  • systemctl statusで表示されるユニット情報は/etc/systemd/system/apache2.serviceに記載されている通りapache2.service - The Apache HTTP Server(This unit file is in /etc/systemd/system)となっている。
ユニットのマスク 〜特殊な上書き〜

ユニット設定の書き換えというわけではないですが,ここまでに紹介したまるごと上書きの特殊例として,ユニットのマスクを紹介します。

systemctl disableコマンドを使うことで,ユニットの無効化ができますが,この状態でも例えば手動で起動できます。 このdisableコマンドより強力なものとしてmaskコマンドがあります。これは手動での起動やユニットの有効化も不可にするコマンドです。

実際に試してみましょう。

$ sudo systemctl mask apache2.service
Created symlink /etc/systemd/system/apache2.service → /dev/null.

/etc/systemd/system/apache2.serviceというパスで/dev/nullへのシンボリックリンクが張られました※3⁠。ここまでの解説同様,/dev/nullへのシンボリックリンクとなっている/etc/systemd/system/apache2.service/lib/systemd/system/apache2.serviceをまるごと上書きしていると言えます。

※3
/etc/systemd/system/apache2.serviceとしてユーザーが作成した設定ファイルがある場合はマスクできませんので先に削除してください。

なお,マスクされたユニットは有効化することも手動で起動することもできません。 ユニットのマスクを解除するにはsystemctl unmaskを使います。

著者プロフィール

たなかあきら

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