Rabbit Slide Show

Debian default init: sysvinit -> systemd

2015-06-12

Description

short talk about systemd

Text

Page: 1

Debian default init:
sysvinit -> systemd
佐々木洋平
uwabami@gfd-dennou.org
EPNetFaN 2015 座学編
2015-06-11

Page: 2

はじ
めに

Page: 3

はじめに/宣伝
今日は「Debian 8」 の話は(あまり)しません
OSC 2015 Hokkaido
今週末, 札幌コンベンションセンター
セッション
6/13(土) 11:00 - 11:45
タイトル「8,9,10 = Jessie,Stretch,Buster」
詳細:「OSC 2015 Hokkaido」で検索

Page: 4

そんな
こんなで

Page: 5

今日の
お題

Page: 6

systemd

Page: 7

お品書き
init の役割
これまでの init: SysV init
これからの init: systemd
systemd でできること/できないこと(?)

Page: 8

お品書き
init の役割
これまでの init: SysV init
これからの init: systemd
systemd でできること/できないこと(?)

Page: 9

init の
役割

Page: 10

Linux の boot sequence
1. 電源投入⇒BIOS or UEFI が起動
2. BIOS or UEFI ⇒ bootloader を起動
3. bootlader が kernel を起動
4. kernel が init を起動

Page: 11

init とその役割
init: kernel が最初に呼ぶプログラム(の総称)
init がすること
ファイルシステムのマウント, ネットワーク設定, サ
ービスの開始
サービスの管理(起動, 停止, 再起動)
カーネルからのイベントの受け取りとユーザランド
での処理の実行(例: Ctrl-Alt-Delete ⇒ 再起動)

Page: 12

お品書き
init の役割
これまでの init: SysV init
これからの init: systemd
systemd でできること/できないこと(?)

Page: 13

SysV
init

Page: 14

SysV init
SysV init = SystemV 由来の init
✓ init が初回に行なうプロセスの総称
✓ /sbin/init バイナリそのもの(文脈に注意)
SysV init 由来の概念
✓ runlevel: 0(halt), 1(single user mode), 6(reboot), 等

Page: 15

Debian の sysvinit(1)
sysvinit の設定ファイル群と初回起動時の挙動
✓ /etc/inittab: runlevel None でシステムを初期化
✓ /etc/rcS.d: ランレベル Single でハードウェアを初期化
✓ /etc/rcX.d: 2-5 のいずれかの runlevel でサービスを起動
(通常は runlevel 2 で動作する)

Page: 16

Debian の sysvinit(2)
Squeeze の sysvinit
✓ 単純な SysV init スタイル. sh script を逐次実行
Wheezy の sysvinit
✓ LSB(Linux Standard Base) ヘッダーで定義された依存関
係に従い, sh script を並列に実行 ⇒ 高速に起動
✓ 依存関係が間違っていると挙動不審

Page: 17

LSB ヘッダの例: dovecot
#! /bin/sh
### BEGIN INIT INFO
# Provides:
# Required-Start:
# Required-Stop:
# Should-Start:
# Should-Stop:
# Default-Start:
# Default-Stop:
# Short-Description:
# Description:
### END INIT INFO
dovecot
$local_fs $remote_fs $network $syslog $time
$local_fs $remote_fs $network $syslog
postgresql mysql slapd winbind nslcd
postgresql mysql slapd winbind nslcd
2 3 4 5
0 1 6
Dovecot init script
Init script for dovecot services

Page: 18

脱線: サービスの起動/停止
多くの場合スクリプトを直接叩きがち
なるべく service を使うこと
# /etc/init.d/dovecot stop <-- これは駄目
# service dovecot stop
<-- こっちの方が良い
何故=>環境変数, ファイルシステムが同じ保証は無
い

Page: 19

SysV init じゃ駄目なの?
1. SysVinit によるサービス起動の複雑さ
- 環境の切り替え,他のサービスへの依存...etc.
⇒うまくやるのが難しい(できなくはないけれど)
2. ファイルベースの PID 管理
⇒SysV init は PID を管理していない.
- ファイルに吐いているだけ.
- PID の重複チェックは? 孫プロセスは?
3. sh に起因するアレコレ: 遅い

Page: 20

お品書き
init の役割
これまでの init: SysV init
これからの init: systemd
systemd でできること/できないこと(?)

Page: 21

systemd

Page: 22

systemd とは?
systemd: not system"D" or "S"ystemd
✓ (メイン)開発者: Lennart Poettering@Red Hat
✓ License: LGPL-2.1+
特徴
✓ cgroups によるプロセス管理, 積極的な並列動作
✓ sh より簡便な設定, 詳細なドキュメント...etc.

Page: 23

cgroups とは?
Control Groups の略
Linux Kernel の新機能
プロセスのグループ化, リソース制限, 名前ベースの分
離
LXC(Linux Container), Docker
= cgroups + namespace での分離 (+ 管理ツール)

Page: 24

systemd のプロセス管理
全ての「サービス」は独自の cgroup に所属
✓ 「サービス」に関連する全てのプロセスを管理可能
(SysV init では PID ファイルでしか管理できなかった)
✓ 「サービス」の「リソース」「権限」も管理可能
(リソースの制限は ulimit 等で指定するしかなかった)

Page: 25

systemd-{cgls,cgtop}
systemd-cgls
✓ cgroup の階層構造を表示
systemd-cgtop
✓ cgroup のリソース消費を表示

