Systemdターゲット解説:ブート状態とランレベルの効果的な管理

systemdターゲット、ランレベル相当、デフォルトブート状態、分離、レスキュー、グラフィカルモードを理解する。

Systemdターゲット解説:ブート状態とランレベルの効果的な管理

Systemdターゲットは、名前付きのシステム状態です。ターゲットは、通常のサーバーブート、グラフィカルデスクトップ、レスキューシェル、シャットダウン、または一緒に起動したいカスタムサービスのグループを表すことができます。古いLinuxシステムから移行してきた場合、ターゲットは、人々が実際に使用していたランレベルの部分を置き換えるsystemdの機能ですが、数字だけでなく依存関係から構築されているため、より柔軟です。

通常、サーバーが間違ったモードで起動したとき、デスクトップのディスプレイマネージャーが起動しないとき、またはリカバリガイドで rescue.target に入るように指示されたときに、ターゲットに出会います。いくつかのコマンドを知っていれば、そのような状況ははるかに謎めかなくなります。

ランレベルからSystemdターゲットへの進化

歴史的に、Linuxシステムはランレベルと呼ばれる概念を使用して、ブート時および実行時のシステムの動作状態を定義していました。ランレベルは、どのサービスを開始または停止するかを決定する数値識別子(0-6)でした。たとえば、ランレベル3は通常マルチユーザーテキストモードを意味し、ランレベル5はグラフィカルなマルチユーザー環境を示していました。このシステムは機能的でしたが、制限がありました:

  • 硬直性: ランレベルは、固定された、またはディストリビューション固有の方法で定義されることが多く、特定の状態でアクティブなサービスの正確なセットをカスタマイズするのが厄介でした。
  • 暗黙的な依存関係: サービス間の依存関係は、ランレベルの割り当てを通じて間接的に管理されることが多く、潜在的な競合やサービスの欠落につながりました。
  • 粒度の欠如: 数値システムは説明的な明確さに欠けており、システムの意図された状態を理解するのが難しくなりました。

Systemdターゲットは、より明示的で依存関係駆動型の説明的なアプローチを提供することで、これらの制限に対処します。抽象的な数字の代わりに、ターゲットには意味のある名前(例:multi-user.targetgraphical.target)があり、意図されたシステム状態を明確に示します。依存関係はユニットファイル内で明示的に定義され、すべての必要なコンポーネントが正しい順序で開始されるようにします。

多くのsystemdシステムでの大まかなマッピングは次のようになります:

従来のランレベル 一般的なsystemd相当 意味
0 poweroff.target シャットダウンして電源を切る
1 rescue.target シングルユーザーレスキューモード
3 multi-user.target マルチユーザーテキスト/サーバーモード
5 graphical.target マルチユーザーモードとグラフィカルログイン
6 reboot.target 再起動

これを翻訳の補助として扱い、絶対的なルールとして扱わないでください。ランレベルの動作はディストリビューションによって異なり、systemdターゲットは古いランレベルでは表現できなかった関係を表現できます。

Systemdターゲットを理解する

systemdターゲットは、それ自体がユニットの一種です。ターゲットユニットがアクティブ化されると、systemdはそのターゲットのユニットファイル内で依存関係としてリストされているすべてのユニットをアクティブ化しようとします。これによりカスケード効果が生じ、目的のシステム状態に到達するために必要なすべてのサービス、デバイス、その他のコンポーネントがオンラインになることが保証されます。

Systemdターゲットの主な特徴:

  • 依存関係管理: ターゲットは、ターゲットが到達したと見なされるためにアクティブである必要がある他のユニットを定義します。これがその力の中核です。
  • 同期ポイント: ブートプロセス中の同期ポイントとして機能します。現在のターゲットが完全に初期化されるまで、システムは次の段階に進みません。
  • 説明的な命名: ターゲットは説明的に名前が付けられているため、システムの意図された状態を簡単に理解できます(例:rescue.targetpoweroff.target)。

ターゲットは通常、それ自体で長時間実行されるコードを実行しません。他のユニットをグループ化します。次のコマンドでそのグループ化を検査できます:

systemctl list-dependencies multi-user.target
systemctl list-dependencies graphical.target

これは、「なぜこのサービスは起動時に開始されるのか?」という質問に答える良い方法です。ユニットがデフォルトターゲットの依存関係ツリーに表示される場合、それはどこかで引き込まれています。

一般的なSystemdターゲット

Systemdには、一般的なシステム状態をカバーするように設計された事前定義されたターゲットのセットが付属しています。これらを理解することは、システムを管理するための鍵です。

multi-user.target

