10.6. systemd のユニットファイルの作成および変更
ユニットファイルには、ユニットを説明し、その動作を定義する設定ディレクティブが含まれます。複数の systemctl
コマンドがバックグラウンドでユニットファイルと連携します。詳細な調整を行うには、システム管理者がユニットファイルを手動で編集または作成する必要があります。表10.2「systemd のユニットファイルの場所」 には、システムにユニットファイルが保存される 3 つのメインディレクトリーが記載されています。/etc/systemd/system/
ディレクトリーは、システム管理者が作成またはカスタマイズするユニットファイル用に予約されます。
ユニットファイル名は、以下のフォーマットを使用します。
unit_name.type_extension
unit_name はユニットの名前を表し、type_extension はユニットタイプを識別します。ユニットタイプの完全なリストは、表10.1「利用可能な systemd のユニットタイプ」 を参照してください。たとえば、通常は、システムには sshd.service
ユニットおよび sshd.socket
ユニットがあります。
ユニットファイルには、追加の設定ファイルのディレクトリーを追加できます。たとえば、カスタム設定オプションを sshd.service
に追加するには、sshd.service.d/custom.conf
ファイルを作成し、追加のディレクティブを挿入します。設定ディレクティブの詳細情報は、「既存のユニットファイルの変更」 を参照してください。
さらに、sshd.service.wants/
ディレクトリーおよび sshd.service.requires/
ディレクトリーを作成することもできます。このディレクトリーには、sshd
サービスの依存関係であるユニットファイルへのシンボリックリンクが含まれます。シンボリックリンクは、[Install] ユニットファイルオプションに従ってインストール時に自動的に作成されるか (表10.11「[Install] セクションの重要なオプション」 を参照)、または [Unit] オプションに基づいてランタイム時に自動的に作成されます (表10.9「[Unit] セクションの重要なオプション」 を参照)。このディレクトリーとシンボリックリンクを手動で作成することもできます。
多くのユニットファイルオプションは、いわゆる ユニット指定子 を使用して設定できます。これは、ユニットファイルが読み込まれる際にユニットパラメーターに動的に置き換えられるワイルドカード文字列です。これにより、インスタンス化されたユニットを生成するテンプレートとしてのロールを担う汎用ユニットファイルを作成できます。詳しくは 「インスタンス化されたユニットの使用」 を参照してください。
10.6.1. ユニットファイル構造の概要
通常、ユニットファイルは 3 つのセクションで設定されています。
- [Unit]: ユニットのタイプに依存しない汎用的なオプションが含まれます。このセクションに含まれるオプションはユニットを説明し、ユニットの動作を指定し、他のユニットへの依存関係を設定します。最も頻繁に使用される [Unit] オプションのリストは、表10.9「[Unit] セクションの重要なオプション」 を参照してください。
- [unit type]: ユニットにタイプ固有のディレクティブがある場合、それらはユニットタイプに基づいて名前が付けられるセクションにグループ分けされます。たとえば、サービスユニットファイルには [Service] セクションが含まれます。最もよく使われる [Service] オプションは 表10.10「[Service] セクションの重要なオプション」 を参照してください。
-
[Install]:
systemctl enable
コマンドおよびdisable
コマンドで使用されるユニットインストールに関する情報が含まれます。[Install] オプションのリストは、表10.11「[Install] セクションの重要なオプション」 を参照してください。
オプション[a] セクション、systemd.unit(5) man ページ] | 詳細 |
---|---|
|
ユニットの説明です。このテキストは、たとえば |
| ユニットのドキュメントを参照する URI のリストを提供します。 |
|
ユニットが開始する順序を定義します。このユニットは、 |
|
その他のユニットに依存関係を設定します。 |
|
|
|
|
[a]
[Unit] で設定可能なオプションの完全リスト
[b]
ほとんどの場合、ユニットファイルオプションの After および Before で依存関係の並び順を設定するだけで十分です。Wants (推奨) または Requires で要件の依存関係も設定する場合は、依存関係の並び順を指定する必要があります。これは、並び順と要件の依存関係が相互に依存していないためです。
|
オプション[a] セクション、systemd.service(5) の マニュアルページを参照してください。] | 詳細 |
---|---|
|
*
*
*
*
*
* |
|
ユニットの開始時に実行するコマンドまたはスクリプトを指定します。 |
| ユニットの停止時に実行するコマンドまたはスクリプトを指定します。 |
| ユニットの再読み込み時に実行するコマンドまたはスクリプトを指定します。 |
|
このオプションを有効にすると、 |
|
True に設定すると、サービスは、そのプロセスがすべて終了していてもアクティブと見なされます。デフォルトの値は False です。このオプションは、特に |
[a]
[Service] で設定可能なオプションの完全リスト
|
オプション[a] セクション、systemd.unit(5) man ページ] | 詳細 |
---|---|
|
ユニット名の追加リストを、スペース区切りで提供します。 |
|
そのユニットに依存するユニットのリストです。このユニットが有効な場合に、 |
|
このユニットへの依存が弱いユニットのリストです。このユニットが有効になると、 |
| 対応するユニットと共にインストールまたはアンインストールされるユニットのリストを指定します。 |
| インスタンス化されているユニットだけが対象となりますが、このオプションは、ユニットが有効になっているデフォルトのインスタンスを指定します。「インスタンス化されたユニットの使用」 を参照してください。 |
[a]
[Install] で設定可能なオプションの完全リスト
|
ユニット設定の調整に使用できるさまざまなオプションは、例10.17「postfix.service ユニットファイル」 では、システムにインストールされているサービスユニットの例を示しています。さらに、ユニットファイルのオプションは、「インスタンス化されたユニットの使用」 に説明されているようにユニットの動的な作成が可能な方法で定義できます。
例10.17 postfix.service ユニットファイル
次に、postfix パッケージで現在提供されている /usr/lib/systemd/system/postfix.service
ユニットファイルの内容が続きます。
[Unit] Description=Postfix Mail Transport Agent After=syslog.target network.target Conflicts=sendmail.service exim.service [Service] Type=forking PIDFile=/var/spool/postfix/pid/master.pid EnvironmentFile=-/etc/sysconfig/network ExecStartPre=-/usr/libexec/postfix/aliasesdb ExecStartPre=-/usr/libexec/postfix/chroot-update ExecStart=/usr/sbin/postfix start ExecReload=/usr/sbin/postfix reload ExecStop=/usr/sbin/postfix stop [Install] WantedBy=multi-user.target
[Unit] セクションは、サービスについて説明し、競合するユニットおよび並び順依存関係を指定します。[Service] には、ユニットのアクティブ化の実行時、停止時、および再ロード時に、一連のカスタムスクリプトを実行するように指定します。EnvironmentFile
は、サービスの環境変数が定義する場所を指定し、PIDFile
は、サービスのメインプロセスに安定した PID を指定します。最後に、[Install] セクションはサービスに依存するユニットをリスト表示します。
10.6.2. カスタムユニットファイルの作成
ユニットファイルをゼロから作成するための複数のユースケースがあります。カスタムデーモンの実行、一部の既存のサービスのセカンドインスタンスの作成 (例10.19「sshd サービスの 2 つ目のインスタンスの作成」)、または SysV init スクリプト (「SysV Init スクリプトのユニットファイルへの変換」) のインポートを行うことができます。一方、既存のユニットの動作を変更または拡張する場合は、「既存のユニットファイルの変更」 の手順を使用します。以下の手順では、カスタムサービスを作成する一般的なプロセスを説明します。
-
カスタムサービスで実行可能なファイルを用意します。カスタムで作成されたスクリプトや、ソフトウェアプロバイダーが提供する実行ファイルがこれにあたります。必要な場合は、カスタムサービスのメインプロセスの PID を保持するため、PID ファイルを用意します。また、サービスのシェル変数を保存するために環境ファイルを組み込むこともできます。(
chmod a+x
を実行して) ソーススクリプトが実行でき、インタラクティブではないことを確認してください。 /etc/systemd/system/
ディレクトリーにユニットファイルを作成し、ファイルに適切なパーミッションがあることを確認します。root
で以下のコマンドを実行します。touch /etc/systemd/system/name.service
chmod 664 /etc/systemd/system/name.service
name を、作成するサービスの名前に置き換えます。ファイルには実行権限が必要ありません。
上の手順で作成した
name.service
ファイルを開き、サービス設定オプションを追加します。作成するサービスのタイプに応じて、さまざまなオプションを使用できます。「ユニットファイル構造の概要」 を参照してください。以下は、ネットワーク関連サービスのユニットの設定例になります。[Unit] Description=service_description After=network.target [Service] ExecStart=path_to_executable Type=forking PIDFile=path_to_pidfile [Install] WantedBy=default.target
詳細は以下のようになります。
-
service_description は、ジャーナルログファイルおよび
systemctl status
コマンドの出力に表示される役立つ説明です。 -
After
設定により、このサービスは、ネットワークが実行してから起動します。関連するサービスまたはターゲットは、スペースで区切って追加します。 - path_to_executable は、サービス実行ファイルへのパスを表します。
-
Type=forking
は、fork システム呼び出しを行うデーモンに使用します。サービスのメインプロセスは、path_to_pidfile で指定した PID で作成されます。その他の起動タイプは 表10.10「[Service] セクションの重要なオプション」 を参照してください。 -
WantedBy
では、サービスを起動するターゲットを指定します。ターゲットは、従来のランレベル概念の代替と見なすことができます。詳細は 「systemd ターゲットでの作業」 を参照してください。
-
service_description は、ジャーナルログファイルおよび
root
で以下のコマンドを実行すると、新しいname.service
ファイルが存在することが、systemd に通知されます。systemctl daemon-reload
systemctl start name.service
警告新しいユニットファイルを作成したり、既存のユニットファイルを修正したら常に
systemctl daemon-reload
コマンドを実行します。このコマンドを実行しないと、systemd のステータスと、ディスクの実際のサービスユニットファイルが一致しなくなるため、systemctl start
コマンドやsystemctl enable
コマンドが失敗します。name.service ユニットは、「システムサービスの管理」 に説明通りにコマンドでその他のシステムサービスとして管理できます。
例10.18 emacs.service ファイルの作成
Emacs テキストエディターを使用する場合は、ファイルの編集時にプログラムの新規インスタンスを起動するよりも、バックグラウンドで実行する方がスピードが速いため便利です。以下の手順では、Emacs のユニットファイルを作成し、これをサービスのように処理する方法を説明します。
/etc/systemd/system/
ディレクトリーにユニットファイルを作成し、ファイルパーミッションが正しいことを確認してください。root
で以下のコマンドを実行します。~]# touch /etc/systemd/system/emacs.service ~]# chmod 664 /etc/systemd/system/emacs.service
以下の内容をファイルに追加します。
[Unit] Description=Emacs: the extensible, self-documenting text editor [Service] Type=forking ExecStart=/usr/bin/emacs --daemon ExecStop=/usr/bin/emacsclient --eval "(kill-emacs)" Environment=SSH_AUTH_SOCK=%t/keyring/ssh Restart=always [Install] WantedBy=default.target
上記の設定では、サービスの起動時に、
/usr/bin/emacs
実行ファイルがデーモンモードで開始します。SSH_AUTH_SOCK 環境変数は、ランタイムディレクトリーを表す %t ユニット指定子で設定されます。また、emacs プロセスが予期せずに終了した場合は、このサービスによりこれが再開します。以下のコマンドを実行して、設定の再読み込みを行い、カスタムサービスを開始します。
~]# systemctl daemon-reload ~]# systemctl start emacs.service
これでエディターは systemd サービスとして登録されるため、標準的な systemctl
コマンドがすべて使用できます。たとえば、systemctl status emacs
でエディターのステータスを表示したり、systemctl enable emacs
でシステム起動時にエディターを自動的に起動したりできます。
例10.19 sshd サービスの 2 つ目のインスタンスの作成
システム管理者は、サービスのインスタンスを複数設定し、実行しなければならないことが多々あります。これは、サービスの主なインスタンスとの競合を避けるために、元のサービス設定ファイルのコピーを作成し、特定のパラメーターを変更することで実行します。以下の手順は、sshd
サービスの 2 つ目のインスタンスを作成する方法を示しています。
2 つ目のデーモンで使用する、
sshd_config
ファイルのコピーを作成します。~]# cp /etc/ssh/sshd{,-second}_config
作成した
sshd-second_config
ファイルを編集し、2 つ目のデーモンに別のポート番号と PID ファイルを割り当てます。Port 22220 PidFile /var/run/sshd-second.pid
Port
オプションおよびPidFile
オプションの詳細は、man ページのsshd_config
(5) を参照してください。他のサービスで使用されていないポートを選択してください。PID ファイルはサービスの実行時に存在していなければいけないものではありません。存在しない場合は、サービスの起動時に自動的に生成されます。sshd
サービスの systemd ユニットファイルのコピーを作成します。~]# cp /usr/lib/systemd/system/sshd.service /etc/systemd/system/sshd-second.service
作成した
sshd-second.service
を以下のように変更します。Description
オプションを変更します。Description=OpenSSH server second instance daemon
After
オプションを指定するサービスに sshd.service を追加し、最初のインスタンスが起動した場合に限り 2 つ目のインスタンスが起動するようにします。After=syslog.target network.target auditd.service sshd.service
- sshd の最初のインスタンスには鍵の生成が含まれるため、ExecStartPre=/usr/sbin/sshd-keygen 行を削除します。
sshd
コマンドに-f /etc/ssh/sshd-second_config
パラメーターを追加して、代替の設定ファイルが使用されるようにします。ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS
上記のように変更すると、sshd-second.service は以下のようになります。
[Unit] Description=OpenSSH server second instance daemon After=syslog.target network.target auditd.service sshd.service [Service] EnvironmentFile=/etc/sysconfig/sshd ExecStart=/usr/sbin/sshd -D -f /etc/ssh/sshd-second_config $OPTIONS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=42s [Install] WantedBy=multi-user.target
SELinux を使用している場合は、sshd の 2 番目のインスタンスのポートを SSH ポートに追加します。追加しないと、sshd の 2 番目のインスタンスがポートにバインドされません。
~]# semanage port -a -t ssh_port_t -p tcp 22220
システムの起動時にこのサービスが自動的に起動するように、sshd-second.service を有効にします。
~]# systemctl enable sshd-second.service
systemctl status
コマンドを使用して sshd-second.service が実行中かどうかを確認します。さらに、ポートをサービスに接続して、適切に有効になっているかどうかを確認します。~]$
ssh -p 22220 user@server
ファイアウォールを使用している場合は、sshd の 2 番目のインスタンスへの接続を許可するように適切に設定されていることを確認してください。
- カスタムユニットファイルの並び順および依存関係のターゲットを適切に選択する方法は、以下の Red Hat ナレッジベースの記事を参照してください。
ユニットファイルの並び順および依存関係にトリガーされたケースの実例の一部と追加情報は、Is there any useful information about writing unit files? を参照してください。
systemd
が開始するサービスへの制限の設定は、Red Hat ナレッジベースの記事 RHEL 7 および systemd でサービスに制限を設定する を参照してください。この制限は、サービスのユニットファイルで設定する必要があります。systemd
は、/etc/security/limits.conf
設定ファイルおよび /etc/security/limits.d/*.conf
設定ファイルに設定した制限を無視する点に注意してください。このファイルに定義した制限は、ログインセッションの開始時に PAM により設定されますが、systemd
が開始するデーモンは、PAM ログインセッションを使用しません。
10.6.3. SysV Init スクリプトのユニットファイルへの変換
SysV init スクリプトをユニットファイルに変換する前に、すでに別の場所で変換が行われていないことを確認します。Red Hat Enterprise Linux 7 にインストールされるすべてのコアサービスにデフォルトのユニットファイルが同梱されていますが、数多くのサードパーティーソフトウェアパッケージにも同様のことが言えます。
init スクリプトをユニットファイルに変換するには、スクリプトを分析し、そこから必要な情報を抽出することが必要になります。このデータに基づいて、「カスタムユニットファイルの作成」 の説明通りにユニットファイルを作成できます。init スクリプトはサービスのタイプによって大きく異なるため、この章で概略されているよりも多くの設定オプションの変換を使用しなければならない場合もあります。init スクリプトで利用できるカスタマイズの一部のレベルは systemd ユニットでサポートされなくなっていることに注意してください。「互換性の変更点」 を参照してください。
変換に必要とされるほとんどの情報はスクリプトのヘッダーに提供されます。以下の例は、Red Hat Enterprise Linux 6 で postfix
サービスを起動するために使用される init スクリプトの開始セクションになります。
#!/bin/bash # # postfix Postfix Mail Transfer Agent # # chkconfig: 2345 80 30 # description: Postfix is a Mail Transport Agent, which is the program \ # that moves mail from one machine to another. # processname: master # pidfile: /var/spool/postfix/pid/master.pid # config: /etc/postfix/main.cf # config: /etc/postfix/master.cf ### BEGIN INIT INFO # Provides: postfix MTA # Required-Start: $local_fs $network $remote_fs # Required-Stop: $local_fs $network $remote_fs # Default-Start: 2 3 4 5 # Default-Stop: 0 1 6 # Short-Description: start and stop postfix # Description: Postfix is a Mail Transport Agent, which is the program that # moves mail from one machine to another. ### END INIT INFO
上記の例では、# chkconfig および # description で始まる行のみが必須になり、init ファイルによってはその他の記載はない可能性もあります。# BEGIN INIT INFO と # END INIT INFO 行に囲まれたテキストは Linux Standard Base (LSB) ヘッダー と呼ばれています。LSB ヘッダーを指定している場合は、サービスの説明、依存関係、およびデフォルトのランレベルを定義するディレクティブがこれに含まれます。次に、新規のユニットファイルに必要なデータを収集する分析タスクの概要が続きます。postfix init スクリプトはサンプルとして使用されます。作成される postfix ユニットは 例10.17「postfix.service ユニットファイル」 を参照してください。
サービス説明の検索
#description で始まる行で、スクリプトに関する説明情報を確認します。この説明は、サービス名と共に、ユニットファイルの [Unit] セクションの Description
オプションで使用します。LSB ヘッダーの #Short-Description 行および #Description 行に同様のデータが含まれる場合があります。
サービス依存関係の検索
LSB ヘッダーには、サービス間の依存関係を形成する複数のディレクティブが含まれる場合があります。そのほとんどは systemd ユニットオプションに変換できます。表10.12「LSB ヘッダーの依存関係オプション」 を参照してください。
LSB オプション | 説明 | 同等のユニットファイル |
---|---|---|
| サービスの起動ファシリティー名を指定します。この名前は他の init スクリプトで参照できます ( "$" 接頭辞を使用)。ただし、ユニットファイルが他のユニットをファイル名で参照できるようになったため、これは不要になりました。 | – |
|
必要なサービスの起動ファシリティー名が含まれます。これは、並び順の依存関係として変換され、起動ファシリティー名は、対応するサービスまたはそのサービスが属するターゲットに置き換えられます。たとえば、 |
|
| Required-Start よりも弱い依存関係を設定します。Should-Start 依存関係が失敗しても、サービスの起動には影響を及ぼしません。 |
|
| 負の依存関係を設定します。 |
|
サービスのデフォルトターゲットの検索
#chkconfig で始まる行には 3 つの数値があります。最も重要な値は最初の数値で、サービスが起動するデフォルトのランレベルを示しています。これらのランレベルを同等の systemd ターゲットにマップするには、表10.6「SysV ランレベルと systemd ターゲットの比較」 を使用します。次に、そのターゲットを、ユニットファイルの [Install] セクションの WantedBy
オプションに記述します。たとえば、postfix
はこれまではランレベル 2、3、4、および 5 で起動しました。これは、Red Hat Enterprise Linux 7 では multi-user.target と graphical.target に変換されます。ただし、graphical.target は multiuser.target に依存するため、例10.17「postfix.service ユニットファイル」 の説明にあるように、両方を記述する必要はありません。また、LSB ヘッダーの #Default-Start および #Default-Stop 行に、デフォルト、および動作するべきでないランレベルの情報がある場合は、そちらも参照してください。
#chkconfig 行で指定した他の 2 つの値は、init スクリプトの起動およびシャットダウンの優先順位を表します。この値は、init スクリプトが読み込まれる場合は systemd により解釈されますが、同等のユニットファイルはありません。
サービスで使用されるファイルの検索
init スクリプトでは、専用ディレクトリーから関数ライブラリーを読み込み、設定ファイル、環境ファイル、および PID ファイルのインポートを許可します。環境変数は init スクリプトヘッダーの #config で始まる行で指定し、EnvironmentFile
ユニットファイルオプションに変換されます。#pidfile init スクリプト行に指定した PID ファイルは、PIDFile
オプションでユニットファイルにインポートされます。
init スクリプトヘッダーに含まれない主要な情報は、サービス実行ファイルへのパス、またはサービスで必要になる可能性のあるその他のファイルへのパスです。以前のバージョンの Red Hat Enterprise Linux では、init スクリプトは、カスタム定義のアクションと共に 起動、停止、再起動 などのデフォルトアクションのサービスの動作を定義する Bash ケースステートメントを使用しました。postfix
init スクリプトからの以下の抜粋は、サービス起動時に実行するコードのブロックを示しています。
conf_check() { [ -x /usr/sbin/postfix ] || exit 5 [ -d /etc/postfix ] || exit 6 [ -d /var/spool/postfix ] || exit 5 } make_aliasesdb() { if [ "$(/usr/sbin/postconf -h alias_database)" == "hash:/etc/aliases" ] then # /etc/aliases.db might be used by other MTA, make sure nothing # has touched it since our last newaliases call [ /etc/aliases -nt /etc/aliases.db ] || [ "$ALIASESDB_STAMP" -nt /etc/aliases.db ] || [ "$ALIASESDB_STAMP" -ot /etc/aliases.db ] || return /usr/bin/newaliases touch -r /etc/aliases.db "$ALIASESDB_STAMP" else /usr/bin/newaliases fi } start() { [ "$EUID" != "0" ] && exit 4 # Check that networking is up. [ ${NETWORKING} = "no" ] && exit 1 conf_check # Start daemons. echo -n $"Starting postfix: " make_aliasesdb >/dev/null 2>&1 [ -x $CHROOT_UPDATE ] && $CHROOT_UPDATE /usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start" RETVAL=$? [ $RETVAL -eq 0 ] && touch $lockfile echo return $RETVAL }
init スクリプトの拡張性により、start()
関数ブロックから呼び出される conf_check()
および make_aliasesdb()
の 2 つのカスタム関数を指定することができました。さらに詳しくみると、上記コードでは外部のファイルおよびディレクトリーが複数記述されています (主なサービス実行ファイル /usr/sbin/postfix
、設定ディレクトリー /etc/postfix/
、/var/spool/postfix/
、および /usr/sbin/postconf/
ディレクトリー) 。
systemd は、事前に定義されたアクションのみをサポートしますが、オプションの ExecStart
、ExecStartPre
、ExecStartPost
、ExecStop
、ExecReload
でカスタムの実行ファイルを有効にできます。Red Hat Enterprise Linux 7 の postfix
の場合、/usr/sbin/postfix
はサポートスクリプトと共に、サービスの起動時に実行されます。postfix
ユニットファイルの詳細は、例10.17「postfix.service ユニットファイル」 を参照してください。
複雑な init スクリプトを変換する際には、スクリプトのすべてのステートメントの目的を理解している必要があります。一部のステートメントはオペレーティングシステムのバージョンに固有のものであるため、そのステートメントを変換する必要はありません。一方、新規の環境では、サービス実行ファイルおよびサポートファイルやユニットファイルで調整が一部必要となる場合があります。
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
コマンドの出力に似た変更の要約をデフォルトで表示します。
Type | 詳細 |
---|---|
[MASKED] | マスクされたユニットファイルです。ユニットマスクの説明は、「サービスの無効化」 を参照してください。 |
[EQUIVALENT] | このコピーは、元のファイルを上書きしますが、コンテンツは変更されません。通常はシンボリックリンクです。 |
[REDIRECTED] | 別のファイルにリダイレクトするファイルです。 |
[OVERRIDEN] | 上書きされ、変更されたファイルです。 |
[EXTENDED] |
|
[UNCHANGED] |
|
システムの更新後に、systemd-delta
を実行して、デフォルトユニットに対してカスタム設定で上書きした更新があるかどうかを確認できます。さらに、出力する更新を、特定のタイプに制限することもできます。たとえば、上書きされたユニットのみを表示するには、以下のコマンドを実行します。
systemd-delta --type=overridden
10.6.5. インスタンス化されたユニットの使用
ランタイム時に、1 つのテンプレート設定ファイルから複数のユニットをインスタンス化できます。@文字は、テンプレートにマークを付け、ユニットをこれに関連付けるために使用されます。インスタンス化されたユニットは、(Requires
オプションまたは Wants
オプションを使用して) 別のユニットから開始することも、systemctl start
コマンドで開始することもできます。インスタンス化されたサービスユニットの名前は以下のような形式となります。
template_name@instance_name.service
ここで、template_name は、テンプレート設定ファイルの名前になります。instance_name を、ユニットインスタンスの名前に置き換えます。複数のインスタンスが同じテンプレートファイルを参照し、このテンプレートには、ユニットの全インスタンスに共通する設定オプションが含まれます。テンプレートユニットの名前には以下の形式が使用されます。
unit_name@.service
たとえば、ユニットファイルに次の Wants
設定を指定すると、
Wants=getty@ttyA.service,getty@ttyB.service
この設定により、systemd が、最初に指定したサービスユニットを検索します。該当するユニットが見つからないと、@とタイプ接尾辞の間にある部分は無視され、systemd が getty@.service
ファイルを検索し、そこから設定を読み取り、サービスを起動します。
ワイルドカード文字 (ユニット指定子 とも呼ばれる) を、すべてのユニット設定ファイルで使用できます。ユニット指定子は、特定のユニットパラメーターを置き換え、ランタイム時に解釈されます。表10.14「重要なユニット指定子」 は、特にテンプレートユニットで便利なユニット指定子をリスト表示します。
ユニット指定子 | 意味 | 説明 |
---|---|---|
| 完全ユニット名 |
タイプ接尾辞を含む完全ユニット名を表します。 |
| 接頭辞名 | タイプ接尾辞が削除されたユニット名を表します。インスタンス化されたユニットの %p は、ユニット名の@文字の前の部分を表します。 |
| インスタンス名 |
インスタンス化されたユニット名の@文字およびタイプ接尾辞間の部分です。 |
| ホスト名 | ユニット設定を読み込んだ時に稼働しているシステムのホスト名を表します。 |
| ランタイムディレクトリー |
ランタイムディレクトリーを表します。これは、 |
ユニット指定子の詳細なリストは、man ページの systemd.unit(5)
を参照してください。
たとえば、getty@.service
テンプレートには以下のディレクティブが含まれます。
[Unit] Description=Getty on %I ... [Service] ExecStart=-/sbin/agetty --noclear %I $TERM ...
上記のテンプレートから getty@ttyA.service および getty@ttyB.service をインスタンス化する場合、Description
= は Getty on ttyA および Getty on ttyB として解決されます。