ノート:

Oracle Linuxでsystemdを使用

イントロダクション

このチュートリアルでは、systemctlコマンド行ユーティリティーを使用して、systemdによって制御されるsystemdユニットを管理および表示する方法を学習します。このチュートリアルは、Oracle Linux 8以降のユーザーを対象としています。

systemdは、ブート時に開始される最初のプロセスで、システムのシャットダウン時に終了する最後のプロセスです。systemdは、主に、ブート時にシステム・サービスまたはプロセスおよびシステム初期化を管理するために使用されます。ただし、systemdは、イベント・ロギング、デバイス管理、ユーザー・ログイン、タスク・スケジューリング、時間同期およびシステム・ブートなど、他の多くのタスクや機能を処理することもできます。systemdの多くの機能は完全には使用されていません。ユーザーは、これらの目的で代替ソフトウェアを使用すると快適に、または異なるLinuxディストリビューションではシステム構成への推奨アプローチが使用される可能性があります。

systemd内の様々なタイプの動作または関数は、systemd単位で処理されます。たとえば、デーモン・プロセスやシステム・サービスはサービス・ユニットとして実行され、システムの状態は通常、ターゲット・ユニットとして定義されます。タイマー・ユニットは、システムのcronサービスの使用方法と同様にタスクをスケジュールするように定義でき、マウント・ユニットを使用して、システムfstabでマウント・ポイントを構成する方法と同様に、マウント・ポイントを構成できます。

systemdは、システム・レベルのプロセスと機能の管理に使用されますが、ユーザー領域で実行されるプロセスを管理することもできます。システム上のユーザーは独自のサービスを構成および管理でき、systemdは、ユーザーがセッションを終了した後もこれらのサービスの実行を継続できるように構成できます。

目的

必要事項

ノート:無料の演習環境を使用する場合は、接続やその他の使用方法の手順について、Oracle Linuxの演習の基本を参照してください。

systemdユニット・ファイルの確認

Oracle Linux 8インスタンスに接続したら、systemctlコマンドを使用した実験を開始して、使用可能な様々なユニットについて学習できます。

  1. systemctlコマンドを実行して、systemdによって現在ロードされているすべてのsystemdユニットを一覧表示します。

    systemctl
    

    キーボードの[Space]キーまたは[PgDn]キーを使用して出力のページを表示します。

    このコマンドは、次を実行するのと同じです。

    systemctl list-units
    

    出力には、systemdが管理しているすべての現在アクティブな構成ユニットが表示されます。出力では、「.device」、「.mount」、「.service」、「.target」、および「.timer」という接尾辞が付けられたユニットを含む、異なる接尾辞が付けられた単位があります。

    ユニットは、目的に応じて起動、実行、マウントまたは接続されているという意味でアクティブになります。ユニットは、停止、アンマウントまたは切断されているという意味で非アクティブにできます。アクティブかどうかに関係なく、すべてのユニットを表示する場合は、次を実行できます。

    systemctl list-units --all
    

    これらのコマンドの出力には、様々なタイプのsystemdユニットの選択が表示されます。

    • automount:ファイル・システムのオンデマンド・マウントおよびパラレル化ブートのための自動マウント機能を提供します。
    • mount:ファイル・システムの現在日時に表示されるマウント・ポイントを制御します。
    • path:ファイル・システム・パス情報が変更されたときにサービスをアクティブ化できます。
    • scope:サービス・ユニットに似ていますが、外部プロセスを起動するかわりに管理します。
    • service:デーモンとデーモンを構成するプロセスを起動および制御します。
    • slice:システム・プロセス(サービス・ユニットやスコープ・ユニットなど)を管理するユニットを、リソース管理目的で階層cgroupツリーにグループ化するために使用されます。
    • socket:システム内のローカル・プロセス間通信(IPC)またはネットワーク・ソケットをカプセル化します。これは、ソケットベースのアクティブ化に役立ちます。
    • target:起動時にユニットをグループ化したり、既知の同期ポイントを提供するために使用されます。
    • timer:タイマーを使用して他のユニットのアクティブ化をトリガーするために使用します。これらは、以前にcronサービスを使用して管理されたタスクの代替手段となります。
    • device: systemdにカーネル・デバイスを公開し、デバイスベースのアクティブ化を実装するためにも使用できます。
    • swap:メモリー・スワップ・パーティションまたはスワップ・ファイルをカプセル化します。
  2. --typeオプションを使用して、ユニットリストを特定のユニットタイプに制限します。

    • systemctl list-units --type servicesコマンドを使用して、システムで現在アクティブなサービス・ユニットをリストします。

      systemctl list-units --type service
      
    • 同じコマンドを再度実行しますが、--allオプションを含めて、非アクティブなユニットも含め、すべてのロード済みユニットを表示します(ある場合)。

      systemctl list-units --type service --all
      

