サービス - systemd が起動したプロセスまたはプロセスのグループ。
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/7/html/resource_management_guide/sec-default_cgroup_hierarchies
関連記事:Linux の基本機能 | |||||
---|---|---|---|---|---|
systemd の起動処理 (init)
systemd の起動処理 (init) は以下の順で動作します。
- systemd プロセス (/usr/lib/systemd/systemd) を開始
- /etc/systemd/system/default.target のシンボリックリンクを解決し、ターゲットを確認
- ターゲットに対して、依存関係/順序を持つサービスを自動で起動
ターゲット、ランレベルとは
ランレベルとは、昔の Linux の動作モードのことで、起動するサービスが決まります。
systemd を採用した Linux では、「ターゲット」が「ランレベル」に相当する機能です。
ランレベル | ターゲットユニット | 詳細 |
---|---|---|
0 | poweroff.target | システムをシャットダウンし、電源を切る |
1 | rescue.target | レスキューシェル (シングルユーザーシステム) |
2 , 3, 4 | multi-user.target | 非グラフィカルなマルチユーザーシステム |
5 | graphical.target | グラフィカルなマルチユーザーシステム |
6 | reboot.target | システムをシャットダウンして再起動 |
/usr/lib/systemd/system/runlevel0.target -> poweroff.target /usr/lib/systemd/system/runlevel1.target -> rescue.target /usr/lib/systemd/system/runlevel2.target -> multi-user.target /usr/lib/systemd/system/runlevel3.target -> multi-user.target /usr/lib/systemd/system/runlevel4.target -> multi-user.target /usr/lib/systemd/system/runlevel5.target -> graphical.target /usr/lib/systemd/system/runlevel6.target -> reboot.target
デフォルトのターゲット (ランレベル) は以下で確認できます。
/etc/systemd/system/default.target -> /usr/lib/systemd/system/graphical.target
graphical.target ターゲットでは、実際にどんなサービスが起動するか
ユニットとは
ユニットとは、1つのサービスとそれに関連する起動処理 (init) などをまとめたものです。
ユニットは、次の情報をカプセル化します。
・システムサービス
https://access.redhat.com/documentation/ja-jp/red_hat_enterprise_linux/8/html/configuring_basic_system_settings/introduction-to-systemd_configuring-basic-system-settings#ref_systemd-unit-types_introduction-to-systemd
・ソケットのリッスン
・init システムに関連するその他のオブジェクト
ユニットファイル (設定ファイル) では、サービスが自動起動するターゲット (ランレベル) などを設定します。
ユニットタイプ
ユニットには次のタイプが存在します。
ユニットのタイプ | ユニットファイルの拡張子 | 説明 |
---|---|---|
サービスユニット | .service | システムサービス |
ターゲットユニット | .target | systemd ユニットのグループ |
自動マウントユニット | .automount | ファイルシステムの自動マウントポイント |
デバイスユニット | .device | カーネルが認識するデバイスファイル |
マウントユニット | .mount | ファイルシステムのマウントポイント |
パスユニット | .path | ファイルシステム内のファイル,ディレクトリ |
スコープユニット | .scope | 外部作成のプロセス |
スライスユニット | .slice | システムプロセスを管理する 階層的に構成されたユニットのグループ |
ソケットユニット | .socket | プロセス間の通信ソケット |
スワップユニット | .swap | スワップデバイスまたはスワップファイル |
タイマーユニット | .timer | systemd タイマー |
multi-user.target mysqld.service user.slice (etc...)
ユニットファイルの場所と優先度
ユニットファイルは複数の場所に存在し、それぞれ優先度が異なります。(高い方の設定が優先)
優先度 | Path | 説明 |
---|---|---|
1 | /etc/systemd/system/ユニット名.d/*.conf※ | 一部の設定を上書き |
2 | /etc/systemd/system/ユニット名※ | 全ての設定を上書き |
3 | /etc/systemd/system | ローカル設定 |
4 | /run/systemd/system | 実行時のユニット設定 |
5 | /usr/lib/systemd/system | パッケージインストール時点の設定 (つまり yum update で上書きされる) |
systemd.unit(5)
man ページhttps://gihyo.jp/admin/serial/01/ubuntu-recipe/0598?page=1
ユニットファイルの書き方
ユニットファイルは次の3つのセクションを持ちます。
セクション | 説明 |
---|---|
[Unit] | ユニットタイプに依存しない設定 |
[unit type] | ユニットタイプに依存する設定 ユニットタイプがサービスユニットの場合、[Service] セクションとなる |
[Install] | [systemctl enable], [systemctl disable] コマンドで、サービスユニットを有効化、無効化する時の設定 |
例えば、crond のサービスユニットファイルは以下のとおりです。
[Unit] Description=Command Scheduler After=auditd.service systemd-user-sessions.service time-sync.target [Service] EnvironmentFile=/etc/sysconfig/crond ExecStart=/usr/sbin/crond -n $CRONDARGS ExecReload=/bin/kill -HUP $MAINPID KillMode=process Restart=on-failure RestartSec=30s [Install] WantedBy=multi-user.target
Unit
セクション | 詳細 |
---|---|
Description | ユニットの説明 systemctl status <サービス名> コマンドで表示される説明 |
Documentation | ユニットのドキュメントの URI |
After | ユニットが開始する順序 (ユニットの起動する順番) を設定After で指定したユニットがアクティブになると、このユニットを開始します |
Before | ユニットが開始する順序 (ユニットの起動する順番) を設定 このユニットがアクティブになると、Before で指定したユニットを開始します |
Requires | ユニットに依存関係 (並列に起動するユニット) を設定 指定したユニットが1つでもアクティブ化に失敗すると、このユニットは開始しません |
Wants | ユニットに依存関係 (並列に起動するユニット) を設定 指定したユニットが1つでもアクティブ化に失敗しても、このユニットは開始します |
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
crond のユニットファイルを変更してみます。(注:検証環境で実施ください)
Description=Cahnge!!Command Scheduler
crond.service - Cahnge!!Command Scheduler
crond.service の説明に「Change!!」が追加されていることが確認できました。
unit type (Service)
セクション | 詳細 |
---|---|
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 セクション (自動起動の設定)
セクション | 詳細 |
---|---|
RequiredBy | systemctl enable 時に、<指定したユニット>.requires ディレクトリにシンボリックリンクを作成 |
WantedBy | systemctl enable 時に、<指定したユニット>.wants ディレクトリにシンボリックリンクを作成 |
Also | systemctl enable 時に、同時にシンボリックリンクを作成するユニット |
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
実際にシンボリックリンクの削除、作成を行ってみます。
No such file or directory
/etc/systemd/system/multi-user.target.wants/crond.service -> /usr/lib/systemd/system/crond.service
[Install] セクションで [WantedBy=multi-user.target] と設定しているので、multi-user.target.wants ディレクトリ配下にシンボリックリンクが作成されました。
つまり、crond.service はターゲット (ランレベル) が multi-user.target でシステムを起動した際に、自動起動します。
システムサービスの管理コマンド
systemd では、起動時の init だけでなく、運用中にもサービスを管理できます。
systemctl | 詳細 |
---|---|
systemctl start <name>.service | サービスを起動 |
systemctl stop <name>.service | サービスを停止 |
systemctl restart <name>.service | サービスを再起動 |
systemctl reload <name>.service | 設定を再読み込み |
systemctl status <name>.service | サービスのステータスを確認 |
systemctl list-units --type service --all | すべてのサービスのステータスを表示 |
systemctl enable <name>.service | サービスを有効化 (システム起動時に自動起動) |
systemctl disable <name>.service | サービスを無効化 |
systemd と cgroup
systemd は起動したプロセスを cgroup に配置することで階層的に管理します。
├─1 /usr/lib/systemd/systemd --switched-root --system --deserialize xx ├─docker │ └─xxxxxxxxxxxxxxxxxxxxxxxx │ └─xxxx /usr/bin/coreutils --coreutils-prog-shebang=sleep /usr/bin/sleep 10 ├─user.slice │ └─user-xxxx.slice │ └─session-xxxx.scope │ ├─xxxx sshd: xxxxxx [priv] │ ├─xxxx sshd: xxxxxx@pts/0 │ ├─xxxx -bash │ ├─xxxx systemd-cgls │ └─xxxx less └─system.slice ├─docker.service │ └─xxxx /usr/bin/dockerd -H fd:// --containerd=/run/containerd/containerd.sock ├─crond.service │ └─xxxx /usr/sbin/crond -n ├─mysqld.service │ └─xxxx /usr/sbin/mysqld --daemonize --pid-file=/var/run/mysqld/mysqld.pid
cgroup では、先ほど紹介したユニットタイプのうち、以下の3つを利用します。
ユニットのタイプ | ユニットファイルの拡張子 | 説明 |
---|---|---|
サービスユニット | .service | システムサービス |
スコープユニット | .scope | 外部作成のプロセス |
スライスユニット | .slice | システムプロセスを管理する 階層的に構成されたユニットのグループ ・-.slice - root スライス (上記の systemd スライスにある PID 1 に相当) ・system.slice: すべてのシステムサービスのデフォルト場所 ・user.slice - ユーザーセッションのデフォルトの場所 ・machine.slice: すべての仮想マシンおよび Linux コンテナーのデフォルト場所 (上記の docker に相当) |
/usr/lib/systemd/system/-.slice /usr/lib/systemd/system/system.slice /usr/lib/systemd/system/machine.slice /usr/lib/systemd/system/user.slice
関連情報
関連記事:Linux の基本機能 | |||||
---|---|---|---|---|---|