これは最も基本的なターゲットの1つです。ネットワークが有効で、グラフィカルログインマネージャーやデスクトップ環境がない、完全に機能するマルチユーザーシステムを表します。これは通常、サーバーのデフォルトターゲットです。

  • 目的: サービスを実行し、テキストベースのコンソールまたはSSHを介して複数のユーザーがログインできるようにするための安定した環境を提供すること。
  • 依存関係: 通常、ネットワーキング、システムサービス、コンソールログインプロンプトのユニットが含まれます。

ヘッドレスサーバーの場合、multi-user.target が通常適切なデフォルトです。ディスプレイマネージャーにリソースを費やすことなく、SSHと通常のサービスを提供します。

graphical.target

このターゲットは、ユーザーとの対話の準備ができたグラフィカルデスクトップ環境を備えた、完全に機能するマルチユーザーシステムを表します。これは通常、multi-user.target の依存関係であり、グラフィカルセッションに必要なコンポーネントを追加します。

  • 目的: グラフィカルディスプレイマネージャー(GDM、LightDM、SDDMなど)と関連するデスクトップ環境を起動すること。
  • 依存関係: 一般的に multi-user.target の動作を引き込み、ディスプレイマネージャーとグラフィカルセッションコンポーネントのユニットを追加します。

ワークステーションが黒い画面で起動するがSSHはまだ機能する場合は、これらを比較します:

systemctl get-default
systemctl status display-manager.service
journalctl -u display-manager.service -b

デフォルトターゲットは、システムが到達しようとしたものを示します。ディスプレイマネージャーのログは、グラフィカルレイヤーが起動したかどうかの理由を示します。

rescue.target

このターゲットは、最小限のシングルユーザー環境を提供します。主にシステムのメンテナンスとリカバリに使用されます。基本的なシステムとルートシェルを起動しますが、通常はネットワーキングやマルチユーザーサービスを開始しません。

  • 目的: システム管理者が他のサービスからの干渉を受けずにメンテナンスタスクを実行するための安全な環境を提供すること。
  • 依存関係: 最小限の必須システムコンポーネントとルートシェル。手動で起動しない限り、ネットワーキングは利用できないことがよくあります。

emergency.target

これは rescue.target よりもさらに最小限です。システムを単一の読み取り専用ファイルシステムとルートシェルにします。基本的なサービスでさえ問題になる可能性がある深刻な緊急事態を対象としています。

  • 目的: rescue.target でさえ適切でない可能性がある重要なシステムリカバリのため。
  • 依存関係: 最も必須のシステムコンポーネントとルートシェルのみ。障害とディストリビューションによっては、ルートファイルシステムが読み取り専用でマウントされる場合があります。

reboot.targetpoweroff.targethalt.target

これらは、システムをシャットダウンまたは再起動するために使用される特別なターゲットです。systemdがこれらのターゲットの1つをアクティブ化すると、実行中のすべてのサービスを停止し、指定されたアクション(再起動、電源オフ、または停止)を実行します。

  • 目的: システムを正常にシャットダウンまたは再起動すること。
  • 依存関係: 通常、システムをシャットダウンする前に停止する必要があるサービスに依存します。

Systemdターゲットの管理

Systemdは、ターゲットと対話するためのいくつかのコマンドラインツールを提供します。主要なツールは systemctl です。

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

システムが現在実行しているターゲットと、起動時にデフォルトで使用するターゲットを確認するには、次を使用します:

systemctl status

このコマンドは、アクティブなターゲットを含む豊富な情報を提供します。デフォルトターゲットを具体的に照会するには:

systemctl get-default

利用可能なすべてのターゲットを表示するには:

systemctl list-unit-files --type=target

アクティブなターゲットユニットを表示するには、次を使用します:

systemctl list-units --type=target

違いはサービスの場合と同じです:list-unit-files はsystemdが認識しているターゲットファイルを表示し、list-units は実行中のシステムで現在ロードまたはアクティブなターゲットを表示します。

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

システムをデフォルトで別のターゲットで起動させたい場合(例:グラフィカルからマルチユーザーへ、またはその逆)、systemctl set-default を使用できます:

デフォルトをグラフィカルターゲットに設定する(デスクトップシステムで一般的):

sudo systemctl set-default graphical.target

デフォルトをマルチユーザーターゲットに設定する(サーバーで一般的):

sudo systemctl set-default multi-user.target

重要: デフォルトターゲットの変更は、次回の再起動時にのみ有効になります。

内部的には、これにより default.target シンボリックリンクが変更されます。壊れたブートイメージをデバッグしている場合は、直接検査できます:

systemctl get-default
ls -l /etc/systemd/system/default.target

ターゲットへの切り替え(再起動なし)

