systemd超入門

アイキャッチ AWS EC2
215件のシェア(すこし話題の記事)

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

これはとある勉強会用の資料です。スライド作るのが面倒臭くなったのでブログにすることにしました。

Systemdとは

Systemdは、Linuxの起動処理やシステム管理を行う仕組みです。

Linuxの起動処理

Linuxの起動はざっくりと以下の4段階によって行われます。

  1. 電源投入によりBIOSが起動する。
  2. BIOSからブートローダーが呼び出される。
  3. ブートローダーがLinuxカーネルを起動する。
  4. Linuxカーネルがinitプロセス(PID 1)を起動する。

このinitプロセスが、Linuxの起動処理を司ります。古くから使われていたのがSysvinitで、Sysvinitの代替えとして近年Ubuntuなどで採用されていたのがUpstartです。そしてFedora 15やCentOS 7、Red Hat Enterprise Linux 7で採用されたのがSystemdです。

プレゼンテーション1

Systemdの特徴

シェルスクリプトでは無い

Sysvinitは処理は全てシェルスクリプトによって書かれていました。サービスについての動作が一つのシェルスクリプトの中にたくさんの処理として書かれていたため、細分化することができませんでした。

Systemdは、サービスを1つのシェルスクリプトではなくUnitという単位で管理し、設定ファイルとして持ちます。このため処理を細分化でき個別に実効することが可能です。また処理ごとの依存関係を明確にすることが出来ます。さらに処理が細分化されているということは、並列での実行も可能になります。例えばAの処理の後にBとCを並列実行する、というようなきめ細やかな設定が可能になります。

プレゼンテーション2

プロセス起動が柔軟に行える

Linuxシステム起動時だけでは無く、様々なトリガーを契機にプロセスの起動が行えます。たとえばタイマー、ソケット通信検出、ファイルシステムのマウントなどです。システムの構成変更に応じて自動的にシステムを変化させることが出来ます。例えば新たなディスクデバイスを検出した際に特定のプロセスを起動するなどです。

PIDではなくcgroupによってプロセスを管理する

SysvinitではサービスをPIDによって管理していましたが、Systemdではcgroupによって管理します。PIDの場合、プロセスが2回forkすると親プロセスと孫プロセスの直接的な関係性は切れますが、cgroupの場合複数回のforkが発生しても管理下に置くことが出来ます。

ただし、cgroupはLinuxカーネルの機能であるため、Linux以外では使えません。これがSystemdの制限であり、Linuxカーネル上でのみ動作するようになっています。

Systemdの歴史

SystemdはLennart PoetteringKay Sieversを中心に開発され、2010年3月に最初のリリースが行われたのち、2011年にリリースされたFedora 15に搭載されました。

Features_systemd_-_FedoraProject

2012年10月に行われたRed Hat Forum 2012で、Red Hat Enterprise Linux 7ではSystemdが採用されることがアナウンスされました。そして2014年12月にリリースされたCentOS 7がSysvinitからsystemdに変更されました。

現在では上記のFedora、CentOS、RedHat Enterprise Linuxに加え、openSUSEとSUSE Linux Enterprise Server、Oracle Linux、CoreOS、Arch Linuxなどがデフォルトのinitシステムとして採用しています。またDebianも次期バージョンである8(jessie)にてSystemdを採用するとのことで、Systemd反対派の活動にも関わらず、事実上すでにSystemdが標準となっています。

Systemdの使い方

はじめてのsystemdサービス管理ガイドをご参照下さい。

さいごに

確かにSystemdは多機能過ぎて、全部覚えようとすると少々煩雑なのですが、サービス制御に特化して言えばそれほど難しいこともなく、扱いやすいと思います。将来的にRed Hat系とDebianで同じ仕組みでサービス制御が出来るようになる、というのはとても楽になるなと思いました。