SystemdEssentials:サービス、ユニット、ジャーナルの操作

提供:Dev Guides
移動先:案内検索

序章

近年、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を使用するサーバーを管理する方法の基本を理解する必要があります。 ただし、ニーズが拡大するにつれて、学ぶべきことがたくさんあります。 以下は、このガイドで説明したいくつかのコンポーネントに関するより詳細な情報が記載されたガイドへのリンクです。

initシステムの長所を活用する方法を学ぶことで、マシンの状態を制御し、サービスとプロセスをより簡単に管理できます。