再起動せずに、システムを別のターゲットに即座に切り替えることができます。これは、テストやシステムの状態を一時的に変更するのに便利です。systemctl isolate コマンドを使用します:

グラフィカルターゲットに切り替える:

sudo systemctl isolate graphical.target

マルチユーザーターゲットに切り替える:

sudo systemctl isolate multi-user.target

注意: systemctl isolate は強力なコマンドです。rescue.targetemergency.target などのターゲットに分離すると、実行中のほとんどのサービスが停止します。使用する前に影響を理解してください。ネットワーク接続やグラフィカルセッションが失われる可能性があります。

リモートサーバーでは、isolate rescue.target または isolate emergency.target に特に注意してください。SSHが失われ、クラウドプロバイダー、ハイパーバイザー、または物理マシンを介したコンソールアクセスが必要になる場合があります。ワークステーションでグラフィカルデスクトップを停止するだけでよい場合、multi-user.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.servicedisplay-manager.service(GDMやLightDMなどの実際のログインマネージャー)を可能であれば開始する必要があることを示します。これは Requires= よりも弱い依存関係です。
  • Before=shutdown.target:システムがシャットダウンプロセスに入る前に、グラフィカル環境が停止されることを保証します。
  • Alias=default.target:これにより、default.target がリンクされている場合(デスクトップシステムでは通常そうである)、graphical.target がデフォルトとして機能します。

カスタムターゲットの作成

日常的な使用ではあまり一般的ではありませんが、独自のカスタムターゲットを作成して、独自のサービスのセットを持つ特定のシステム状態を定義できます。

カスタムターゲットを作成する手順:

  1. .target ユニットファイルを作成します: /etc/systemd/system/ に配置します(例:my-custom.target)。
    [Unit]
    Description=My Custom Target
    
    [Install]
    WantedBy=multi-user.target # Or another appropriate target
    
  2. .service または他のユニットファイルを作成します: カスタムターゲットに対してアクティブにするサービスと他のユニットを定義します。
  3. 依存関係を追加します: カスタムターゲットのユニットファイルで、Requires= または Wants= を使用して、開始する必要がある、または開始する必要があるユニットを指定します。
    [Unit]
    Description=My Custom Target
    Wants=service1.service
    Wants=service2.service
    After=service1.service service2.service
    
    [Install]
    WantedBy=multi-user.target
    
  4. systemdをリロードします:
    
    

sudo systemctl daemon-reload 5. **ターゲットを有効化/開始します:** bash sudo systemctl start my-custom.target # Or to make it bootable sudo systemctl enable my-custom.target ```

ユースケース: 特定のデータベースとアプリケーションサーバーを実行する必要がある開発環境を想像してください。これらのサービスを開始する dev-env.target を作成できます。

カスタムターゲットは、アプライアンスのようなシステムにも役立ちます。たとえば、キオスクマシンには、ネットワーキング、ブラウザ、ローカルウォッチドッグ、ロギングエージェントを開始するが、通常のデスクトップセッションの残りは開始しないターゲットがある場合があります。ラボサーバーには、テストスタックとデモスタック用の個別のターゲットがあるため、オペレーターは既知のサービスのグループを一緒に開始できます。

ベストプラクティスとヒント

  • デフォルトを理解する: システムのデフォルトターゲット(graphical.target または multi-user.target)を把握しておくと、初期のブート体験が決まります。
  • isolate は注意して使用する: 特に本番システムでは、systemctl isolate を使用する際は注意してください。実行中のサービスを中断する可能性があります。
  • 依存関係を確認する: サービスが開始しない場合は、systemctl list-dependencies <target_name> を使用して、関連付けられているターゲットの依存関係を調べます。
  • サーバー vs. デスクトップ: サーバーでは、セキュリティとリソース効率のために multi-user.target がほぼ常に推奨されます。デスクトップでは、graphical.target が標準です。
  • システムメンテナンス: 最小限の干渉が必要なタスクには、rescue.target が便利です。重要なリカバリには、emergency.target が利用可能です。

ターゲットについての実用的な考え方

ほとんどの管理作業では、短いメンタルモデルだけが必要です:

systemctl get-default
systemctl set-default multi-user.target
systemctl isolate graphical.target
systemctl list-dependencies graphical.target

get-default は、マシンがどこで起動するはずかを示します。set-default は次のブートを変更します。isolate は現在の状態を変更し、その状態外のサービスを停止する場合があります。list-dependencies は、ターゲットが何を引き込むかを説明します。

ターゲットは、名前が変更されたランレベルではありません。それらは依存関係グループです。それらをそのように扱うと、ブートの問題は推論しやすくなります:システムが到達しようとしたターゲットを見つけ、それが望んでいたサービスを検査し、失敗したユニットまたは依存関係を修正します。