RHEL 7 における systemd の概要

RHEL 7 における systemd の概要

Systemd は、Linux オペレーティングシステム用のシステムおよびサービスマネージャーです。SysV init スクリプトと後方互換するように設計されており、起動時のシステムサービスの並行スタートアップやデーモンのオンデマンドのアクティベーション、システム状態のスナップショットのサポート、依存ベースのサービス管理論理などの多くの機能を提供します。Red Hat Enterprise Linux 7 では、systemd は Upstart に代わるデフォルトの init システムです。

Systemd では、systemd units という概念が導入されています。これらの unit は 表「Systemd Unit の場所」 にあるディレクトリーの 1 つに置かれる unit 設定ファイルで表示され、システムサービスやリスニングソケット、保存されたシステム状態のスナップショットについての情報や init システムに関連するその他のオブジェクトについての情報を要約します。利用可能な systemd unit タイプの完全な一覧については、表「利用可能な systemd Unit タイプ」 を参照してください。

表 Systemd Unit の場所

フォルダー 詳細
/usr/lib/systemd/system/ インストール済みの RPM パッケージで配布された systemd unit
/run/systemd/system/ ランタイム時に作成された systemd unit。このディレクトリーは、インストール済みのサービス unit のディレクトリーに優先します。
/etc/systemd/system/ システム管理者が作成、管理する systemd unit。このディレクトリーは、ランタイム unit のディレクトリーに優先します。

表 利用可能な systemd Unit タイプ

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

互換性の変更点

systemd システムおよびサービスマネージャーは、SysV init および Upstart とほぼ互換するように設計されています。以下では、Red Hat Enterprise Linux システムの以前のメジャーリリースとの比較で最も顕著な互換性の変更点を挙げています。

  • Systemd のランレベルのサポートは限定的なものです。ランレベルに直接マッピング可能なターゲットユニットを数多く提供し、互換性のために以前の runlevel コマンドで配布されます。ただし、systemd ターゲットのすべてがランレベルに直接マッピング可能なわけではないため、その結果、このコマンドが不明なランレベルを示す N を返す場合もあります。可能な場合は、runlevel コマンドの使用を避けることが推奨されます。
  • systemctl ユーティリティーは、カスタマイズされたコマンドをサポートしません。start、stop、および status といった標準のコマンドに加えて、SysV init スクリプトのオーサーは、任意の多数のコマンドに対するサポートを実装して追加機能を提供することができます。たとえば、Red Hat Enterprise Linux 6 の iptables の init スクリプトは、panic コマンドとの実行が可能です。こうすると、パニックモードが即座に有効になり、システムを再設定してすべての受信および送信パケットの切断が開始されます。これは systemd ではサポートされておらず、systemctl は文書化されたコマンドのみを受け付けます。
  • systemctl ユーティリティーは、systemd が開始していないサービスとは通信しません。systemd がシステムサービスを開始すると、メインプロセスの ID を保存してそれを追跡します。すると systemctl ユーティリティーはこの PID を使ってクエリを行い、サービスを管理します。このため、ユーザーがコマンドラインで特定のデーモンを直接開始すると、systemctl は最新の状態を判断したり、これを停止したりすることができません。
  • Systemd が停止するのは、実行中のサービスのみです。以前は、シャットダウンシーケンスが開始されると、Red Hat Enterprise Linux 6 およびそれ以前のシステムのリリースは、/etc/rc0.d/ ディレクトリーにあるシンボリックリンクを使ってシステムサービスのステータスに関係なく、利用可能なシステムサービスすべてを停止していました。systemd では、シャットダウン時に、実行中のサービスのみが停止されます。
  • システムサービスは標準の入力ストリームからは読み込みができません。systemd がサービスを開始すると、標準入力を /dev/null に接続し、ユーザーとのインタラクションを防ぎます。
  • システムサービスは、(HOME および PATH 環境変数といった) コンテキストを開始したユーザーやそのセッションからコンテキストを継承しません。各サービスは、クリーンな実行コンテキストで実行されます。
  • Systemd は、Linux Standard Base (LSB) ヘッダーにコード化されている依存関係情報を読み込み、ランタイム時に解釈します。
  • サービスユニット上のすべての操作は 5 分間でタイムアウトするようになっており、サービスの故障でシステムがフリーズすることを防ぎます。

SYSTEMD ターゲットでの作業

以前のバージョンの Red Hat Enterprise Linux は SysV init もしくは Upstart と配布されており、特定モードのオペレーションを表す事前定義の ランレベル を実装していました。これらのランレベルは 0 から 6 までの数字で表示され、システム管理者が特定のランレベルを有効にすると実行されるシステムサービスの選択によって定義されていました。Red Hat Enterprise Linux 7 では、ランレベルの概念は systemd targets に代わっています。

Systemd targets は target units で表されます。Target units は .target ファイル拡張子で終わり、その唯一の目的は依存関係の連鎖で他の systemd units をグループ化することです。たとえば、グラフィカルセッションの開始に使用される graphical.target ユニットは、GNOME Display Manager (gdm.service) や Accounts Service (accounts-daemon.service) といったシステムサービスを開始するとともに、multi-user.target ユニットもアクティブ化します。同様に multi-user.target ユニットは、NetworkManager (NetworkManager.service) や D-Bus (dbus.service) といった他の必須のシステムサービスを開始して、かつ basic.target という別の target unit をアクティブ化します。

