systemdとは
systemdは、
Linuxシステムにおける中心的な役割を担うシステム管理ソフトウェア群です。従来のSystem V initに代わるものとして、2010年にRedHat社のエンジニアによって開発されました。システム管理、サービス管理、設定を一元的に行うプラットフォームとして、
Linux OSの基盤を支えています。
開発者であるLennart Poetteringは、systemdを
オペレーティングシステムの「基本的な
積木」と表現しており、
UNIX System VやBSDから受け継がれてきたinitシステムを置き換えることを目的としています。systemdの名前は、デーモンを区別するための
UNIXの慣習である
ファイル名の末尾に「d」を付けることに由来し、
フランス語の「débrouille(なんとかする)」の頭文字をとった「システムD」という言葉遊びの意味も含まれています。
systemdは
Linux APIに特化して設計されており、
GNU Lesser General Public License (LGPL) version 2.1以降の条件でオープンソースソフトウェアとして公開されています。
systemdの設計思想
初期のsystemd開発者たちは、initデーモンの効率性を向上させることを目指しました。具体的には、システムの起動処理を並行または並列で実行し、
シェルのオーバーヘッドを削減し、依存関係を表現できるフレームワークを構築することを目指しました。
Poetteringはsystemdの開発を「決して終了せず、技術の進歩を追い求める」と述べており、以下の3つの機能を提供することで「ディストリビューション間の無意味な違い」を統合することを目指しています。
システムとサービスマネージャ:システムとサービスの管理
ソフトウェアプラットフォーム:他のソフトウェアの開発基盤
アプリケーションとLinuxカーネルの接着剤:カーネル機能のインターフェース提供
systemdは単なるinitデーモンではなく、initデーモン本体、journald、logind、networkdなど、多数のデーモンや低レベルコンポーネントを含むソフトウェアバンドル全体を指します。2013年時点で、systemdは69個もの個別バイナリから構成される巨大なソフトウェア一式であることが明かされました。
systemdは、従来のinitデーモンがシェルスクリプトを用いて行っていた起動プロセスやランレベルの制御を置き換えます。さらに、ユーザーログイン、システムコンソール、デバイスホットプラグ、ジョブスケジューリング、ロギング、ホスト名やロケールの管理など、Linuxシステムにおける多くの共通サービスを統合します。
systemdは、バックグラウンドで動作するデーモンを管理するデーモンです。起動時に最初に開始され、シャットダウン時に最後に終了するプロセスです。systemdは、ユーザー空間のプロセスツリーのルートとなり、デーモンのモニタリングを担います。従来のinitシステムではデーモンを一度だけ起動してモニタリングしないというアプローチでしたが、systemdはデーモンを自動的に再起動するなど、より高度な管理を行います。
systemdは、起動プロセスを並列に実行することで高速化を実現しています。プロセス間通信には、UNIXドメインソケットとD-Busを利用し、systemd自身の状態をスナップショットに保存することも可能です。
ユニットファイル
systemdでは、デーモンごとの起動シェルスクリプトの代わりに、宣言型言語を用いた設定ファイル(ユニットファイル)を使用します。ユニットファイルには、サービス(service)、ソケット(socket)、デバイス(device)、マウント(mount)、自動マウント(automount)、スワップ(swap)、ターゲット(target)、パス(path)、タイマー(timer)、スナップショット(snapshot)、スライス(slice)、スコープ(scope)など、様々なタイプがあります。
コアコンポーネントとライブラリ
systemdは、起動シェルスクリプト、pm-utils、inetd、acpid、syslog、watchdog、cron、atdなど、様々なデーモンやユーティリティの代替を提供しています。主なコンポーネントには、以下のものがあります。
`systemd`:システムとサービスマネージャ
`systemctl`:システムおよびサービスマネージャの状態を監視・制御
`systemd-analyze`:システム
ブートアップパフォーマンス統計の取得
`machinectl`:ソフトウェアコンテナの作成と管理
systemdは、プロセスの追跡にプロセス識別子 (PID) ではなくLinuxカーネルのcgroupsサブシステムを使用しており、デーモンが2回forkしてもsystemdから逃れることはできません。また、systemd-nspawnやmachinectlといったユーティリティプログラムにより、ソフトウェアコンテナの作成と管理を容易にします。
補助コンポーネント
systemdは、Linux initシステムの代替だけでなく、以下のような追加機能も提供します。
`consoled`:ユーザー
コンソールデーモン
`journald`:イベントロギングデーモン
`logind`:ユーザーログインとシートを管理するデーモン
`networkd`:ネットワーク設定を行うデーモン
`timedated`:システム時間、タイムゾーンの設定を行うデーモン
`udevd`:Linuxカーネルのデバイスマネージャ
`libudev`:udevリソースを照会するための標準ライブラリ
他のソフトウェアとの統合
systemdとGNOMEデスクトップ環境との相互運用性を向上させるため、systemdはGNOMEの外部依存になることが提案されましたが、GNOMEの基本的な機能はsystemdに依存しないという結論に至りました。しかし、実際にはlogindなどを利用するために、systemdが事実上GNOMEの依存ソフトウェアとなっています。
グラフィカルフロントエンド
systemdを操作するためのグラフィカルフロントエンドとして、以下のものが利用可能です。
`systemd-ui/systemadm`:GTK+ベースのsystemdフロントエンド
`kcmsystemd`:KDEデスクトップ環境用のsystemdフロントエンド
フォークと代替実装
systemdのアーキテクチャへの依存を避けるために、以下のフォークや代替実装が存在します。
`eudev`:udevのフォーク
`uselessd`:systemdの軽量フォーク
`systembsd`:OpenBSD用のsystemd代替API実装
`consolekit2`:ConsoleKitのフォーク
採用と反響
多くの
Linuxディストリビューションでsystemdがデフォルトのinitシステムとして採用されていますが、systemd以外のinitシステムを使用することも可能です。Debianのフォークである
Devuanは、systemdを避ける方針を採っています。
歴史と論争
2011年
5月、
Fedoraが最初にsystemdをデフォルトのinitシステムとして採用しました。その後、多くのディストリビューションが追随しましたが、systemdの設計思想はコミュニティ内で大きな論争を呼びました。
批判的な意見としては、systemdのアーキテクチャが
UNIX哲学に反し、ソフトウェアの肥大化を招くというものがあります。また、systemdの開発者や採用を推進する人々への反発もあり、開発者間の対立やコミュニティ内の分裂を招きました。
しかし、systemdは現在では
Linuxシステムの基盤として広く受け入れられており、その影響力は非常に大きいです。