使用可能なサービス・タイプごとにこれらのコマンドを繰り返して、情報を作業対象のタイプのみに制限できます。

systemdターゲット・ユニットの処理

ターゲット ユニットは、異なるユニットをグループ化して特定の状態にすることで、特定の目的のために機能できるようにするために使用されます。

  1. 使用可能なtargetユニットをリストします。

    systemctl list-units --type target
    

    ユニットは、他のユニットのロードを必要としたり、特定のユニットと競合するように構成できます。たとえば、multi-user.targetではbasic.targetが機能する必要があり、rescue.serviceおよびrescue.targetユニットとも競合します。ユニットは、機能できるようにロードする他の単位も指定します。

    このように、ターゲットは連鎖して特定の状態を設定できますが、代替状態をトリガーするために再利用できる十分なモジュールもあります。

  2. デフォルトのターゲット・ユニットを表示します。

    デフォルトのターゲットユニットは、ブート後のデフォルトのシステム状態を定義します。

    • systemctl get-defaultコマンドを使用して、デフォルトで使用されるターゲット・ユニットを表示します。デフォルトのターゲット・ユニットは、/etc/systemd/system/default.targetファイルで表されます。

      systemctl get-default
      
    • ls -lコマンドを使用して、/etc/systemd/system/default.targetファイルに関する情報をリストします。

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

      ノート: default.targetファイルは、現在のデフォルトのターゲット・ユニット・ファイルへのシンボリック・リンクです。

  3. デフォルトのターゲット・ユニットを変更します。

    • systemctl set-defaultコマンドを使用して、デフォルトのターゲット・ユニットをgraphical.targetユニットに変更します。

      systemctl set-default graphical.target
      
    • ls –lコマンドを使用して、default.targetファイルがgraphical.targetファイルへのシンボリック・リンクになったことを確認します。

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

      ノート:デフォルト・ターゲット・ユニットを変更すると、既存のdefault.targetシンボリック・リンクが削除され、新しいデフォルト・ターゲット・ユニットを指すシンボリック・リンクが再作成されます。

  4. 詳細はターゲットを確認します。

    • systemctl showコマンドを使用して、特定のターゲットの詳細を取得します。

      systemctl show multi-user.target
      

      出力には、指定したターゲットのすべてのパラメータが表示されます。ターゲットが必要とするユニット、希望および競合するユニット、およびこのターゲットを実行する必要があるユニットを確認できることに注意してください。

    • systemctl list-dependenciesコマンドを使用して、特定のターゲットがその状態に達するために必要な依存関係または必要な依存関係のツリーを表示します。

      systemctl list-dependencies default.target
      

      このコマンドは、デフォルトのターゲットを起動したときに開始されるすべての単位を表示します。ユニット・チェーンはツリーに再帰的に表示され、ターゲットが起動したときに達成する対象を完全に評価できます。graphical.targetをデフォルト・ターゲットとして設定した場合は、display-manager.serviceを実行してグラフィカル表示をロードすることがわかりますが、グラフィカル表示を実行する前に必要なすべての操作を行うためにmulti-user.targetを実行することもできます。

