systemdは最初に起動されるプログラムです。
systemdは他のデーモン・サービスの起動タイミングや順序などを管理する重要なプログラムの集合体です。
systemd以前はSysV initが使われていましたが、並列処理ができるsystemdは高速起動が可能であるなどの利点があり現在のLinuxでは標準的に採用されています。
今回はsystemdについて紹介していきます。
systemdとは?どんな役割があるのか?
sysytemdはカーネルによって起動される一番最初のプロセスです。そのため、プロセスIDは1です。
ちなみにカーネルはLinux OSの中核となるプログラムでCPUやメモリの使い方を管理したりファイルの読み書きをする機能があります。
プロセスはCPUによって実行されるプログラムそのものです。一つのアプリケーションに複数のプロセスが存在する場合があります。デーモンとはバックグラウンドで動くプロセスで常に待機しています。httpdやsshdもデーモンです。systemdはシステム管理デーモンです。
デーモンとは?サービスと同じ?systemdはすべてのデーモンを管理するデーモンです。sysytemdが親となって子プロセスが開始されます。
systemdのような他のプログラムを管理する親的なプログラムのことをinitプロセスと呼びます。かつては後述するSystem V ・initが使われていました。
System V ・initからの移行
systemdは現在、多くのディストリビューションで採用されているinitプロセスです。
かつて利用されていたSystem V・initは速度の遅さなどの課題がありました。
- 一つ一つ順番に起動(直列処理)のため遅い
- 設定ファイルがシェルスクリプトで管理され複雑
こうした課題を解決するためsystemdが登場しました。起動の高速化のため
- 不要なサービスを起動せず
- 並列的にサービスを起動
することで高速化を達成しています。
systemdはプロセスの起動順序や依存関係を管理する
プロセスには依存関係があります。
依存関係とは、とあるプロセスの起動に必要とされるプロセスが存在している状態のことです。
例えばネットワーク通信を利用するサービス(webサーバ)を開始する場合、ネットワーク通信を開始するサービスよりも早く起動しても意味がないため、network -> webserverというような起動の順番になります。
webserver プロセスはnetworkプロセスの起動を必要としています。
このような依存関係もsystemdは管理しています。プロセスの起動の順番を制御したり、依存関係にあるサービスの起動が失敗したら依存関係にある別のプロセスの起動はしないなどの管理を行います。
systemdに対する批判もありますが、事実上sysytemdはSysV initの後継となっています。
systemctlコマンド
systemdでは起動や状態確認などをsystemctlコマンドで行います。
- sysetmctl start service名 サービスの起動
- sysetmctl stop service名 サービスの停止
- sysetmctl restart service名 サービスの再起動
- sysetmctl status service名 サービスの状態確認
- sysetmctl reload service名 サービスの設定読み込み
- sysetmctl enable service名 サービスの自動起動有効
- sysetmctl disable service名 サービスの自動起動無効
- sysetmctl list-units ユニットの一覧を表示
- systemctl list-unit-files サービスの自動起動状態を確認
- systemctl get-default デフォルトターゲットの確認
- systemctl set-default graphical.target デフォルトターゲットの変更
これらのコマンドがあります。
systemctlコマンドはD-BUSというメッセージバスと呼ばれるアプリケーションとアプリケーションとのやりとりを行う仕組みを介してsystemdとやりとりします。
ターゲットの変更(ランレベル)
initdで使われていたランレベルに相当するものをsystemdではターゲットと呼びます。詳しくは以下のページを参照してください。
ターゲット (ランレベル)とは?設定の方法ターゲットを変更するには
# systemctl set-default multi-user.target
ターゲットの確認は
# systemctl get-default
で確認します。
ユニット
systemdには12のユニットと呼ばれる単位でシステムを管理します。
systemdはユニットの中のdefalt.targetを頂点としてユニットを起動していきます。
- Service:デーモンの起動などの管理
- Target : ユニットのグループ
- Automount:自動マウント
- Device:デバイスの検知
- Mount:ファイルシステムのマウントポイントを制御
- Path:ファイル変更時などにユニットをトリガー
- Scope: 外部作成のプロセス
- Slice :システムプロセスを管理するユニットグループ
- Snapshot :systemd ユニットの状態を保存・復元する
- Socket:ソケットからの通信
- Swap:メモリースワップをカプセル化
- Timer :タイマーによって他のユニットをトリガーする
initd が起動するプロセスの数
sysv initdはシェルスクリプトで書かれているため遅いと言われます。シェルスクリプトはgrepやawk, sedなどのプログラムを複数回呼び出すために遅くなります。
どのくらいプロセスを起動しているかは起動後に最初に起動するプロセスのプロセスIDの数を見るとわかります。
linuxではプロセスid起動したプロセスに対しては1から若い順につけていきます。そのためOS起動直後に上げたプロセスのプロセスIDを見るとどの程度起動したのかがわかります。