SystemdEssentials:サービス、ユニット、ジャーナルの操作
序章
近年、Linuxディストリビューションは他のinitシステムからsystemd
にますます移行しています。 systemd
ツールスイートは、起動以降のマシン全体を管理するための高速で柔軟なinitモデルを提供します。
このガイドでは、systemd
対応サーバーを管理するために知っておく必要のある最も重要なコマンドについて簡単に説明します。 これらは、systemd
を実装するすべてのサーバー(Ubuntu 15.04、Debian 8、CentOS 7、Fedora 15以降のすべてのOSバージョン)で動作するはずです。 始めましょう。
基本ユニット管理
systemd
が管理および操作する基本的なオブジェクトは、「ユニット」です。 ユニットにはさまざまなタイプがありますが、最も一般的なタイプは「サービス」です(.service
で終わるユニットファイルで示されます)。 systemd
対応サーバーでサービスを管理するための主なツールは、systemctl
コマンドです。
通常のinitシステムコマンドはすべて、systemctl
コマンドと同等のアクションを実行します。 nginx.service
ユニットを使用してデモンストレーションを行います(このサービスファイルを取得するには、パッケージマネージャーと一緒にNginxをインストールする必要があります)。
たとえば、次のように入力してサービスを開始できます。
sudo systemctl start nginx.service
次のように入力すると、再度停止できます。
sudo systemctl stop nginx.service
サービスを再開するには、次のように入力します。
sudo systemctl restart nginx.service
通常の機能を中断せずにサービスのリロードを試みるには、次のように入力します。
sudo systemctl reload nginx.service
ユニットの有効化または無効化
デフォルトでは、ほとんどのsystemd
ユニットファイルは起動時に自動的に開始されません。 この機能を構成するには、ユニットを「有効にする」必要があります。 これにより、特定のブート「ターゲット」に接続され、そのターゲットが開始されたときにトリガーされます。
起動時にサービスを自動的に開始できるようにするには、次のように入力します。
sudo systemctl enable nginx.service
サービスを再度無効にする場合は、次のように入力します。
sudo systemctl disable nginx.service
システム状態の概要を取得する
systemd
サーバーから取得して、システムの状態の概要を把握できる情報はたくさんあります。
たとえば、systemd
が「アクティブ」としてリストしているすべてのユニットファイルを取得するには、次のように入力します(これは、デフォルトのsystemctl
の動作であるため、実際にはlist-units
を省略できます。 )::
systemctl list-units
systemd
がメモリにロードした、またはロードしようとしたすべてのユニット(現在アクティブでないユニットを含む)を一覧表示するには、--all
スイッチを追加します。
systemctl list-units --all
systemd
がメモリにロードしようとしていないユニットを含め、システムにインストールされているすべてのユニットを一覧表示するには、次のように入力します。
systemctl list-unit-files
基本的なログ情報の表示
systemd
コンポーネントは、journald
と呼ばれ、システムのすべての部分からジャーナルエントリを収集および管理します。 これは基本的に、アプリケーションとカーネルからのログ情報です。
最も古いエントリから始まるすべてのログエントリを表示するには、次のように入力します。
journalctl
デフォルトでは、journald
が以前のブートレコードを保存するように構成されている場合、これは現在および以前のブートからのエントリを表示します。 一部のディストリビューションはデフォルトでこれを有効にしますが、他のディストリビューションはこれを有効にしません(これを有効にするには、/etc/systemd/journald.conf
ファイルを編集してStorage=
オプションを「永続的」に設定するか、sudo mkdir -p /var/log/journal
)。
現在のブートからのジャーナルエントリのみを表示したい場合は、-b
フラグを追加します。
journalctl -b
通常dmesg
で表されるようなカーネルメッセージのみを表示するには、-k
フラグを使用できます。
journalctl -k
繰り返しますが、-b
フラグを追加することにより、これを現在のブートのみに制限できます。
journalctl -k -b
ユニットの状態とログのクエリ
上記のコマンドを使用すると、一般的なシステム状態にアクセスできますが、個々のユニットの状態に関する情報を取得することもできます。
ユニットの現在の状態の概要を確認するには、status
オプションとsystemctl
コマンドを使用できます。 これにより、ユニットがアクティブであるかどうか、プロセスに関する情報、および最新のジャーナルエントリが表示されます。
systemctl status nginx.service
問題のユニットのすべてのジャーナルエントリを表示するには、journalctl
コマンドにユニット名を指定した-u
オプションを指定します。
journalctl -u nginx.service
いつものように、-b
フラグを追加することで、エントリを現在のブートに制限できます。
journalctl -b -u nginx.service
ユニットとユニットファイルの検査
これで、ユニットの状態を開始または停止して変更する方法と、状態およびジャーナル情報を表示してプロセスで何が起こっているかを把握する方法を理解しました。 ただし、ユニットおよびユニットファイルの他の側面を検査する方法はまだわかりません。
ユニットファイルには、systemd
がユニットの管理と実行に使用するパラメータが含まれています。 ユニットファイルの全内容を表示するには、次のように入力します。
systemctl cat nginx.service
ユニットの依存関係ツリー(ユニットの起動時にユニットsystemd
がアクティブ化を試みる)を表示するには、次のように入力します。
systemctl list-dependencies nginx.service
これにより、target
ユニットが再帰的に展開された従属ユニットが表示されます。 すべての依存ユニットを再帰的に展開するには、--all
フラグを渡します。
systemctl list-dependencies --all nginx.service
最後に、システムでのユニットの設定の低レベルの詳細を確認するには、show
オプションを使用できます。
systemctl show nginx.service
これにより、systemd
によって管理されている各パラメーターの値がわかります。
ユニットファイルの変更
ユニットファイルに変更を加える必要がある場合は、systemd
を使用すると、systemctl
コマンド自体から変更を加えることができるため、実際のディスクの場所に移動する必要はありません。
デフォルトのユニットファイルの設定を追加または上書きするために使用できるユニットファイルスニペットを追加するには、ユニットのedit
オプションを呼び出すだけです。
sudo systemctl edit nginx.service
スニペットを作成するのではなく、ユニットファイルのコンテンツ全体を変更する場合は、--full
フラグを渡します。
sudo systemctl edit --full nginx.service
ユニットファイルを変更した後、systemd
プロセス自体をリロードして、変更を取得する必要があります。
sudo systemctl daemon-reload
ターゲットの使用(ランレベル)
initシステムのもう1つの機能は、サーバー自体を異なる状態間で遷移させることです。 従来のinitシステムは通常、これらを「ランレベル」と呼び、システムが一度に1つのランレベルにのみ存在できるようにします。
systemd
では、代わりに「ターゲット」が使用されます。 ターゲットは基本的に、サーバーを特定の状態にするためにサーバーが使用できる同期ポイントです。 サービスおよびその他のユニットファイルをターゲットに関連付けることができ、複数のターゲットを同時にアクティブにすることができます。
システムで使用可能なすべてのターゲットを表示するには、次のように入力します。
systemctl list-unit-files --type=target
systemd
が起動時に到達しようとするデフォルトのターゲットを表示するには(これにより、そのターゲットの依存関係ツリーを構成するすべてのユニットファイルが起動します)、次のように入力します。
systemctl get-default
set-default
オプションを使用して、起動時に使用されるデフォルトのターゲットを変更できます。
sudo systemctl set-default multi-user.target
ターゲットに関連付けられているユニットを確認するには、次のように入力します。
systemctl list-dependencies multi-user.target
isolate
オプションを使用して、システム状態を変更してターゲット間を移行できます。 これにより、指定されたターゲットに関連付けられていないユニットが停止します。 分離しているターゲットが重要なサービスを停止しないことを確認してください。
sudo systemctl isolate multi-user.target
サーバーの停止または再起動
システムが移行できる主要な状態のいくつかについては、ショートカットを使用できます。 たとえば、サーバーの電源をオフにするには、次のように入力します。
sudo systemctl poweroff
代わりにシステムを再起動する場合は、次のように入力します。
sudo systemctl reboot
次のように入力すると、レスキューモードで起動できます。
sudo systemctl rescue
ほとんどのオペレーティングシステムには、これらの操作の従来のエイリアスが含まれているため、systemctl
なしでsudo poweroff
またはsudo reboot
と入力するだけで済みます。 ただし、これがすべてのシステムで設定されるとは限りません。
次のステップ
これで、systemd
を使用するサーバーを管理する方法の基本を理解する必要があります。 ただし、ニーズが拡大するにつれて、学ぶべきことがたくさんあります。 以下は、このガイドで説明したいくつかのコンポーネントに関するより詳細な情報が記載されたガイドへのリンクです。
- Systemctlを使用してSystemdサービスとユニットを管理する方法
- Journalctlを使用してSystemdログを表示および操作する方法
- SystemdUnitsとUnitFilesを理解する
initシステムの長所を活用する方法を学ぶことで、マシンの状態を制御し、サービスとプロセスをより簡単に管理できます。