第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/
配下にはパッケージ由来のユニット設定ファイルを置くというルールになっており、
ユニット設定の変え方
では、
具体的な方法は、
ユニット設定ファイルをまるごと上書きする
/lib/
のほかにもsystemdがユニット設定ファイルを読み込むパスの1つとして/etc/
があります/lib/
よりも/etc/
を優先して読み込みます。
そのため、/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/
をまるごと上書きしていると言えます。
なお、systemctl unmask
を使います。
drop-inファイルで一部を書き換える
続いて、
drop-inファイルを使う方法では、/etc/
内に作成された.conf
という拡張子を持つファイルです。このdrop-inファイルではユニット設定ファイルの記述と同じ階層構造・[]
でセクションを区切る、ディレクティブ=値
で記載する)
まずは、/etc/
は掃除して、
$ 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/
と/etc/
の両方が読み込まれていることを確認できます。
では実際にどちらのDescription=
が有効になっているかを確認します。 再びsystemctl status
を使っても良いのですが、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/
とdrop-inファイルsystemd/ system/ apache2. service /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
ユニット設定のうち、
リストにできる設定の有名な例がExecStart=
[Service] ExecStart= ExecStart=/bin/echo 'Hello world from drop-in!'
なお、
また、/etc/
のユニット設定ファイルとdrop-inファイルは併用できます。 今回の記事の手順でいえば、/etc/
の掃除せずに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の比較
最後に、
/etc/
に同名のユニット設定ファイルを置いてまるごと上書きする方法は、
drop-inファイルを使う方法の特徴は、
基本的に、
なにはともあれ、