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に認識させる

参考