はじめに
Raspbian で使用されているsystemdの概要について記載します。
systemdを理解する上で、Linuxオペレーションシステムの起動処理について理解したほうが分かりやすいと思いますので、はじめに起動処理の概要について記載した後、systemdについて記載いたします。
環境
- ボード
Raspberry Pi 4 Model B - OS
Raspberry Pi OS (32-bit) Lite
Minimal image based on Debian Buster
Version: August 2020
Release date: 2020-08-20
Kernel version: 5.4
起動処理の概要
システムの起動処理は、以下の手順で行われます。
- 初めにBIOSがコンピュータを制御し、ディスクを検出し、マスターブートレコードを読み込み、ブートローダーを実行します。
- その後、ブートローダーが処理を引き継ぎ、ディスクからカーネルを見つけ、カーネルを読み込んで実行します。
- そして、カーネルが初期化され、ルートファイルシステムを含むパーティションの検索とマウントを開始します。
- 最後にカーネルは、最初のプログラムであるinitを実行します。
一般的に、「ルートパーティション」とinitは、RAMの中に存在する仮想ファイルシステム(initramfsと呼ばれる)上に置かれます。initramfsには、カーネルが真のルートファイルシステムを読み込むために必要な最低限の要素が含まれます。
具体的には、ハードドライブやシステム起動に最低限必要なその他のデバイスのドライバーモジュール、RAIDアレイを構成し暗号化されたパーティションを開き、LVMモジュールを有効化するなどの初期化スクリプトとモジュールが含まれます。
ルートパーティションがマウントされると、initramfsは制御を真のinitに渡し、コンピュータは標準的な起動処理を実行します。
systemdの概要
systemdは、これまで使用されてきたSysVやinitスクリプトと互換性があるLinuxオペレーティングシステムのシステムとサービスのマネジャーです。
上記の起動処理を行う「initの実体」は、現在のRaspbian Busterでは、systemdによって提供されています。(initは、/lib/systemd/systemdへのシンボリックリンクになっています。)
systemdは、システムの設定を担当している複数のプロセスを実行します。
具体的には、キーボード、デバイスのドライバ、ファイルシステム、ネットワーク、サービスなどの要素が設定されます。
Systemdは、システム全体におよぶ包括的視点と各要素の要求条件を満足させながらプロセスを実行します。
各要素は、「ユニットファイル」等によって定義されます。(「ユニットファイル」以外のファイルが必要な場合があります。)
ユニットファイルは、/lib/systemd/system/と/etc/systemd/system/の配下に保存されます。ユニットファイルにはいくつかの形式があり、サービス(.service)、ターゲット(.target)、マウントポイント(.mount)、デバイス(.device)、ソケット(.socket)などがあります。
systemctl コマンドの概要
systemctlは、systemdの内部状態を確認したり、状態の制御を行うするために使用するコマンドです。以下にコマンドの一部を記載します。
システムの状態を表示
システムの状態を表示するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ systemctl status
pi@raspberrypi:~ $
実行中ユニットの一覧表示
実行中のユニットを一覧表示するには、以下のコマンドを実行します。
ユニット名、ユニット定義のロード状態、有効状態(high-level)、有効化状態(low-level)、説明が表示されます。
pi@raspberrypi:~ $ systemctl list-units
pi@raspberrypi:~ $
実行に失敗したユニットの一覧表示
状態がfailedであるユニットを一覧表示するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ systemctl --failed
pi@raspberrypi:~ $
インストールされているユニットファイルの一覧表示
システムにインストールされているユニットファイルを一覧表示するには、以下のコマンドを実行します。
ユニットファイル名、ユニットファイルの状態が表示されます。
pi@raspberrypi:~ $ systemctl list-unit-files
pi@raspberrypi:~ $
ユニットの実行
ユニットを実行するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo systemctl start <ユニット>
pi@raspberrypi:~ $
ユニットの停止
ユニットを停止するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo systemctl stop <ユニット>
pi@raspberrypi:~ $
ユニットの再起動
ユニットを再起動するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo systemctl restart <ユニット>
pi@raspberrypi:~ $
ユニットに設定を再読み込みするように通知
ユニットに設定を再読み込みするように通知するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo systemctl reload <ユニット>
pi@raspberrypi:~ $
ユニットの状態表示
ユニットの状態を表示するには、以下のコマンドを実行します。
ロード状態、有効化状態、プロセスID、直近のログが表示されます。
pi@raspberrypi:~ $ sudo systemctl status <ユニット>
pi@raspberrypi:~ $
自動実行状態の確認
起動時に自動実行するように設定されているか確認するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo systemctl is-enabled <ユニット>
pi@raspberrypi:~ $
自動実行の有効化設定
起動時に自動実行されるように設定するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo systemctl enable <ユニット>
pi@raspberrypi:~ $
自動実行の無効化設定
起動時に自動実行されないように設定するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo systemctl disable <ユニット>
pi@raspberrypi:~ $
ユニットのマスク設定
ユニットのマスク設定を行うには、以下のコマンドを実行します。
ユニットをマスクすることにより、実行されなくなります。
一時的に、自動起動を停止する場合などに便利です。
pi@raspberrypi:~ $ sudo systemctl mask <ユニット>
pi@raspberrypi:~ $
ユニットのマスク解除
ユニットのマスク設定を解除するには、以下のコマンドを実行します。
pi@raspberrypi:~ $ sudo systemctl unmask <ユニット>
pi@raspberrypi:~ $
systemdのリロード
systemdに設定を再読み込みするように通知には、以下のコマンドを実行します。
新しく作成したユニットや変化のあったユニットがスキャンされます。
すべてのユニットファイルを読み直し、完全な依存ツリーを作りなおします。
pi@raspberrypi:~ $ sudo systemctl daemon-reload <ユニット>
pi@raspberrypi:~ $
参考
- Debian 管理者ハンドブック
- SYSTEMCTL(1) manページ