Page: 26

systemd: サービス管理
個々の「サービス」は「Unit」ファイルで記述
Unit で定義された 「サービス」を systemctl で操
作
#
#
#
#
systemctl
systemctl
systemctl
systemctl
start dovecot <-- service dovecot start
start dovecot.service <-- (.service) は省略可能)
stop dovecot
<-- service dovecot stop
restart dovecot <-- service dovecot restart

Page: 27

systemd: runlevel
systemd で runlevel に相当する概念は targets
例: /etc/systemd/system/graphical.target.wants
各サービスをターゲット下に symlink を作成して
管理
# systemctl enable/disable SERVICE <-- symlink の作成/削除
# systemctl mask/unmask SERVICE
<-- /dev/null への symlink

Page: 28

bootup(7)

Page: 29

boot の解析:
systemd-analyze
ユニット定義が正しければ積極的に並列動作: 高速
boot 時の解析コマンド: systemd-analyze
#
#
#
#
systemd-analyze
systemd-analyze blame
systemd-analyze plot
systemd-analyze critical-chain
<--
<--
<--
<--
起動時間の表示
遅いユニットの表示
グラフ化
一番時間がかかっている
ユニットの解析

Page: 30

システムの状態表示:
systemctl
%
%
%
%
%
#
systemctl
systemctl
systemctl
systemctl
systemctl
systemctl
list-units
-t service
--failed
status
status SERVICE
status SERVICE -l
<--
<--
<--
<--
<--
<--
systemctl だけでも良い
サービスのみの表示
起動に失敗したサービスの表示
全体の状況を表示
特定のサービスの表示
詳細表示

Page: 31

ユニットファイルの書き方
atd を例に
sysvinit の場合: /etc/init.d/atd
systemctl では?
systemd.unit(5)
systemd.service(5)
systemd.exec(5)

Page: 32

例: atd.service
[Unit]
Description=Deferred execution scheduler
Documentation=man:atd(8)
[Service]
ExecStart=/usr/sbin/atd -f
IgnoreSIGPIPE=false
[Install]
WantedBy=multi-user.target

Page: 33

Unit ファイルの置き場所
パッケージの場合:
⇒ /lib/systemd/system/ 以下に置かれる
個別に設定したい or 修正したい場合:
⇒ /etc/systemd/system/ 以下に置く

Page: 34

SysV init の sh は?
(今のところ) systemd-sysv が対応
LSB ヘッダの解析
init-functions の置き換え
複雑な事をしないサービス(デーモン)は, そのまま
動く
とはいえ, sh を調整するのは苦痛
Unit -> sh の変換は容易に可能なので...

Page: 35

これからのinit: systemd
systemd
cgroups によるプロセス管理
積極的な並列動作
「Unit」による簡便な設定
詳細なドキュメント

Page: 36

脱線: 他の OS は?
Solalis: SMF Service Management Facility
カーネル空間でのプロセス管理: contract
Mac OS X (>= 10.4): launchd
init, inetd, atd, crond 等の機能を単一のバイナリで提
供
2006年8月に Apache 2.0 で公開
両者とも, XML で設定ファイルを記述

Page: 37

脱線: その2
Debian で sysvinit を使い続けるには?
⇒ syvinit-core をインストールすると良い
互換性維持のため, systemd-shim も入れておく
と吉
ただし, GNOME を使うなら systemd 推奨
Desktop の場合には systemd 使った方が...
LXC や Docker を使うなら systemd の方が良い?
jessie on wheezy は今のところ駄目(注意)

Page: 38

お品書き
init の役割
これまでの init: SysV init
これからの init: systemd
systemd でできること/できないこと(?)

Page: 39

All your cgroups are
belong to us
inittab -> consoled, logind, localed
network -> systemd-networkd
syslog -> jounald
ntp -> timedated, timesyncd
cron -> timer.targets

Page: 40

systemd components
"http://ja.wikipedia.org/wiki/Systemd"

Page: 41

醜聞
- Fsck SystemD and its developers and its users:
https://lists.debian.org/debian-ctte/2014/02/msg00376.html
- Linus 様が systemd にぶちきれる:
http://cpplover.blogspot.jp/2014/04/linussystemd.html
- 「魚は頭から腐る」--systemdの開発者がトーバルズ氏を公然と批判:
http://japan.zdnet.com/article/35054778/

Page: 42

個人的
見解

Page: 43

まとめ
Debian 8 から default の init は systemd になりま
した
高速起動, 管理・設定しやすい方式に
柔軟なプロセス/リソース管理が可能に
sysvinit も残ります(選択の自由).
RHEL7がバグを踏み潰してくれでしょう
別の init が表れる可能性もあるでしょう

Page: 44

参考文献
- Debian リファレンス:
https://www.debian.org/doc/manuals/debian-reference/index.ja.html
- Wikipedia: systemd
http://ja.wikipedia.org/wiki/Systemd
- Fsck SystemD and its developers and its users:
https://lists.debian.org/debian-ctte/2014/02/msg00376.html
- Linus 様が systemd にぶちきれる:
http://cpplover.blogspot.jp/2014/04/linussystemd.html
- 「魚は頭から腐る」--systemdの開発者がトーバルズ氏を公然と批判:
http://japan.zdnet.com/article/35054778/

Other slides