第10章 systemd によるサービス管理

10.1. systemd の概要

systemd は、Linux オペレーティングシステム用のシステムおよびサービスマネージャーです。SysV init スクリプトと後方互換するように設計されており、起動時のシステムサービスの並行スタートアップや、デーモンのオンデマンドのアクティベーション、または依存ベースのサービス制御論理などの多くの機能を提供します。Red Hat Enterprise Linux 7 では、systemd は Upstart に代わるデフォルトの init システムです。
systemd では、systemd units という概念が導入されています。これらの unit は 表10.2「Systemd Unit ファイルの場所」 にあるディレクトリーの 1 つに置かれる unit 設定ファイルで表示され、システムサービスやリスニングソケット、init システムに関連するその他のオブジェクトに関する情報を要約します。利用可能な systemd unit タイプの完全な一覧は表10.1「利用可能な systemd Unit タイプ」を参照してください。

表10.1 利用可能な systemd Unit タイプ

Unit タイプファイル拡張子詳細
Service unit.serviceシステムサービス
Target unit.targetsystemd unit のグループ
Automount unit.automountファイルシステムの自動マウントポイント
Device unit.deviceカーネルが認識するデバイスファイル
Mount unit.mountファイルシステムのマウントポイント
Path unit.pathファイルシステム内のファイルまたはディレクトリー
Scope unit.scope外部作成のプロセス
Slice unit.sliceシステムプロセスを管理する階層的に組織された unit グループ
Snapshot unit.snapshotsystemd マネージャーの保存状態
Socket unit.socketプロセス間の通信ソケット
Swap unit.swapスワップデバイスまたはスワップファイル
Timer unit.timersystemd タイマー

表10.2 Systemd Unit ファイルの場所

ディレクトリー詳細
/usr/lib/systemd/system/インストール済みの RPM パッケージで配布された systemd unit ファイル
/run/systemd/system/ランタイム時に作成された systemd unit ファイル。このディレクトリーは、インストール済みのサービス unit ファイルのディレクトリーに優先します。
/etc/systemd/system/systemctl enable で作成された systemd unit ファイルおよびサービス拡張向けに追加された unit ファイル。このディレクトリーは、runtime unit ファイルのディレクトリーに優先します。

system.conf を使用したデフォルトの systemd 設定の上書き

systemd のデフォルト設定はコンパイル中に定義され、/etc/systemd/system.conf にある systemd 設定ファイルで確認できます。これらのデフォルトではなく、systemd ユニットへグローバルにデフォルト値を上書きしたいときは、このファイルを使用します。
たとえば、タイムアウト制限のデフォルト値 (90 秒に設定) を上書きする場合は、DefaultTimeoutStartSec パラメータを使用して必要な値を秒単位で入力します。
DefaultTimeoutStartSec=required value
例10.21「タイムアウト制限の変更」 も参照してください。

10.1.1. 主な特長

Red Hat Enterprise Linux 7 では、systemd システムおよびサービスマネージャーは以下の主要な機能を提供します。
  • ソケットベースのアクティベーション: 起動時に systemd は、このタイプのアクティベーションをサポートするすべてのシステムサービス用のリスニングソケットを作成し、サービスが開始するとすぐにこれらのソケットをサービスに渡します。これで systemd がサービスを並行で開始できるだけでなく、サービスが利用可能でない間に送信されたメッセージを失うことなくサービスの再起動が可能になります。これは、対応するソケットがアクセス可能なままで、すべてのメッセージがキューに登録されるためです。
    Systemd はソケットベースのアクティベーションに socket units を使用します。
  • バスベースのアクティベーション: プロセス間の通信に D-Bus を使用するシステムサービスは、クライアントアプリケーションがシステムサービスとの通信を試みる初回にオンデマンドで開始できます。Systemd は、バスベースのアクティベーションに D-Bus サービスファイル を使用します。
  • デバイスベースのアクティベーション: デバイスベースのアクティベーションをサポートするシステムサービスは、特定のタイプのハードウェアがプラグインするか利用可能になった際に、オンデマンドでスタートできます。Systemd は、デバイスベースのアクティベーションに device units を使用します。
  • パスベースのアクティベーション: パスベースのアクティベーションをサポートするシステムサービスは、特定のファイルもしくはディレクトリーの状態が変更される際にオンデマンドでスタートできます。Systemd は、パスベースのアクティベーションに path units を使用します。
  • マウントおよびオートマウントポイントの管理: Systemd は、マウントポイントおよびオートマウントポイントを監視および管理します。Systemd はマウントポイントには mount units を、オートマウントポイントには automount units を使用します。
  • アグレッシブな並列化: ソケットベースのアクティベーションを使用するため、systemd はすべてのリスニングソケットが配置されると同時に並行してシステムサービスを開始できます。オンデマンドのアクティベーションをサポートするシステムサービスと組み合わせることで、並行アクティベーションはシステム起動に必要となる時間を大幅に短縮します。
  • トランザクション unit アクティベーション論理: unit のアクティブ化または非アクティブ化の前に、systemd はその依存関係を計算して一時的なトランザクションを作成し、このトランザクションの一貫性を検証します。トランザクションに一貫性がない場合、systemd は自動的にこれを正そうとし、エラーをレポートする前に必須でないジョブを削除しようと試みます。
  • SysV init との後方互換性: 『Linux Standard Base Core Specification』 にあるように、Systemd は SysV init スクリプトをサポートします。これにより、systemd サービス unit への更新パスが容易になります。

