第557回では,
事前準備
systemdユニットの設定変更は最悪の場合,
また,
$ sudo apt -y install apache2
systemdユニットの設定の在り処
さて,apache2
パッケージのインストールが完了したら,
$ systemctl cat apache2.service # /lib/systemd/system/apache2.service [Unit] Description=The Apache HTTP Server (略)
ユニットの設定ファイルのパスとして/lib/
が表示されています。これを変更すれば……と思った方はちょっと待ってください! そもそも,/lib/
はどこから来たものなのでしょうか? 答えは以下のコマンドで確認できます。
$ dpkg -S /lib/systemd/system/apache2.service apache2: /lib/systemd/system/apache2.service
この結果は/lib/
ファイルは先ほどインストールしたapache2
パッケージにより配置されたものであることを示しています。 つまり,apache2
パッケージが更新されるたびにパッケージのデフォルト設定に置き換えられてしまうため,
このようにUbuntuでは/lib/
配下にはパッケージ由来のユニット設定ファイルを置くというルールになっており,
- ※1
- 他のディストリビューションではパッケージ由来のユニット設定ファイルが置かれる場所は違う可能性があります。例えば,
Red Hat Enterprise Linux (RHEL) ではパッケージ由来のユニット設定ファイルは /usr/
に配置されます。lib/ systemd/ system
ユニット設定の変え方
では,
具体的な方法は,
ユニット設定ファイルをまるごと上書きする
/lib/
のほかにもsystemdがユニット設定ファイルを読み込むパスの1つとして/etc/
があります/lib/
よりも/etc/
を優先して読み込みます。
- ※2
- 厳密には他にもたくさんあります。気になる方は
man 5 systemd.
にリストがありますので確認してください。unit
そのため,/lib/
ファイルを/etc/
としてコピーして,
それでは,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/
を追記します。
$ 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/
というパスで/dev/
へのシンボリックリンクが張られました/dev/
へのシンボリックリンクとなっている/etc/
で/lib/
をまるごと上書きしていると言えます。
- ※3
/etc/
としてユーザーが作成した設定ファイルがある場合はマスクできませんので先に削除してください。systemd/ system/ apache2. service
なお,systemctl unmask
を使います。