systemctlを使用したユニットの有効化、無効化およびマスク

ユニットは無効化または有効化でき、また、どのような状況でも実行されないようにマスクすることもできます。一部のユニットは、常に使用できるという点で静的です。通常は、他のユニットが作業するための依存関係であるためです。systemctl list-unitsコマンドは、システムでアクティブまたは非アクティブになっているユニットの表示にのみ使用できます。

  1. システムで使用可能なすべてのユニットとその状態をリストします。

    systemctl list-unit-files
    

    使用可能なユニットの多くは静的です。有効化されたユニットは起動時に開始されます。無効になっているユニットは、システムで使用可能なユニットですが、ブート時に開始するように構成されていません。マスクされた単位はシステムで使用可能ですが、アクティブに開始できない状態に設定されています。

  2. systemctl statusコマンドを使用して、nfs-server.serviceユニットに関する詳細情報を表示します。

    systemctl status nfs-server.service
    

    systemctlコマンドを使用すると、サービス・ユニットを参照するときに.service拡張子を削除できます。

    statusコマンドは、単位が有効か、アクティブか、非アクティブか、無効か、マスクされているかを示します。

    スクリプト・ソリューションの場合、systemctlは、ステータスを1行で出力するための短いコマンドを提供します。

    • systemctl is-activeコマンドを使用して、nfs-serverサービスが実行中(アクティブ)または実行中でない(非アクティブ)かどうかを確認します。

      systemctl is-active nfs-server
      
    • systemctl is-enabledコマンドを使用して、nfs-serverサービスが有効または無効かどうかを確認します。サービスを有効にすると、システムのリブート時にサービスが開始されます。

      systemctl is-enabled nfs-server
      
  3. ブート時にサービスが開始できるようにします。

    systemctl enableコマンドを使用して、nfs-serverサービスを有効にします。

    sudo systemctl enable --now nfs-server
    

    コマンドがシステムの状態または構成を変更した場合は、管理者権限でsystemctlコマンドを実行する必要があります。--nowオプションを使用すると、有効にしたサービスを同時に起動することもできます。

    ノート:このコマンドは、サービスを開始する最低レベルのシステム状態ターゲットへのシンボリック・リンクを作成することによって、サービスを有効にします。出力で、コマンドはmulti-userターゲットのシンボリック・リンクnfs-server.serviceを作成しました。

    systemctl status commandを使用して、nfs-serverサービスが有効化され、実行中であることを確認します。

    systemctl status nfs-server
    
  4. サービスを無効化および停止します。

    systemctl disableコマンドを使用して、nfs-serverサービスを無効にします。また、systemctl disableコマンドは、サービスのsystemctlリンクを削除します。

    sudo systemctl disable nfs-server
    

    systemctl stopコマンドを使用して、nfs-serverサービスを停止します。

    sudo systemctl stop nfs-server
    

    これらのステップは、サービスを無効にするときに--nowオプションを使用して組み合せることができます。

  5. ユニットをマスクおよびマスク解除します。

    場合によっては、単位をまったく開始しないようにしてください。通常、これは、特定のユニットがシステム上のほかの機能と競合する場合、またはポリシー理由のために実行できます。

    systemctl maskコマンドを使用して、nfs-serverサービスをマスクします。

    sudo systemctl mask nfs-server
    

    systemdユニット構成が/dev/nullを指していることを確認するために、シンボリック・リンクが作成されます。これにより、サービスが有効化または開始されるのを防ぐことができます。

    マスクされている間、nfs-serverユニットを起動できないことを確認します。

    sudo systemctl start nfs-server
    

    サービスを開始できず、サービスがマスクされていることを示すエラーが返されます。

    ユニットをマスク解除して元の状態に戻し、ユーザーがサービスを開始または有効化できるようにします。

    sudo systemctl unmask nfs-server
    

