つまり、コンピュータの電源を入れてから起動処理を行うものです。
systemd は他にも様々な機能を持つため、クイックリンクを記載します。
- init 関連 (起動処理関連)
- init 以外 (補助コンポーネント)
本記事では、主に init (起動処理関連) に焦点を当てて解説します。
関連記事:Linux の基本機能 | |||||
---|---|---|---|---|---|
Systemd ユニット
Systemd ユニットとは、systemd が管理する単位です。
よく利用する Systemd ユニットには、次のタイプが存在します。
ユニットタイプ | ファイルの拡張子 | 説明 |
---|---|---|
サービス | .service | systemd が起動したプロセスを制御および管理 |
ターゲット | .target | systemd ユニットのグループ |
タイマー | .timer | 特定の間隔で実行 (cron の代替) |
マウントユニットタイプは、systemd が /etc/fstab から /run/systemd/generator にユニットファイルを自動生成
以降では、ターゲット、サービス、タイマーの順解説します。
systemd ターゲット
systemd ターゲットとは、ブート時に起動する systemd ユニットの一覧です
systemd ターゲットは、systemd ユニットのターゲット (.target) に相当します。
systemd ターゲットを切り替えることで、ブート時に起動するプロセスを切り替えます。
SysV ランレベル
systemd ターゲットは、昔の SysV ランレベル (Linux の動作モード) に相当します。
ランレベル | ターゲットユニット | 詳細 |
---|---|---|
0 | poweroff.target | システムをシャットダウンし、電源を切る |
1 | rescue.target | レスキューシェル (シングルユーザーシステム) システムが壊れた時のリカバリーモード |
2, 3, 4 | multi-user.target | 非グラフィカルなマルチユーザーシステム (CUI) |
5 | graphical.target | グラフィカルなマルチユーザーシステム (GUI) |
6 | reboot.target | システムをシャットダウンして再起動 |
デフォルトのターゲットを確認
graphical.target
デフォルトのターゲットを変更
multi-user.target
デフォルトのターゲットユニットはブート時に読み込むので、反映させるには再起動します。
ロード中のターゲット一覧
basic.target loaded active active Basic System
cryptsetup.target loaded active active Local Encrypted Volumes
getty.target loaded active active Login Prompts
integritysetup.target loaded active active Local Integrity Protected Volumes
(一部省略)
multi-user.target loaded active active Multi-User System
sysinit.target loaded active active System Initialization
timers.target loaded active active Timer Units
veritysetup.target loaded active active Local Verity Protected Volumes
先ほど設定したデフォルトの multi-user.target 以外にも色々なターゲットユニットが表示される理由は、multi-user.target に他のターゲットユニットが含まれるからです。
これを依存関係や順序関係と言います。(詳細はこちら)
依存関係/順序関係の確認
default.target ○ ├─display-manager.service ○ ├─systemd-update-utmp-runlevel.service ● └─multi-user.target ● ├─basic.target (抜粋)
multi-user.target と basic.target に依存関係/順序関係があることが確認できます。
現在のターゲットユニットを変更
デフォルト (ブート時) ではなく、現在ロード中のターゲットユニットを変更する方法は以下です
graphical.target loaded active active Graphical Interface
現在ロードしているターゲットに、graphical.target が追加されました。
systemd サービス (システムサービス)
システムサービスとは、systemd が起動したプロセスです。
システムサービスは、systemd ユニットのサービス (.service) に相当します。
システムサービスの一覧を確認
... sshd.service loaded active running OpenSSH server daemon systemd-logind.service loaded active running User Login Management
システムサービスを起動
dnf などで新規にインストールした場合、システムサービスとして新規に起動します。
システムサービスの停止
システムサービスの再起動
システムサービスの自動起動
Created symlink /etc/systemd/system/multi-user.target.wants/nginx.service → /usr/lib/systemd/system/nginx.service.
デフォルト (ブート時) の systemd ターゲットにシンボリックリンクを追加して自動起動します。
システムサービスの自動起動無効
Removed "/etc/systemd/system/multi-user.target.wants/nginx.service".
デフォルト (ブート時) の systemd ターゲットからシンボリックリンクを削除します。
システムサービスの詳細情報
システムサービスが起動しているか、自動起動が有効か?などを確認できます。
ユニットファイルの書き方
ここからは、ユニットファイルの具体的な書き方を紹介します。
ユニットファイルの場所
ユニットファイルは次の場所にあります。(優先度が高い設定ファイルに上書きされます)
優先度 | Path | 説明 |
---|---|---|
低 | /usr/lib/systemd/system | パッケージインストール時点のデフォルトの設定 (つまり dnf update で上書きされる) |
中 | /run/systemd/system/ | 実行時に作成されたユニットファイル |
高 | /etc/systemd/system/ | 全ての設定を上書きして自由に設定できます (後述の systemd enable で作成される設定ファイル) |
ユニットファイルの内容
ユニットファイルは次の3つのセクションを持ちます。
セクション | 説明 |
---|---|
[Unit] | ユニットタイプに依存しない設定 ユニットの説明/起動順序/同時起動の禁止などを設定します |
[unit type] | ユニットタイプに依存する設定 ユニットタイプが [サービス] の場合、セクション名は [Service] です |
[Install] | サービスの自動起動に関する設定 (systemctl enable/disable コマンドに関連) |
Unit セクションの詳細
Unit セクションでは、起動順序や同時に起動しないユニットを設定します。
セクション | 詳細 |
---|---|
Description | ユニットの説明 systemctl status <サービス名> コマンドで表示される説明 |
Documentation | ユニットのドキュメントの URI |
After | ユニットが開始する順序 (ユニットの起動する順番) を設定After で指定したユニットがアクティブになると、このユニットを開始 |
Before | ユニットが開始する順序 (ユニットの起動する順番) を設定 このユニットがアクティブになると、Before で指定したユニットを開始 |
Requires | ユニットに依存関係 (並列に起動するユニット) を設定 指定したユニットのアクティブ化に失敗すると、このユニットを開始しません |
Wants | ユニットに依存関係 (並列に起動するユニット) を設定 指定したユニットのアクティブ化に失敗しても、このユニットは開始します |
Conflicts | Requires と反対の依存関係 (負の依存関係) を設定指定したユニットと並列 (同時) に起動できないユニット |
systemd.unit(5)
man ページhttps://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files#tabl-Managing_Services_with_systemd-Unit_Sec_Options
unit type セクションの詳細
unit type セクションは、ユニットタイプごとに異なる設定が可能です。
例えば、サービスユニットの場合は以下の設定が可能です。
セクション | 詳細 |
---|---|
Type | ユニットの起動タイミングの指定 |
EnvironmentFile | 環境変数を読み込むファイル |
ExecStart | ユニットの開始時に実行するコマンドまたはスクリプト |
ExecStop | ユニットの停止時に実行するコマンドまたはスクリプト |
ExecReload | ユニットの再読み込み時に実行するコマンドまたはスクリプト |
Restart | ユニットを再起動する条件 |
RemainAfterExit | ユニットのプロセスがすべて終了していてもアクティブと見なす |
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files#tabl-Managing_Services_with_systemd-Service_Sec_Options
Install セクションの詳細
Install セクションは、systemctl enable の動作 (ブート時の起動ユニット) を設定します。
セクション | 詳細 |
---|---|
RequiredBy | /etc/systemd/system/ユニット.requires にシンボリックリンクを作成 |
WantedBy | /etc/systemd/system/ユニット.wants にシンボリックリンクを作成 |
Also | 他にシンボリックリンクを作成するユニット |
systemd.unit(5)
man ページhttps://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/system_administrators_guide/sect-managing_services_with_systemd-unit_files#tabl-Managing_Services_with_systemd-Install_Sec_Options
ユニットファイルの設定例
例として、touch コマンドを実行するサービスユニットファイルを作成してみます。
[Unit] Description=test service [Service] Type=simple ExecStart=touch /home/ec2-user/test.txt [Install] WantedBy=multi-user.target
○ test.service - test service Process: 6031 ExecStart=touch /home/ec2-user/test.txt (code=exited, status=0/SUCCESS)
先ほど設定したとおりの内容が確認できます。
もちろん、サービスに設定した touch /home/ec2-user/test.txt コマンドも実行されています。
起動済みユニットの設定変更を反映
既に起動しているユニットの設定を変更した場合は、以下のコマンドで設定を反映できます。
Systemd タイマー (cron の代替)
Systemd タイマーとは、定期実行する systemd ユニットです。(cron の代替)
Systemd タイマーの設定
まずは、定期実行するサービスユニットを作成します。(先ほど作成したものと同じ)
今回は、ファイルを作成 (touch /home/ec2-user/test.txt) するサービスを作成します。
[Unit] Description=test service [Service] Type=simple ExecStart=touch /home/ec2-user/test.txt [Install] WantedBy=multi-user.target
次に、先ほどのサービスを定期実行するタイマーユニットを作成します。
[Timer] OnCalendar=Wed *-*-* 22:00:00 Unit=test.service [Install] WantedBy=multi-user.target
systemd タイマーの時間指定
時間の指定方法は OnCalendar= で以下のように指定します。
Oncalendar の値 | 意味 |
---|---|
[曜日 年-月-日 時:分:秒] | 例:Wed *-*-* 22:00:00 は、全ての年月日の水曜 22 時を表す 書式の詳細はこちら |
minutely | 毎分 |
hourly | 毎時間 |
daily | 毎日 |
monthly | 毎月 |
yearly | 毎年 |
systemd のタイムゾーンを変更
デフォルトでは UTC に設定されていることも多いので、タイムゾーンを確認します。
Time zone: n/a (UTC, +0000)
上記のようにタイムゾーンが日本じゃ無い場合は、Asia/Tokyo (JST, +0900) に設定します。
(設定可能なタイムゾーン一覧は timedatectl list-timezones コマンドで確認可能)
Systemd タイマーを起動
タイマーを起動したら、指定した時間まで待ってから以下のコマンドで確認します。
-rw-r--r--. 1 root root 0 Nov 6 22:00 /home/ec2-user/test.txt
タイマーで設定した時刻にファイルが作成されていることが確認できます。
なお、システム再起動時に systemd タイマーユニットが自動起動するように設定できます。
systemd タイマーの一覧を確認
前回のタイマーの実行状況や、次回の実行予定が確認できます。
NEXT LEFT LAST PASSED UNIT ACTIVATES Thu 2024-11-14 15:00:00 JST 6 days left Thu 2024-11-07 15:00:05 JST 1min 8s ago test.timer test.service
関連情報
学習ロードマップ | |||||
---|---|---|---|---|---|
関連記事:Linux の基本機能 | |||||
---|---|---|---|---|---|
Linux カーネルの機能 | |||
---|---|---|---|
ネットワークのコマンド | |||
---|---|---|---|
関連記事:サーバー | ||||
---|---|---|---|---|