JavaScriptをがんばるブログ

React,OSS,ソフトウェア開発が中心のブログです👨‍💻

「systemd実践入門」の読書記録

Software Design 2018年2月号の特集「systemd実践入門」の読書記録です。

systemdとは何か?

Linuxで使われているブートシステム。ユーザーランドのプロセス起動とマネジメントを行う。

systemdはLinuxの起動システムであるUpstartやSysVinitの代替として2010年にLennart Poettering氏を中心として開発がスタート。
その後、2011年にRed hat Enterprise Linux 7とCent OS 7に採用、2015年にはDebian, Ubuntuのデフォルトの起動システムとして採用された。

wikipediaによるとメジャーなディストリビューションではほぼほぼデフォルトでブートされるようです。
主なLinuxディストリビューションのsystemd採用例

Google Compute EngineでKVM上に立ち上がる仮想マシン(Ubuntu 16.04)でもsystemdが動作してることが確認できました。

f:id:ryota-murakami:20180513164522p:plain

基本的にはSysV, LSBといった古いブートマネージャと互換性を保ったプログラムのようです。https://wiki.ubuntu.com/systemd

SysVinitとの違い

SysVinitでは/etc/inittabの定義をもとにスクリプトを順次実行していくが、
systemdではユニットと呼ばれる単位で並列にシステムを起動するため起動時間全体が高速化される。

SysVinitの起動の例

f:id:ryota-murakami:20180513164540p:plain

systemdの起動の例

f:id:ryota-murakami:20180513164555p:plain

ユニット

ユニットはsystemdが処理する単位で、サービスやターゲット、デバイスなど役割ごとに種類がある。
システムの起動時には定義されたユニットを並列に処理する事で起動時間が高速化される。
ユニットは種類ごとに拡張子を持つ設定ファイルとして用意されている。

設定ファイルの拡張子 説明
.service プロセスの起動、停止、再起動などの定義
.device udevによってデバイスが認識されたときに作られる
.target 複数のユニットをグループにしたもの
.socket IPC, ネットワークソケット, FIFOの定義
.path 指定したパスを監視して変化に応じて処理を実行する
.timer さまざまな時間指定によって処理を実行する
.mount マウントポイント。fstabによる自動生成もしくは定義
.automount 自動マウントポイント。fsbtabによる自動生成もしくは定義
.swap スワップ領域。fstabによる自動生成もしくは定義

service

拡張子が.serviceの設定ファイルに設定内容を定義する事で起動、終了、再起動などを制御する事ができる。   起動したプロセスはcgroups管理下となりCPUやメモリなどのリソースを制御することもできる。
systemdはプロセスの状態を常時把握している。

  • /usr/lib/systemd/system/は、パッケージが提供するファイルを設置するディレクト
  • /etc/systemd/system/は、システム管理者が設定を修正したい場合にファイルを設置するディレクト

同名のファイルがどちらにもあった場合は/etc/systemd/system/の方が優先される。

sudo systemctl restart sshd.service

[Service]
Type=notify
EnvironmentFile=/etc/sysconfig/sshd
ExecStart=/usr/sbin/sshd -D $OPTIONS
ExecReload=/bin/kill -HUP $MAINPID
KillMode=process
Restart=on-failure
ReatartSec=42s