ユーザー・スペース・ユニット用にsystemdを設定

一般に、systemdはシステム・レベルでユニットを管理するために使用されます。この方法で構成されたsystemdユニットを管理するには、システムに対する管理者レベル・アクセスが必要です。一部の環境や一部のユニット・タイプでは、ユーザー空間内のユニットを実行するためのsystemdの機能を使用できます。たとえば、ユーザーはsystemdのタイマー・ユニット機能を使用してタスクをスケジュールしたり、ルート・レベルの権限を実行する必要のない特定のアプリケーションまたはサービスをサービス・ユニットとして実行したりする場合があります。

systemdは、ログイン時にユーザーのsystemdユーザー・プロセスを開始します。次のディレクトリにあるユニットは、ユーザーに対して次の順序で処理されます。

systemdコマンドに--userオプションを使用して、ユーザー・スペースで作業していることをsystemdに指定できます。

  1. ユーザーの現在使用可能なユニットファイルを一覧表示します。

    systemctl --user list-unit-files
    

    使用可能なユニットのリストは、--userオプションを指定せずに同じコマンドを発行した場合よりも大幅に短いことに注意してください。

    これらのユニット・ファイルの大部分は、新しいシステム上にある/usr/lib/systemd/userにあります。このディレクトリにあるユニットを表示するには、このディレクトリのファイルをリストします。

    ls -la /usr/lib/systemd/user/
    
  2. 独自のsystemdユニット・ファイルをホストするディレクトリを作成します。

    mkdir -p $HOME/.config/systemd/user
    
  3. 独自のsystemdサービス・ユニットを作成します。

    cat << EOF > $HOME/.config/systemd/user/uptime.service
    [Unit]
    Description="Logs system uptime and load average"
    Wants=uptime.timer
    
    [Service]
    ExecStart=/usr/bin/uptime
    
    [Install]
    WantedBy=default.target
    
    EOF
    

    このサービス・ユニットには、3つの構成セクションがあります。

    Unitセクションには、ユニットおよび要件の説明が表示されます。この場合、Wantsエントリは、まだ存在しないタイマー・ユニットの弱い要件を定義します。Wantsエントリとしてリストされるユニットは、使用可能な場合に実行されますが、親ユニットが見つからない場合や実行に失敗した場合は、その親ユニットの実行を妨げません。

    Serviceセクションでは、この特定のサービス・ユニット実行時の動作を定義します。ここでは、使用可能なオプションの多くのデフォルト値を使用し、サービスの起動時に実行されるコマンドを指定するExecStart行のみを指定します。この場合、uptimeコマンドを実行して、システムの稼働時間とロード値を記録します。

    Installセクションでは、サービスを有効にするときにシステムにサービスをインストールする方法を定義します。特に、サービスは'default.target'のWantedByのサービスとして追加されます。これは、サービスがこのユーザーのデフォルト・ターゲットの一部として有効化されることを意味します。

  4. systemdユニットを実行し、出力を確認します。

    新しいユニットを追加したため、通常、サービスの実行を試行する前にsystemd構成を再ロードすることをお薦めします。

    systemctl --user daemon-reload
    

    新しいユニットを起動します。

    systemctl --user start uptime
    

    コマンドが期待どおりに実行されたことを確認します。サービスの実行を確認するには、そのステータスを確認します。

    systemctl --user status uptime
    

    ノート:これらのコマンドは、--userオプションを使用してユーザー・スペース内で実行します。

    実行されたuptimeコマンドの出力を確認するには、journalctlコマンドを使用してログを表示し、コマンド固有のログを表示するタグ・オプションを指定します:

    journalctl -t uptime
    

    このサービスは、ユーザーが最初にシステムにログインしたときに開始されるように有効にできます。

    systemctl --user enable uptime
    

    サービスは、ユーザーが最初にシステムにログインしたときに実行されることに注意してください。システムブート時に自動的に起動されません。通常、ユーザー空間で実行されるサービスは、ユーザーがログアウトするか、すべてのユーザー・セッションが終了すると終了します。ユーザー・サービスの永続性の有効化については、このチュートリアルの後半で説明します。