Red Hat Enterprise Linux 7 では、以前のシステムのリリースにおける標準ランレベルとほぼ似通った多くの定義済みターゲットが同梱されています。互換性目的で、これらのターゲットを SysV ランレベルに直接マッピングするエイリアスも提供されています。表「SysV ランレベルと systemd ターゲットの比較」 では、SysV ランレベルの完全なリストと対応する systemd ターゲットが表示されています。

表 SysV ランレベルと systemd ターゲットの比較

ランレベル ターゲットユニット 詳細
runlevel0.target
poweroff.target
システムをシャットダウンし、電源を切ります。
runlevel1.target
rescue.target
レスキューシェルを設定します。
runlevel2.target
multi-user.target
非グラフィカルな複数ユーザーシステムを設定します。
runlevel3.target
multi-user.target
非グラフィカルな複数ユーザーシステムを設定します。
runlevel4.target
multi-user.target
非グラフィカルな複数ユーザーシステムを設定します。
runlevel5.target
graphical.target
グラフィカルな複数ユーザーシステムを設定します。
runlevel6.target
reboot.target
システムをシャットダウンして再起動します。

systemd ターゲットを表示、変更、もしくは設定するには、表「SysV init コマンドと systemctl の比較」 および以下のセクションで説明するように systemctl ユーティリティーを使用します。runlevel および telinit の各コマンドはシステムで利用可能なままで、期待通りに機能しますが、これらが含まれているのは互換性が目的であり、使用は避けてください。

表 SysV init コマンドと systemctl の比較

古いコマンド 新しい コマンド 詳細
runlevel systemctl list-units –type target 現在読み込まれているターゲットユニットを表示します。
telinit runlevel systemctl isolate name.target 現在のターゲットを変更します。

デフォルトターゲットの表示

デフォルトでどのターゲットユニットが使用されるかを決定するには、以下のコマンドを実行します。

このコマンドは /etc/systemd/system/default.target にあるシンボリックリンクを解決し、その結果を表示します。

デフォルトのターゲットユニットを表示するには、以下を入力します。

現在のターゲットの表示

読み込み済みの現在のターゲットユニットをすべて一覧表示するには、シェルプロンプトで以下のコマンドを入力します。

このコマンドは、各ターゲットユニットの完全な名前 (UNIT) を表示し、その後にユニットが読み込み済みかどうか (LOAD)、高レベル (ACTIVE) および低レベル (SUB) のユニットのアクティベーション状態、および簡単な説明 (DESCRIPTION) が続きます。

デフォルトでは、systemctl list-units コマンドはアクティブなユニットのみを表示します。状態に関係なくすべての読み込み済みユニットを表示したい場合は、–all または -a のコマンドラインオプションを付けてコマンドを実行します。

現在読み込み済みの全ターゲットユニットを一覧表示するには、以下のコマンドを実行します。

デフォルトターゲットの変更

システムがデフォルトで異なるターゲットユニットを使用するよう設定するには、root でシェルプロンプトに以下を入力します。

name をデフォルトで使用したいターゲットユニット名で (たとえば、multi-user) 置き換えます。このコマンドは、/etc/systemd/system/default.target ファイルを /usr/lib/systemd/system/name.target へのシンボリックリンクで置き換えます。ここでの name は、使用するターゲットユニット名になります。

システムがデフォルトで multi-user.target ユニットを使用するよう設定するには、root で以下のコマンドを使用します。

現在のターゲットの変更

現行のセッションで異なるターゲットユニットに変更するには、シェルプロンプトで root として以下を入力します。

name を使用したいターゲットユニット名で (たとえば、multi-user) 置き換えます。このコマンドは、name という名前の付いたターゲットユニットとすべての依存ユニットを開始し、即座にその他すべてを停止します。デフォルトのターゲットの変更方法については、「デフォルトターゲットの変更」 を参照してください。現在、読み込み済みのターゲットユニットすべてを一覧表示する方法については、「現在のターゲットの変更」 を参照してください。

グラフィカルユーザーインターフェイスをオフにして、現行セッションで multi-user.target ユニットに変更するには、root で以下のコマンドを使用します。

レスキューモードへの変更

レスキューモード は、便利なシングルユーザーモードを提供し、通常の起動プロセスを完了できない状況におけるシステムの修復を可能にします。レスキューモードでは、システムはすべてのローカルファイルシステムのマウントといくつかの重要なシステムサービスの開始を試みますが、ネットワークインターフェイスのアクティブ化や、システムに同時に他のユーザーによるログインを許可したりすることはしません。Red Hat Enterprise Linux 7 では、レスキューモードは シングルユーザーモード と同等であり、root パスワードを必要とします。
現在のターゲットを変更し、現行セッションでレスキューモードに入るには、root でシェルプロンプトに以下を入力します。

このコマンドは systemctl isolate rescue.target と似ていますが、現在システムにログインしているすべてのユーザーに通知メッセージも送信します。systemd がこのメッセージを送信しないようにするには、このコマンドに –no-wall オプションを付けて実行します。

現行セッションでレスキューモードに入るには、root で以下のコマンドを実行します。

シェアする

  • このエントリーをはてなブックマークに追加

フォローする