10.1.2. 互換性の変更点

systemd システムおよびサービスマネージャーは、SysV init および Upstart とほぼ互換するように設計されています。以下では、Red Hat Enterprise Linux システムの以前のメジャーリリースとの比較で最も顕著な互換性の変更点を挙げています。
  • Systemd のランレベルのサポートは限定的なものです。ランレベルに直接マッピング可能なターゲットユニットを数多く提供し、互換性のために以前の runlevel コマンドで配布されます。ただし、systemd ターゲットのすべてがランレベルに直接マッピング可能な訳ではないため、このコマンドが不明なランレベルを示す N を返す場合もあります。可能な場合は、runlevel コマンドの使用を避けることが推奨されます。
    systemd ターゲットとそれらのランレベルとの比較に関する詳細は、「systemd ターゲットでの作業」 を参照してください。
  • systemctl ユーティリティーは、カスタマイズされたコマンドをサポートしません。SysV init スクリプでは、startstop、および status といった標準のコマンドに加えて、任意のコマンドサポートを実装して数多くの機能を提供できます。たとえば、Red Hat Enterprise Linux 6 の iptables の init スクリプトは、panic コマンドとの実行が可能です。これにより、パニックモードが即座に有効になり、システムを再設定してすべての受信パケットおよび送信パケットの切断が開始します。これは systemd ではサポートされておらず、systemctl は文書化されたコマンドのみを受け付けます。
    systemctl ユーティリティーの詳細および以前の service ユーティリティーとの比較は、「システムサービスの管理」 を参照してください。
  • systemctl ユーティリティーは、systemd が開始していないサービスとは通信しません。systemd がシステムサービスを開始すると、メインプロセスの ID を保存してそれを追跡します。すると systemctl ユーティリティーはこの PID を使用してクエリーを行い、サービスを管理します。このため、ユーザーがコマンドラインで特定のデーモンを直接開始すると、systemctl が最新の状態を判断したり、これを停止したりできません。
  • Systemd が停止するのは、実行中のサービスのみです。以前は、シャットダウンシーケンスが開始すると、Red Hat Enterprise Linux 6 以前のシステムのリリースは、/etc/rc0.d/ ディレクトリーにあるシンボリックリンクを使用して、利用可能なシステムサービスのステータスに関係なくすべて停止していました。systemd では、シャットダウン時に、実行中のサービスのみが停止します。
  • システムサービスは標準の入力ストリームからは読み取りできません。systemd がサービスを開始すると、標準入力を /dev/null に接続し、ユーザーとのインタラクションを防ぎます。
  • システムサービスは、開始したユーザーやそのセッションから、(環境変数 HOMEPATH などの) コンテキストを継承しません。各サービスは、クリーンな実行コンテキストで実行します。
  • SysV init スクリプトを読み込む際に、Systemd は、Linux Standard Base (LSB) ヘッダーにコード化されている依存関係情報を読み取り、ランタイム時に解釈します。
  • サービスユニット上のすべての操作は 5 分間でタイムアウトするようにデフォルト設定になっており、サービスの故障でシステムがフリーズすることを防ぎます。この値は initscript から生成されるサービス用にハードコーディングされ、変更することができません。ただし、個別の設定ファイルを使用してサービス別に長いタイムアウト値を指定できます。例10.21「タイムアウト制限の変更」 を参照してください。
systemd で導入された互換性の変更点に関する詳細なリストは、Red Hat Enterprise Linux 7 の移行計画ガイドを参照してください。