systemdタイマー・ユニットの処理

この演習では、前の演習に基づいて構築し、タイマー・ユニットが特定の時間または間隔で別のsystemdユニットを定期的に実行できるようにします。タイマー・ユニットは、システム・レベルとユーザー・レベルの両方で定義でき、systemdが別のユニットを実行するタイミングを定義するために使用できます。タイマー・ユニットは、スケジュールされたイベントを詳細に制御し、cronデーモンを使用してより微妙な構成を処理するかわりに実行できます。

多くのシステム・サービスには、実行時を制御するタイマー・ユニットが含まれます。dnf-automaticパッケージには、通常のdnf更新を自動的に実行するときにシステムを最新の状態に保つために使用できるタイマー・ユニットの簡単な例が含まれています。これをシステム・レベルで動作させるには、パッケージをインストールし、タイマー・ユニットを有効にします。

sudo dnf install -y dnf-automatic
sudo systemctl enable dnf-automatic.timer

ユニット・ファイルを表示して、このユニットがどのように構成されているかを確認できます。

cat /usr/lib/systemd/system/dnf-automatic.timer

このユニットの重要なコンテンツには、network-online.targetが満たされることを想定するWants行が含まれます。構成のTimerセクションのOnCalendarエントリは、このアクションが毎日06h00で実行されることを示しています。また、RandomizedDelaySecエントリも対象となります。これは、タイマー・ユニットがすべて同時に起動するのを防ぐことができ、システム・ロードが突然向上します。

ここで示す例は、非常に複雑なユニットのセットの一部です。タイマー・ユニットの動作方法をよりよく理解するには、ユーザー・スペースにタイマー・ユニットを追加して、前の演習で作成したuptime.serviceを定期的に実行するようにスケジュールします。

  1. タイマー・ユニット・ファイルを作成します。

    cat <<EOF > $HOME/.config/systemd/user/uptime.timer
    [Unit]
    Description=Timer for the uptime service that logs uptime
    Requires=uptime.service
    
    [Timer]
    Unit=uptime.service
    OnCalendar=*-*-* *:*:00
    
    [Install]
    WantedBy=timers.target
    

    このファイルは、このタイマー・ユニットを実行するためにuptime.serviceが必要であることを指定します。これは、Wants定義で定義されたものよりはるかに強力な要件であり、要件を満たさない場合、ユニットは実行されません。

    Timerセクションでは、OnCalendarエントリを使用してuptime.serviceユニットをロードすることを定義します。OnCalendarエントリは、crontab定義のオプションと同様に機能しますが、より粒度を提供します。この場合、ユニットは00秒ごとに実行するように定義されます。

  2. systemd構成を変更したため、systemdデーモンを再ロードし、稼働時間サービスを再起動して、新しいタイマー・ユニットをピックアップできるようにします。

    systemctl --user daemon-reload
    systemctl --user restart uptime
    
  3. ユニットをリストして、uptime.serviceおよびuptime.timerユニットが実行中であることを確認します。

    systemctl --user list-units
    
  4. ジャーナルのログ出力をモニターして、稼働時間サービスが1分ごとに起動した稼働時間出力を確認します。

    journalctl -f -t uptime
    

    数分後に、数行の出力が表示されます。細心の注意を払っていた場合は、uptimeコマンドが常に瞬時にトリガーされるとは限りません。これは、systemdタイマー機能内の意図的な機能です。タイマー・ジョブは、最大で1分の遅延でタスクをトリガーできるランダム化子でトリガーされます。これは、タイマーがまったく同時にトリガーされるのを防ぐのに役立ちます。次の構成エントリをタイマー・ユニットのTimerセクションに追加することで、スケジュール・イベントのナノ秒内の精度を設定することで、タイマーを非常に正確に設定できます。

    AccuracySec=1us
    

    ただし、ほとんどのタスクでは、タスクの実行が同期しすぎないように、不正確さの程度を許容することが適切です。

    モニタリングが終了したら、Ctrl-Cキーの組み合わせを使用してジャーナルを終了できます。

