ノート:
- このチュートリアルは、Oracle提供の無料ラボ環境で入手できます。
- Oracle Cloud Infrastructureの資格証明、テナンシおよびコンパートメントに例の値を使用します。演習を完了するときは、これらの値をクラウド環境に固有の値に置き換えます。
Oracle Linuxでsystemdを使用
イントロダクション
このチュートリアルでは、systemctlコマンド行ユーティリティーを使用して、systemdによって制御されるsystemdユニットを管理および表示する方法を学習します。このチュートリアルは、Oracle Linux 8以降のユーザーを対象としています。
systemdは、ブート時に開始される最初のプロセスで、システムのシャットダウン時に終了する最後のプロセスです。systemdは、主に、ブート時にシステム・サービスまたはプロセスおよびシステム初期化を管理するために使用されます。ただし、systemdは、イベント・ロギング、デバイス管理、ユーザー・ログイン、タスク・スケジューリング、時間同期およびシステム・ブートなど、他の多くのタスクや機能を処理することもできます。systemdの多くの機能は完全には使用されていません。ユーザーは、これらの目的で代替ソフトウェアを使用すると快適に、または異なるLinuxディストリビューションではシステム構成への推奨アプローチが使用される可能性があります。
systemd内の様々なタイプの動作または関数は、systemd単位で処理されます。たとえば、デーモン・プロセスやシステム・サービスはサービス・ユニットとして実行され、システムの状態は通常、ターゲット・ユニットとして定義されます。タイマー・ユニットは、システムのcronサービスの使用方法と同様にタスクをスケジュールするように定義でき、マウント・ユニットを使用して、システムfstabでマウント・ポイントを構成する方法と同様に、マウント・ポイントを構成できます。
systemdは、システム・レベルのプロセスと機能の管理に使用されますが、ユーザー領域で実行されるプロセスを管理することもできます。システム上のユーザーは独自のサービスを構成および管理でき、systemdは、ユーザーがセッションを終了した後もこれらのサービスの実行を継続できるように構成できます。
目的
- 様々なsystemdユニット・タイプの検出
- systemdターゲット・ユニットの使用
- 一般的な systemctlコマンド構文の学習
- ユーザー空間内に独自のsystemdタイマーユニットを作成します
- ログアウト後にユーザー・スペース・プロセスを実行できるようにsystemdを構成します
必要事項
- Oracle Linux 8がインストールされているシステム。
ノート:無料の演習環境を使用する場合は、接続やその他の使用方法の手順について、Oracle Linuxの演習の基本を参照してください。
systemdユニット・ファイルの確認
Oracle Linux 8インスタンスに接続したら、systemctlコマンドを使用した実験を開始して、使用可能な様々なユニットについて学習できます。
-
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
:メモリー・スワップ・パーティションまたはスワップ・ファイルをカプセル化します。
-
--type
オプションを使用して、ユニットリストを特定のユニットタイプに制限します。-
systemctl list-units --type services
コマンドを使用して、システムで現在アクティブなサービス・ユニットをリストします。systemctl list-units --type service
-
同じコマンドを再度実行しますが、
--all
オプションを含めて、非アクティブなユニットも含め、すべてのロード済みユニットを表示します(ある場合)。systemctl list-units --type service --all
-
使用可能なサービス・タイプごとにこれらのコマンドを繰り返して、情報を作業対象のタイプのみに制限できます。
systemdターゲット・ユニットの処理
ターゲット ユニットは、異なるユニットをグループ化して特定の状態にすることで、特定の目的のために機能できるようにするために使用されます。
-
使用可能な
target
ユニットをリストします。systemctl list-units --type target
ユニットは、他のユニットのロードを必要としたり、特定のユニットと競合するように構成できます。たとえば、
multi-user.target
ではbasic.target
が機能する必要があり、rescue.service
およびrescue.target
ユニットとも競合します。ユニットは、機能できるようにロードする他の単位も指定します。このように、ターゲットは連鎖して特定の状態を設定できますが、代替状態をトリガーするために再利用できる十分なモジュールもあります。
-
デフォルトのターゲット・ユニットを表示します。
デフォルトのターゲットユニットは、ブート後のデフォルトのシステム状態を定義します。
-
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
ファイルは、現在のデフォルトのターゲット・ユニット・ファイルへのシンボリック・リンクです。
-
-
デフォルトのターゲット・ユニットを変更します。
-
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
シンボリック・リンクが削除され、新しいデフォルト・ターゲット・ユニットを指すシンボリック・リンクが再作成されます。
-
-
詳細はターゲットを確認します。
-
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
コマンドは、システムでアクティブまたは非アクティブになっているユニットの表示にのみ使用できます。
-
システムで使用可能なすべてのユニットとその状態をリストします。
systemctl list-unit-files
使用可能なユニットの多くは静的です。有効化されたユニットは起動時に開始されます。無効になっているユニットは、システムで使用可能なユニットですが、ブート時に開始するように構成されていません。マスクされた単位はシステムで使用可能ですが、アクティブに開始できない状態に設定されています。
-
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
-
-
ブート時にサービスが開始できるようにします。
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
-
サービスを無効化および停止します。
systemctl disable
コマンドを使用して、nfs-server
サービスを無効にします。また、systemctl disable
コマンドは、サービスのsystemctlリンクを削除します。sudo systemctl disable nfs-server
systemctl stop
コマンドを使用して、nfs-server
サービスを停止します。sudo systemctl stop nfs-server
これらのステップは、サービスを無効にするときに
--now
オプションを使用して組み合せることができます。 -
ユニットをマスクおよびマスク解除します。
場合によっては、単位をまったく開始しないようにしてください。通常、これは、特定のユニットがシステム上のほかの機能と競合する場合、またはポリシー理由のために実行できます。
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ユーザー・プロセスを開始します。次のディレクトリにあるユニットは、ユーザーに対して次の順序で処理されます。
/usr/lib/systemd/user/
:インストール済パッケージによって提供されるユーザー空間単位$HOME/.local/share/systemd/user/
:ホーム・ディレクトリにインストールされるパッケージのユーザー領域単位/etc/systemd/user/
:すべてのユーザーのユーザー空間で実行されるグローバル・システム全体のユーザー単位$HOME/.config/systemd/user/
:ユーザー作成単位
systemdコマンドに--user
オプションを使用して、ユーザー・スペースで作業していることをsystemdに指定できます。
-
ユーザーの現在使用可能なユニットファイルを一覧表示します。
systemctl --user list-unit-files
使用可能なユニットのリストは、
--user
オプションを指定せずに同じコマンドを発行した場合よりも大幅に短いことに注意してください。これらのユニット・ファイルの大部分は、新しいシステム上にある
/usr/lib/systemd/user
にあります。このディレクトリにあるユニットを表示するには、このディレクトリのファイルをリストします。ls -la /usr/lib/systemd/user/
-
独自のsystemdユニット・ファイルをホストするディレクトリを作成します。
mkdir -p $HOME/.config/systemd/user
-
独自の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
のサービスとして追加されます。これは、サービスがこのユーザーのデフォルト・ターゲットの一部として有効化されることを意味します。 -
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
を定期的に実行するようにスケジュールします。
-
タイマー・ユニット・ファイルを作成します。
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秒ごとに実行するように定義されます。 -
systemd構成を変更したため、systemdデーモンを再ロードし、稼働時間サービスを再起動して、新しいタイマー・ユニットをピックアップできるようにします。
systemctl --user daemon-reload systemctl --user restart uptime
-
ユニットをリストして、
uptime.service
およびuptime.timer
ユニットが実行中であることを確認します。systemctl --user list-units
-
ジャーナルのログ出力をモニターして、稼働時間サービスが1分ごとに起動した稼働時間出力を確認します。
journalctl -f -t uptime
数分後に、数行の出力が表示されます。細心の注意を払っていた場合は、uptimeコマンドが常に瞬時にトリガーされるとは限りません。これは、systemdタイマー機能内の意図的な機能です。タイマー・ジョブは、最大で1分の遅延でタスクをトリガーできるランダム化子でトリガーされます。これは、タイマーがまったく同時にトリガーされるのを防ぐのに役立ちます。次の構成エントリをタイマー・ユニットの
Timer
セクションに追加することで、スケジュール・イベントのナノ秒内の精度を設定することで、タイマーを非常に正確に設定できます。AccuracySec=1us
ただし、ほとんどのタスクでは、タスクの実行が同期しすぎないように、不正確さの程度を許容することが適切です。
モニタリングが終了したら、Ctrl-Cキーの組み合わせを使用してジャーナルを終了できます。
ログアウト後に続行するようにユーザー・スペース・プロセスを構成します
デフォルトでは、ユーザーが起動および所有するサービスおよびプロセスは、ユーザーがログアウトしたとき、またはユーザーのすべてのセッションが終了したときに終了します。systemd内でこのデフォルト動作を変更するために使用できる方法がいくつかあります。ここでは、2つのオプションについて説明します。
loginctlコマンドを使用して、systemd lingerユーザーを有効にします。
loginctlコマンドを使用すると、特定のユーザーのデフォルトの動作を変更したり、ユーザーのセッションが終了した後にそのユーザーのプロセスを「リンガ」にしたりできます。
-
特定のユーザーのリンガを有効にするには、loginctlユーティリティーを使用します。この例では、oracleユーザーのsystemd言語の動作を有効にします。
sudo loginctl enable-linger oracle
-
設定が適用されていることを確認するには、
/var/lib/systemd/linger
ディレクトリ内のユーザーと同じ名前のファイルを確認します。ls /var/lib/systemd/linger/oracle
このコマンドは、ファイルが存在することを確認します。
systemd logind.confファイルを編集します。
Systemdはユーザー・ログイン・イベントを管理し、ユーザーのセッションに関連する様々なイベントのデフォルト動作を設定するために編集できる構成ファイルを提供します。この構成ファイルは、/etc/systemd/logind.conf
にあります。
-
/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ターゲット・ユニット
詳細情報
- Systemdのドキュメント: https://systemd.io/
systemd(1)
マニュアル・ページsystemctl(1)
マニュアル・ページjournalctl(1)
マニュアル・ページsystemd.unit(5)
マニュアル・ページlogind.conf(5)
マニュアル・ページ- Oracle Linux 8:コアシステム構成の管理
- Oracle Linux ドキュメント
その他の学習リソース
docs.oracle.com/learnの他のラボを調べるか、Oracle Learning YouTubeチャネルでさらに無料の学習コンテンツにアクセスします。さらに、education.oracle.com/learning-explorerにアクセスしてOracle Learning Explorerにします。
製品ドキュメントは、Oracleヘルプ・センターを参照してください。