サービス、ユニット、およびジャーナルで動作するSystemd Essentials

はじめに

近年、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をインストールする必要があります)。

たとえば、サービスを起動するには、次のように入力します:

  1. sudo systemctl start nginx.service

再度停止するには、次のように入力します:

  1. sudo systemctl stop nginx.service

サービスを再起動するには、次のように入力できます:

  1. sudo systemctl restart nginx.service

通常の機能を中断せずにサービスを再読み込みしようとするには、次のように入力できます:

  1. sudo systemctl reload nginx.service

ユニットの有効化または無効化

デフォルトでは、ほとんどのsystemdユニットファイルは、起動時に自動的に開始されません。この機能を構成するには、ユニットを「有効」にする必要があります。これにより、特定の起動「ターゲット」にフックされ、そのターゲットが開始されるとトリガーされるようになります。

サービスを起動時に自動的に起動するようにするには、次のように入力します:

  1. sudo systemctl enable nginx.service

サービスを再度無効にする場合は、次のように入力します:

  1. sudo systemctl disable nginx.service

システムの状態の概要を取得する

systemdサーバーからシステムの状態の概要を取得するには、多くの情報を取得できます。

たとえば、「アクティブ」としてsystemdがリストしているすべてのユニットファイルを取得するには、次のように入力します(これは実際にはsystemctlのデフォルトの動作ですが、list-unitsを省略してもかまいません):

  1. systemctl list-units

systemdがメモリにロードまたはロードしようとしたすべてのユニットをリストするには、--allスイッチを追加します:

  1. systemctl list-units --all

システムにインストールされているすべてのユニットをリストするには、systemdがメモリにロードしようとしていないものも含めて、次のように入力します:

  1. systemctl list-unit-files

基本的なログ情報の表示

A systemd component called journald collects and manages journal entries from all parts of the system. This is basically log information from applications and the kernel.

最古のエントリからすべてのログエントリを表示するには、次のように入力します:

  1. journalctl

デフォルトでは、journaldが前の起動レコードを保存するように構成されている場合、現在のおよび前のブートからエントリが表示されます。 一部のディストリビューションはこれをデフォルトで有効にしていますが、他のディストリビューションはそうではありません(これを有効にするには、/etc/systemd/journald.confファイルを編集してStorage=オプションを「persistent」に設定するか、sudo mkdir -p /var/log/journalを入力して永続的なディレクトリを作成します)。

現在のブートからのジャーナルエントリのみを表示したい場合は、-bフラグを追加します:

  1. journalctl -b

一般的にdmesgによって表されるカーネルメッセージのみを表示するには、-kフラグを使用できます:

  1. journalctl -k

再度、これを現在のブートに限定するには、-bフラグを追加します:

  1. journalctl -k -b

ユニットの状態とログのクエリ

上記のコマンドは一般的なシステムの状態にアクセスするためのものですが、個々のユニットの状態に関する情報も取得できます。

ユニットの現在の状態の概要を見るには、systemctl コマンドに status オプションを使用します。これにより、ユニットがアクティブかどうか、プロセスに関する情報、および最新のジャーナルエントリが表示されます:

  1. systemctl status nginx.service

問題のユニットのすべてのジャーナルエントリを見るには、journalctl コマンドにユニット名とともに -u オプションを指定します:

  1. journalctl -u nginx.service

いつものように、-b フラグを追加してエントリを現在の起動に制限することもできます:

  1. journalctl -b -u nginx.service

ユニットとユニットファイルの検査

今では、ユニットの状態を変更して開始したり停止したりする方法、およびプロセスの状態とジャーナル情報を表示してプロセスの状況を把握する方法を知っています。しかし、ユニットやユニットファイルの他の側面を検査する方法はまだ見ていません。

A unit file contains the parameters that systemd uses to manage and run a unit. To see the full contents of a unit file, type:

  1. systemctl cat nginx.service

ユニットの依存関係ツリー(ユニットを開始するときに systemd がアクティブ化しようとするユニット)を見るには、次のように入力します:

  1. systemctl list-dependencies nginx.service

これにより、依存ユニットが表示され、target ユニットが再帰的に展開されます。すべての依存ユニットを再帰的に展開するには、--all フラグを渡します。

  1. systemctl list-dependencies --all nginx.service

最後に、システム上のユニットの設定の低レベルの詳細を表示するには、show オプションを使用できます。

  1. systemctl show nginx.service

これにより、systemd によって管理されている各パラメータの値が表示されます。

ユニットファイルの変更

ユニットファイルを変更する必要がある場合、systemd では実際のディスクの場所に移動する必要はありません。その代わりに、systemctl コマンド自体から変更を行うことができます。

デフォルトのユニットファイルに設定を追加または上書きするためのユニットファイルスニペットを追加するには、単にユニットにeditオプションを呼び出します。

  1. sudo systemctl edit nginx.service

スニペットを作成する代わりにユニットファイル全体を変更する場合は、--fullフラグを渡します。

  1. sudo systemctl edit --full nginx.service

ユニットファイルを変更した後は、変更内容を反映するためにsystemd プロセス自体をリロードする必要があります。

  1. sudo systemctl daemon-reload

ターゲット(ランレベル)の使用

イニシャライズシステムの別の機能は、サーバー自体を異なる状態に移行させることです。従来のイニシャライズシステムでは、これらを通常「ランレベル」と呼び、システムを一度に1つのランレベルにのみすることができます。

systemdでは、代わりに「ターゲット」が使用されます。ターゲットは基本的に、サーバーを特定の状態にするための同期ポイントです。サービスや他のユニットファイルはターゲットに結び付けることができ、複数のターゲットが同時にアクティブになることがあります。

システムで利用可能なすべてのターゲットを表示するには、次のように入力します:

  1. systemctl list-unit-files --type=target

systemdが起動時に到達しようとするデフォルトのターゲット(これにより、そのターゲットの依存関係ツリーを構成するすべてのユニットファイルが開始されます)を表示するには、次のように入力します:

  1. systemctl get-default

起動時に使用されるデフォルトのターゲットを変更するには、set-defaultオプションを使用します:

  1. sudo systemctl set-default multi-user.target

ターゲットに結び付けられているユニットを表示するには、次のように入力します:

  1. systemctl list-dependencies multi-user.target

指定したターゲットに移行してシステムの状態を変更するには、isolateオプションを使用します。これにより、指定されたターゲットに結び付けられていないユニットが停止します。孤立させるターゲットが必要なサービスを停止しないように注意してください:

  1. sudo systemctl isolate multi-user.target

サーバーの停止または再起動

システムが移行できる主要な状態のいくつかには、ショートカットが用意されています。たとえば、サーバーの電源を切るには、次のように入力します:

  1. sudo systemctl poweroff

システムを再起動したい場合は、次のように入力してください:

  1. sudo systemctl reboot

レスキューモードにブートするには、次のように入力してください:

  1. sudo systemctl rescue

ほとんどのオペレーティングシステムには、これらの操作への伝統的なエイリアスが含まれているため、systemctlなしで単にsudo poweroffまたはsudo rebootを入力することができます。ただし、すべてのシステムでこれが設定されているとは限りません。

次の手順

これまでに、systemdを使用するサーバーの管理の基本を学ぶことができました。ただし、必要に応じてさらに多くのことを学ぶことができます。以下は、このガイドで説明したコンポーネントについてより詳細な情報を提供するガイドへのリンクです:

イニシャルシステムの強みを活用することで、マシンの状態を制御し、サービスとプロセスをより簡単に管理できます。

Source:
https://www.digitalocean.com/community/tutorials/systemd-essentials-working-with-services-units-and-the-journal