systemd 概要
これはなに
systemdってなに?と思って調べたことのまとめ。
systemdとは
UNIX系OSにおいて、自身を含む全てのバックグラウンドプロセス(サービス)のデーモン(メモリ上で待機している常駐プログラム)を管理するシステム管理デーモン。
OS起動直後にカーネルにより実行されるinitプロセス(PID 1)に当たる。
全てのプロセスの元となるプロセスになる。
$ pstree # プロセスをツリー状に表示するコマンド systemd─┬─VBoxService───8*[{VBoxService}] ├─accounts-daemon───2*[{accounts-daemon}] ├─agetty ├─atd ├─cron ... ├─systemd-network ├─systemd-resolve ├─systemd-udevd └─uuidd
systemdが目指したもの
- システム起動時間を短縮
- 必要なサービス群の起動の並列実行によりinitプロセスを時短できる
- システム構成の動的変更に対応
- システム起動時だけでなく、変更に応じて動的にサービス起動/停止を行う
- プロセス停止処理を標準機能として提供
- デーモンの実行環境を制御
- サービスごとにデーモンの実行環境(リソース割り当てやアクセス可能なディレクトリ)やログ出力を管理
管理方法 - Unit
管理単位
処理はUnitという単位で管理される。
Unit file の構成
Unitfileは3つのセクションから構成される。
Section | description |
---|---|
Unit | Unitの説明や依存/順序関係など、基本となる設定を記述 |
Service | 起動,停止コマンドや環境変数ファイル、起動判定方法や再起動条件、起動するユーザや指定ディレクトリのアクセス制御など、そのデーモン固有の設定を記述 |
Install | systemctl enable/disable (後述)時の挙動を記述 |
Unit間の依存/順序関係
- 依存関係
- AというUnitを有効化するなら、BというUnitも有効化すべき、という関係
- Unitセクションにおいて、
Wants=
やRequires=
,Conflict=
で定義する。 <UNIT>.wants
,<UNIT>.requires
ディレクトリに依存関係のあるUnitファイルへのシンボリンクリンクを張ることでも定義できる。
- 順序関係
- AというUnitを有効化する前に、BというUnitを有効化すべき、という関係
- Unitセクションにおいて、
After=
やBefore=
で定義する。
Unitの種類
Unitファイルのファイル名末尾で見分ける。
種類 | 作成方法 | description |
---|---|---|
.service | 明示的に定義 | 有効化すると対応するデーモンが起動する。 |
.target | 明示的に定義 | 何もしない。Unit間の依存/順序関係を定義する時、複数のUnitをグループ化するのに使用する。 |
.mount | /ect/fstab から自動作成 |
有効化するとマウントされる。 |
.swap | /ect/fstab から自動作成 |
有効化するとSwap領域が有効になる。 |
.device | udev から自動作成 |
udevがデバイスを認識すると有効化される。 |
.socket | 明示的に定義 | systemdが特定のソケットをListenし、接続があると指定のデーモンを起動してソケットを受け渡す。 |
管理場所
- /etc/systemd/system
- こちらが優先実行される。サーバー管理者がカスタマイズできるところ。
- /usr/bin/lib/systemd/system
- デフォルト設定。基本は触らない。触りたい時は
/etc/systemd/system
に同名でコピーして触る。
- デフォルト設定。基本は触らない。触りたい時は
主要コマンド
$ systemctl list-unit-files # Unitの一覧表示 $ systemctl list-units # 有効(であるべき)Unitとその状態の一覧表示 $ systemctl enable/disable <UNIT> # Unitの自動起動,無効化 $ systemctl start/stop/reload <UNIT> # Unitの手動起動,停止,再起動(Unit fileにreload動作が設定されている場合のみ) $ systemctl status <UNIT> # Unitの実行状態の表示(関連するデーモンプロセスや直近のログなど) $ systemctl deamon-reload # Unit fileを変更した際にsystemdに認識させる