ログアウト後に続行するようにユーザー・スペース・プロセスを構成します

デフォルトでは、ユーザーが起動および所有するサービスおよびプロセスは、ユーザーがログアウトしたとき、またはユーザーのすべてのセッションが終了したときに終了します。systemd内でこのデフォルト動作を変更するために使用できる方法がいくつかあります。ここでは、2つのオプションについて説明します。

loginctlコマンドを使用して、systemd lingerユーザーを有効にします。

loginctlコマンドを使用すると、特定のユーザーのデフォルトの動作を変更したり、ユーザーのセッションが終了した後にそのユーザーのプロセスを「リンガ」にしたりできます。

  1. 特定のユーザーのリンガを有効にするには、loginctlユーティリティーを使用します。この例では、oracleユーザーのsystemd言語の動作を有効にします。

    sudo loginctl enable-linger oracle
    
  2. 設定が適用されていることを確認するには、/var/lib/systemd/lingerディレクトリ内のユーザーと同じ名前のファイルを確認します。

    ls /var/lib/systemd/linger/oracle
    

    このコマンドは、ファイルが存在することを確認します。

systemd logind.confファイルを編集します。

Systemdはユーザー・ログイン・イベントを管理し、ユーザーのセッションに関連する様々なイベントのデフォルト動作を設定するために編集できる構成ファイルを提供します。この構成ファイルは、/etc/systemd/logind.confにあります。

  1. /etc/systemd/logind.confにある既存の構成の内容を画面にダンプして確認します。

    cat /etc/systemd/logind.conf
    

    ほとんどのオプションはコメントアウトされていますが、コンパイル時のデフォルト値が表示されます。このファイルには、ユーザーのセッションが終了したときに、ユーザー空間内で実行されているプロセスをsystemdがどのように処理するかを制御する3つのオプションがあります。

    • KillUserProcesses:このオプションは、セッションの終了時にユーザー・プロセスがデフォルトで終了するかどうかを制御できます。このオプションを「no」に設定すると、ユーザーがシステムからログアウトした後にsystemdがユーザー・プロセスを実行できます。
    • KillExcludeUsers: KillUserProcessesオプションが有効な場合、このオプションを使用すると、セッションの終了後にsystemdが処理を継続できるユーザーのスペース区切りリストを指定できます。このリストへのユーザー名の追加は、loginctlコマンドを使用したsystemd呼び出し元グループへのユーザーの追加と同様に動作します。
    • KillOnlyUsers: KillUserProcessesオプションが無効になっている場合、このパラメータは、ログアウト後にプロセスを終了する必要があるユーザーのスペース区切りリストを指定するために使用できます。

ビデオ・デモ

systemdのビデオ・デモは、Oracle Linux 8でsystemdの操作の詳細が必要な場合、https://www.youtube.com/watch?v=9uDvnZKhU8Aおよびhttps://www.youtube.com/watch?v=Tkxs-wfZrnwにあります。

Oracle Linux 8のsystemd System and Service Manager

Oracle Linux 8のsystemdターゲット・ユニット

詳細情報

その他の学習リソース

docs.oracle.com/learnの他のラボを調べるか、Oracle Learning YouTubeチャネルでさらに無料の学習コンテンツにアクセスします。さらに、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerにします。

製品ドキュメントは、Oracleヘルプ・センターを参照してください。