Systemdターゲット解説:ブート状態とランレベルの効果的な管理
Linuxシステムのサービス初期化と管理の現代的標準であるSystemdは、従来のinitシステムのランレベルと比較して、システム状態を管理するための、より柔軟で堅牢なメカニズムを導入しました。このメカニズムはSystemdターゲットとして知られています。ターゲットは本質的に、システムが達成できる同期ポイントまたは状態です。それらは、システムがある特定の状態にあるためにアクティブであるべきユニット(サービス、ソケット、マウントポイントなど)のコレクションを定義します。Systemdターゲットを理解することは、Linuxシステムのブートプロセス、サービス依存関係、および全体的な運用状態を効果的に管理するために不可欠です。
この記事では、Systemdターゲットの概念を解き明かし、それらが古いランレベルの概念をどのように置き換えたかを説明し、それらの構造、目的、および一般的なユースケースを深く掘り下げます。システムの状態に対するより細かい制御を可能にするために、ターゲットを表示、変更、さらには独自のカスタムターゲットを作成する方法を探ります。
ランレベルからSystemdターゲットへの進化
歴史的に、Linuxシステムは、ブート時および実行時のシステムの動作状態を定義するためにランレベルと呼ばれる概念を使用していました。ランレベルは、どのサービスが開始または停止されるかを指示する数値識別子(0〜6)でした。たとえば、ランレベル3は通常、マルチユーザーテキストモードを意味し、ランレベル5はグラフィカルなマルチユーザー環境を示していました。このシステムは機能的でしたが、限界がありました。
- 硬直性: ランレベルはしばしば、ある程度固定された方法で定義されており、特定の状態に対してアクティブなサービスの正確なセットをカスタマイズすることが困難でした。
- 暗黙的な依存関係: サービス間の依存関係は、ランレベルの割り当てを通じて間接的に管理されることが多く、潜在的な競合や欠落したサービスにつながりました。
- 粒度の欠如: 数値システムには説明的な明確さが欠けており、システムの意図された状態を理解するのが困難でした。
Systemdターゲットは、より明示的で、依存関係駆動型で、説明的なアプローチを提供することで、これらの限界に対処します。抽象的な数値の代わりに、ターゲットには意味のある名前(例:multi-user.target、graphical.target)があり、システムの意図された状態を明確に示します。依存関係はユニットファイル内で明示的に定義されており、必要なすべてのコンポーネントが正しい順序で開始されることが保証されます。
Systemdターゲットの理解
Systemdターゲット自体は一種のユニットです。ターゲットユニットがアクティブ化されると、Systemdはそのターゲットのユニットファイル内に依存関係としてリストされているすべてのユニットをアクティブ化しようとします。これによりカスケード効果が生まれ、目的のシステム状態に到達するために必要なすべてのサービス、デバイス、およびその他のコンポーネントがオンラインになります。
Systemdターゲットの主な特徴:
- 依存関係管理: ターゲットは、ターゲットが到達したと見なされるために、他のどのユニットがアクティブである必要があるかを定義します。これがその力の核心です。
- 同期ポイント: ブートプロセス中に同期ポイントとして機能します。現在のターゲットが完全に初期化されるまで、システムは次の段階に進みません。
- 説明的な命名: ターゲットには説明的な名前が付けられており、システムの意図された状態を簡単に理解できます(例:
rescue.target、poweroff.target)。
一般的なSystemdターゲット
Systemdには、一般的なシステム状態をカバーするように設計された、事前定義されたターゲットのセットが付属しています。これらを理解することが、システムを管理するための鍵となります。
multi-user.target
これは最も基本的なターゲットの1つです。ネットワークが有効になっている完全に機能するマルチユーザーシステムを表しますが、グラフィカルログインマネージャーやデスクトップ環境は含まれません。これは通常、サーバーのデフォルトターゲットです。
- 目的: サービスを実行し、複数のユーザーがテキストベースのコンソールまたはSSH経由でログインできるように、安定した環境を提供する。
- 依存関係: 通常、ネットワーク、システムサービス、およびコンソールログインプロンプトのユニットが含まれます。
graphical.target
このターゲットは、ユーザー操作の準備ができた、グラフィカルデスクトップ環境を備えた完全に機能するマルチユーザーシステムを表します。通常、multi-user.targetの依存関係であり、グラフィカルセッションに必要なコンポーネントを追加します。
- 目的: グラフィカルディスプレイマネージャー(GDM、LightDM、SDDMなど)および関連するデスクトップ環境を起動する。
- 依存関係:
multi-user.targetからのすべての依存関係を継承し、XサーバーまたはWaylandコンポジター、ディスプレイマネージャー、およびデスクトップセッションのユニットを追加します。
rescue.target
このターゲットは、最小限のシングルユーザー環境を提供します。主にシステムメンテナンスとリカバリに使用されます。基本的なシステムとルートシェルを起動しますが、通常はネットワークまたはマルチユーザーサービスは起動しません。
- 目的: 他のサービスからの干渉なしに、システム管理者がメンテナンスタスクを実行するための安全な環境を提供する。
- 依存関係: 最小限の必須システムコンポーネントとルートシェル。
emergency.target
これはrescue.targetよりもさらに最小限です。システムを単一の読み取り専用ファイルシステムとルートシェルまで起動します。基本的なサービスでさえ問題が発生する可能性のある、深刻な緊急事態を想定しています。
- 目的:
rescue.targetでさえ適切でない可能性のある、クリティカルなシステムリカバリのため。 - 依存関係: 唯一絶対に必要なシステムコンポーネントとルートシェル(多くの場合読み取り専用)。
reboot.target、poweroff.target、halt.target
これらは、システムをシャットダウンまたは再起動するために使用される特別なターゲットです。Systemdがこれらのターゲットのいずれかのアクティブ化すると、実行中のすべてのサービスを停止し、指定されたアクション(再起動、電源オフ、または停止)を実行します。
- 目的: システムを正常にシャットダウンまたは再起動する。
- 依存関係: システムをシャットダウンする前に停止する必要があるサービスに依存しています。
Systemdターゲットの管理
Systemdは、ターゲットと対話するためのいくつかのコマンドラインツールを提供します。主なツールはsystemctlです。
現在およびデフォルトのターゲットの表示
システムが現在実行中のターゲットと、ブート時にデフォルトでどのターゲットになるかを確認するには、以下を使用します。
systemctl status
このコマンドは、アクティブなターゲットを含む豊富な情報を提供します。デフォルトのターゲットを具体的にクエリするには:
systemctl get-default
利用可能なすべてのターゲットを表示するには:
systemctl list-unit-files --type=target
デフォルトターゲットの変更
システムをデフォルトで異なるターゲット(例:グラフィカルからマルチユーザーへ、またはその逆)でブートさせたい場合は、systemctl set-defaultを使用できます。
デフォルトをグラフィカルターゲットに設定するには(デスクトップシステムで一般的):
sudo systemctl set-default graphical.target
デフォルトをマルチユーザーターゲットに設定するには(サーバーで一般的):
sudo systemctl set-default multi-user.target
重要: デフォルトターゲットの変更は、次回の再起動時にのみ有効になります。
ターゲットへの切り替え(再起動なし)
再起動せずに、システムを別のターゲットに即座に切り替えることができます。これはテストや一時的なシステム状態の変更に便利です。systemctl isolateコマンドを使用します。
グラフィカルターゲットに切り替えるには:
sudo systemctl isolate graphical.target
マルチユーザーターゲットに切り替えるには:
sudo systemctl isolate multi-user.target
注意: systemctl isolateは強力なコマンドです。rescue.targetやemergency.targetのようなターゲットに分離すると、ほとんどの実行中のサービスが停止します。使用する前に、その影響を理解していることを確認してください。ネットワーク接続やグラフィカルセッションを失う可能性があります。
ターゲットとユニットファイルの関係
ターゲットはユニットファイルとして実装されており、通常は/usr/lib/systemd/system/または/etc/systemd/system/に配置されます。ターゲットユニットファイル(例:graphical.target)は、他のターゲットやサービスを含む他のユニットへの依存関係を指定します。
典型的なgraphical.targetユニットファイルは、次のようなものになります(簡略化)。
[Unit]
Description=Graphical multi-user system
Documentation=man:systemd.special(7)
# This target is intended to be a prerequisite for the graphical login manager.
# It's the target that the system will boot into if not otherwise specified.
Wants=display-manager.service
Before=shutdown.target
[Install]
Alias=default.target
ここで:
Wants=display-manager.service:display-manager.service(GDMまたはLightDMのような実際のログインマネージャー)が可能であれば開始されるべきであることを示します。これはRequires=よりも弱い依存関係です。Before=shutdown.target: システムがシャットダウンプロセスに入る前にグラフィカル環境が停止されることを保証します。Alias=default.target: これにより、default.targetがそれにリンクされている場合(デスクトップシステムでは通常そうですが)、graphical.targetがデフォルトとして機能します。
カスタムターゲットの作成
日常的な使用ではそれほど一般的ではありませんが、独自のカスタムターゲットを作成して、特定のサービスのセットを持つ特定のシステム状態を定義できます。
カスタムターゲットを作成する手順:
-
.targetユニットファイルを作成する:/etc/systemd/system/に配置します(例:my-custom.target)。
```ini
[Unit]
Description=My Custom Target[Install]
WantedBy=multi-user.target # または他の適切なターゲット
2. **`.service`または他のユニットファイルを作成する:** カスタムターゲットでアクティブになるべきサービスおよびその他のユニットを定義します。 3. **依存関係を追加する:** カスタムターゲットのユニットファイルで、`Requires=`または`Wants=`を使用して、どのユニットを開始する必要があるか、または開始されるべきかを指定します。ini
[Unit]
Description=My Custom Target
Wants=service1.service
Wants=service2.service
After=service1.service service2.service[Install]
WantedBy=multi-user.target
4. **Systemdをリロードする:**bash
sudo systemctl daemon-reload
5. **ターゲットを有効化/開始する:**bash
sudo systemctl start my-custom.targetまたはブート可能にするには
sudo systemctl enable my-custom.target
```
ユースケース: 特定のデータベースおよびアプリケーションサーバーを実行する必要がある開発環境を想像してください。これらのサービスを開始するdev-env.targetを作成できます。
ベストプラクティスとヒント
- デフォルトを理解する: システムのデフォルトターゲット(
graphical.targetまたはmulti-user.target)を知っておくことは、初期ブートエクスペリエンスを決定します。 isolateは注意して使用する:systemctl isolateは、実行中のサービスを中断する可能性があるため、特に本番システムでは注意して使用してください。- 依存関係を確認する: サービスが開始されない場合は、
systemctl list-dependencies <target_name>を使用して、関連付けられているターゲットの依存関係を調べます。 - サーバー対デスクトップ: サーバーでは、セキュリティとリソース効率のために、ほぼ常に
multi-user.targetが好まれます。デスクトップでは、graphical.targetが標準です。 - システムメンテナンス: 最小限の干渉を必要とするタスクには、
rescue.targetが便利です。クリティカルなリカバリには、emergency.targetが利用可能です。
結論
Systemdターゲットは、従来のランレベルに対する大幅な進歩を表しており、システム状態を管理するための、より表現力豊かで、柔軟で、依存関係を意識した方法を提供します。multi-user.targetやgraphical.targetのような一般的なターゲットを理解し、デフォルトターゲットを表示および変更する方法を知ることで、Linuxシステムのブートプロセスと実行時動作に対するより大きな制御を得ることができます。サーバーの構成、デスクトップの管理、またはシステムの問題のトラブルシューティングのいずれを行う場合でも、Systemdターゲットの確かな把握は、あらゆるLinux管理者にとって貴重なスキルです。