Red Hat Training
A Red Hat training course is available for Red Hat Enterprise Linux
10.6.4. 既存のユニットファイルの変更
システムにインストールされるサービスは、/usr/lib/systemd/system/
ディレクトリーに保存されるデフォルトのユニットファイルと共に提供されます。システム管理者はこのファイルを直接変更できないため、カスタマイズは /etc/systemd/system/
ディレクトリーの設定ファイルに制限される必要があります。必要とされる変更の程度に応じて、以下の方法のいずれかを実施してください。
-
補助設定ファイルのディレクトリーを
/etc/systemd/system/unit.d/
に作成します。この方法は、ほとんどのユースケースで推奨されます。これにより、元のユニットファイルを参照しつつも、デフォルト設定を追加の機能で拡張できます。この場合、パッケージのアップグレードで導入されるデフォルトユニットへの変更は自動的に適用されます。詳細は、「デフォルトのユニット設定の拡張」 を参照してください。 -
元のユニットファイル
/usr/lib/systemd/system/
のコピーを/etc/systemd/system/
に作成し、そこで変更を行います。コピーは元のファイルを上書きするため、パッケージの更新で導入される変更は適用されません。この方法は、パッケージの更新とは無関係に永続する重要なユニット変更を行う際に役に立ちます。詳しくは 「デフォルトのユニット設定の上書き」 を参照してください。
ユニットのデフォルト設定に戻るには、/etc/systemd/system/
でカスタム作成した設定ファイルを削除します。システムを再起動せずにユニットファイルへの変更を適用するには、以下を実行します。
systemctl daemon-reload
daemon-reload
オプションは、すべてのユニットファイルを再読み込みし、ユニットファイルへの変更をすぐに適用するのに必要な依存関係ツリー全体を再作成します。別の方法として、次のコマンドで同じ結果を得ることができます。
init q
変更したユニットファイルが実行中のサービスに属する場合は、このサービスを再起動して新たな設定を反映させる必要があります。
systemctl restart name.service
SysV init スクリプトが処理しているサービスのプロパティー (依存関係やタイムアウトなど) を変更するときは、init スクリプト自体は変更しないでください。代わりに、「デフォルトのユニット設定の拡張」 と 「デフォルトのユニット設定の上書き」 にあるように、サービスの systemd
ドロップイン設定ファイルを作成します。その後、通常の systemd
サービスと同じ方法でサービスを管理します。
たとえば、network
サービスの設定を拡張するときは、init スクリプトファイル /etc/rc.d/init.d/network
を変更しないでください。代わりに、新しいディレクトリー /etc/systemd/system/network.service.d/
と、systemd
ドロップインファイル /etc/systemd/system/network.service.d/my_config.conf
を作成します。そして、ドロップインファイルの値を変更します。systemd
は、network
サービスを network.service
として認識することに注意してください。作成したディレクトリーが network.service.d
と命名されるのはそのためです。
デフォルトのユニット設定の拡張
追加の設定オプションでデフォルトのユニットファイルを拡張するには、最初に /etc/systemd/system/
に設定ディレクトリーを作成します。サービスユニットを拡張する場合は、root
で以下のコマンドを実行します。
mkdir /etc/systemd/system/name.service.d/
name を、拡張する必要のあるサービスの名前に置き換えます。上記の構文はすべてのユニットタイプに適用されます。
作成したディレクトリーに設定ファイルを作成します。ファイル名の接尾辞は .conf にする必要があることに注意してください。以下のコマンドを実行します。
touch /etc/systemd/system/name.service.d/config_name.conf
config_name を、設定ファイルの名前に置き換えます。このファイルは、通常のユニットファイル構造に基づくため、すべてのディレクティブは該当するセクションで指定する必要があります。「ユニットファイル構造の概要」 を参照してください。
たとえば、カスタムの依存性を追加するには、以下の内容で設定ファイルを作成します。
[Unit] Requires=new_dependency After=new_dependency
new_dependency は、依存性としてマークが付けられるユニットを表します。次の例は、30 秒の遅延後のメインプロセス終了後にサービスを再起動する設定ファイルです。
[Service] Restart=always RestartSec=30
1 つのタスクだけを扱う簡単な設定ファイルを作成することが推奨されます。これにより、他のサービスの設定ディレクトリーに簡単に移動したり、リンクできます。
そのユニットに行った変更を適用するには、root
で以下のコマンドを実行します。
systemctl daemon-reload
systemctl restart name.service
例10.20 httpd.service 設定の拡張
Apache サービスの起動時にカスタムシェルスクリプトが自動的に実行されるように httpd.service ユニットを変更するには、以下の手順で行います。まず、ディレクトリーおよびカスタム設定ファイルを作成します。
~]# mkdir /etc/systemd/system/httpd.service.d/ ~]# touch /etc/systemd/system/httpd.service.d/custom_script.conf
Apache で自動的に起動するスクリプトが /usr/local/bin/custom.sh
にある場合は、以下のテキストを custom_script.conf
ファイルに追加します。
[Service] ExecStartPost=/usr/local/bin/custom.sh
ユニットの変更を適用するには、以下を実行します。
~]# systemctl daemon-reload ~]# systemctl restart httpd.service
/etc/systemd/system/
の設定ディレクトリーの設定ファイルは、/usr/lib/systemd/system/
のユニットファイルに優先します。そのため、設定ファイルに、一度だけ指定できるオプション (Description
、ExecStart
など) が含まれる場合は、このオプションのデフォルト値が上書きされます。「上書きされたユニットの監視」 で説明されているように、systemd-delta
コマンドの出力では、一部のオプションは実際に上書きされますが、該当のユニットは常に [EXTENDED] とマークされます。
デフォルトのユニット設定の上書き
ユニットファイルを提供するパッケージの更新後も変更を持続させるには、最初にファイルを /etc/systemd/system/
ディレクトリーにファイルをコピーします。それを行うには、root
で以下のコマンドを実行します。
cp /usr/lib/systemd/system/name.service /etc/systemd/system/name.service
name は、変更するサービスユニットの名前を表します。上記の構文はすべてのユニットタイプに適用されます。
コピーされたファイルをテキストエディターで開き、必要な変更を行います。ユニットの変更を適用するには、root
で以下のコマンドを実行します。
systemctl daemon-reload
systemctl restart name.service
例10.21 タイムアウト制限の変更
サービスごとにタイムアウト値を指定すると、正常に動作していないサービスによってシステムがフリーズすることを防ぐことができます。タイムアウト値を指定しないサービスには、通常のサービスの場合は 90 秒、そして SysV と互換性のあるサービスの場合は 300 秒と、それぞれデフォルトのタイムアウトが設定されています。
たとえば、httpd
サービスのタイムアウト制限を延長するときは、以下を行います。
httpd
ユニットファイルを、/etc/systemd/system/
ディレクトリーにコピーします。cp /usr/lib/systemd/system/httpd.service /etc/systemd/system/httpd.service
/etc/systemd/system/httpd.service
ファイルを開き、[Service]
セクションにTimeoutStartSec
値を指定します。... [Service] ... PrivateTmp=true TimeoutStartSec=10 [Install] WantedBy=multi-user.target ...
systemd
デーモンを再ロードします。systemctl daemon-reload
任意です。新しいタイムアウト値を確認します。
systemctl show httpd -p TimeoutStartUSec
グローバルでタイムアウト制限を変更するには、/etc/systemd/system.conf
ファイルの DefaultTimeoutStartSec
を変更します。「systemd の概要」を参照してください。
上書きされたユニットの監視
上書きされたユニット、または変更したユニットファイルの概要を表示するには、以下のコマンドを実行します。
systemd-delta
上記のコマンドを実行すると、以下のような出力になります。
[EQUIVALENT] /etc/systemd/system/default.target → /usr/lib/systemd/system/default.target [OVERRIDDEN] /etc/systemd/system/autofs.service → /usr/lib/systemd/system/autofs.service --- /usr/lib/systemd/system/autofs.service 2014-10-16 21:30:39.000000000 -0400 +++ /etc/systemd/system/autofs.service 2014-11-21 10:00:58.513568275 -0500 @@ -8,7 +8,8 @@ EnvironmentFile=-/etc/sysconfig/autofs ExecStart=/usr/sbin/automount $OPTIONS --pid-file /run/autofs.pid ExecReload=/usr/bin/kill -HUP $MAINPID -TimeoutSec=180 +TimeoutSec=240 +Restart=Always [Install] WantedBy=multi-user.target [MASKED] /etc/systemd/system/cups.service → /usr/lib/systemd/system/cups.service [EXTENDED] /usr/lib/systemd/system/sssd.service → /etc/systemd/system/sssd.service.d/journal.conf 4 overridden configuration files found.
表10.13「systemd-delta の相違タイプ」 は、systemd-delta
の出力で表示される上書きタイプを一覧表示します。ファイルが上書きされると、systemd-delta
が、diff
コマンドの出力に似た変更の要約をデフォルトで表示します。
表10.13 systemd-delta の相違タイプ
Type | 詳細 |
---|---|
[MASKED] | マスクされたユニットファイルです。ユニットマスクの説明は、「サービスの無効化」 を参照してください。 |
[EQUIVALENT] | このコピーは、元のファイルを上書きしますが、コンテンツは変更されません。通常はシンボリックリンクです。 |
[REDIRECTED] | 別のファイルにリダイレクトするファイルです。 |
[OVERRIDEN] | 上書きされ、変更されたファイルです。 |
[EXTENDED] |
|
[UNCHANGED] |
|
システムの更新後に、systemd-delta
を実行して、デフォルトユニットに対してカスタム設定で上書きした更新があるかどうかを確認できます。さらに、出力する更新を、特定のタイプに制限することもできます。たとえば、上書きされたユニットのみを表示するには、以下のコマンドを実行します。
systemd-delta --type=overridden