systemd

  • 投稿者:
  • 投稿カテゴリー:systemd

initの実装としてsysvinitやUpstartやsystemdがある
debian8から採用された

systemd特徴

・Linuxサーバの起動時に初期設定やサービス起動をおこなうだけでなくプロセスやリソースなど様々な管理をおこなうデーモン
・sysvinitと違い、サービスをシェルスクリプトではなく、Unitという単位で管理し、設定ファイルとして持つ
 そのため処理の細分化と個別実行、依存関係の設定、並列実行などが可能
 Unitは、「target」「mount」「service」「device」など、タイプがある
・ファイルシステムのfsckやマウントなども個別のUnitとして提供されている
 systemdは、順序関係や依存関係情報をもとにして、複数のUnitをできるかぎり並列に起動していく
・プロセス停止処理を標準機能として搭載している
・プロセス起動が柔軟に実施可能(システム起動時だけでなく、タイマーやソケット通信など様々なトリガーを契機にプロセスの起動が可能)
・sysvinitはPIDでサービスを管理するが、systemdではcgroupによって管理する(cgroupはlinuxカーネルの機能なので他のOSではsystemdは利用できない)
・ランレベル(rc.d)の構造を用いないため、chkconfig sysv-rc-conf等旧ツールではほぼ役に立たない
・Unit定義ファイルは /usr/lib/systemd(システムデフォルト)・/etc/systemd/system(管理者がカスタマイズ) にある
東京エリアDebian勉強会より構造について
2016-01-03_195446

Unitのタイプ

debian_2015-05-09_111910

systemd操作

/sbin/init

/sbin/initはブートシーケンスの最後、ユーザ空間で最初に実行されるプログラム
systemdが起動することがわかる

root@hostname:/home/shimizu# ls -alh /sbin/init
lrwxrwxrwx 1 root root 20  4月 17 00:53 /sbin/init -> /lib/systemd/systemd

操作できるすべてのユニットを表示する

root@hostname:/home/shimizu# systemctl --all
  UNIT                                                                                LOAD      ACTIVE   SUB       DESCRIPTION
  proc-sys-fs-binfmt_misc.automount                                                   loaded    active   running   Arbitrary Executable File Formats File System Automount Point
  dev-cdrom.device                                                                    loaded    active   plugged   QEMU_DVD-ROM
...

起動しているユニットを表示する

root@hostname:/home/shimizu# systemctl
  UNIT                                                                                LOAD   ACTIVE SUB       DESCRIPTION
  proc-sys-fs-binfmt_misc.automount                                                   loaded active running   Arbitrary Executable File Formats File System Automount Point
  sys-devices-pci0000:00-0000:00:01.1-ata2-host1-target1:0:0-1:0:0:0-block-sr0.device loaded active plugged   QEMU_DVD-ROM
  sys-devices-pci0000:00-0000:00:03.0-virtio0-net-eth0.device                         loaded active plugged   Virtio network device
  sys-devices-pci0000:00-0000:00:04.0-virtio1-net-eth1.device                         loaded active plugged   Virtio network device
...

サービス一覧の表示

root@hostname:/home/shimizu# systemctl --type service
UNIT                               LOAD   ACTIVE SUB     DESCRIPTION
acpid.service                      loaded active running ACPI event daemon
apache2.service                    loaded active exited  LSB: Apache2 web server
arno-iptables-firewall.service     loaded active exited  LSB: Setup iptables firewall configuration
...

ユニットの詳細を確認する

root@hostname:/home/shimizu# systemctl show apache2.service
Type=forking
Restart=no
NotifyAccess=none
RestartUSec=100ms
...

systemd-cgls

cgroupsは、Kernelが持つ機能の1つ
CPUやメモリなどのリソースをプロセスグループごとに割り当てている
各グループの階層については、systemd-cglsコマンドで確認できる

root@hostname:/home/shimizu# systemd-cgls
├─1 /lib/systemd/systemd --system --deserialize 16
└─system.slice
  ├─dbus.service
  │ └─893 /usr/bin/dbus-daemon --system --address=systemd: --nofork --nopidfile --systemd-activation
  ├─cron.service
  │ ├─  884 /usr/sbin/cron -f
  │ └─21065 /usr/sbin/lpd -s
...

systemd-analyze

boot時のパフォーマンスを確認する

root@hostname:/home/shimizu# systemd-analyze
Startup finished in 1.568s (kernel) + 6.244s (userspace) = 7.813s

依存関係を表すグラフを作成可能

root@hostname:/home/shimizu# systemd-analyze dot | dot -Tsvg > systemd.svg
   Color legend: black     = Requires
                 dark blue = Requisite
                 dark grey = Wants
                 red       = Conflicts
                 green     = After

2016-01-03_201952

systemd-detect-virt

仮想環境を確認する

root@hostname:/home/shimizu# systemd-detect-virt
kvm

有効化されているUnitの一覧表示

root@hostname:/home/shimizu# systemctl list-units
UNIT                        LOAD   ACTIVE SUB       DESCRIPTION
proc-sys-fs-binfmt_misc.automount loaded active running   Arbitrary Executable File Fo
sys-devices-pci0000:00-0000:00:05.0-virtio2-net-eth2.device loaded active plugged   Virtio network device
sys-devices-platform-serial8250-tty-ttyS3.device loaded active plugged   /sys/devices/platform/serial
sys-devices-pnp0-00:04-tty-ttyS0.device loaded active plugged   /sys/devices/pnp0/00:04/tty/
sys-subsystem-net-devices-eth0.device loaded active plugged   Virtio network device
dev-mqueue.mount            loaded active mounted   POSIX Message Queue File Sys
proc-sys-fs-binfmt_misc.mount loaded active mounted   Arbitrary Executable File Fo
cron.service                loaded active running   Regular background program p
dbus.service                loaded active running   D-Bus System Message Bus
elasticsearch.service       loaded active running   LSB: Starts elasticsearch
...

インストールされているUnitファイルの一覧表示

root@hostname:/home/shimizu# systemctl list-unit-files
proc-sys-fs-binfmt_misc.automount      static
dev-hugepages.mount                    static
dev-mqueue.mount                       static
proc-sys-fs-binfmt_misc.mount          static
sys-fs-fuse-connections.mount          static
...

### 以下はchkconfig --listに相当 ###
root@hostname:/home/shimizu# systemctl list-unit-files --type=service
UNIT FILE                              STATE
acpid.service                          ^[[1;31mdisabled^[[0m
autovt@.service                        ^[[1;31mdisabled^[[0m
bootlogd.service                       ^[[1;31mmasked  ^[[0m
bootlogs.service                       ^[[1;31mmasked  ^[[0m
bootmisc.service                       ^[[1;31mmasked  ^[[0m
...

Unit操作

### 停止/起動/再起動/再読み込み ###
root@hostname:/home/shimizu# systemctl (stop/start/restart/reload) unit

### systemd をリロードし、新しい、もしくは変化のあったユニットをスキャンする ###
root@hostname:/home/shimizu# systemctl daemon-reload

Unitのログを表示

systemdはUnitとして起動したデーモンプロセスの標準出力、rsyslogdへの出力内容を独自のロギングサービス(systemd-journald.service)に送る
バイナリ形式で保存されるためjounalctlコマンドで確認する

root@hostname:/home/shimizu# journalctl -u ssh.service
-- Logs begin at 土 2015-08-08 03:24:02 JST, end at 日 2015-08-09 23:51:20 JST. --
 8月 08 22:19:45 hostname sshd[19384]: Accepted password for shimizu from 119.150.43.89 port 59218 ssh2
 8月 08 22:19:45 hostname sshd[19384]: pam_unix(sshd:session): session opened for user shimizu by (uid=0)
...

Unitを有効にする

chkconfig httpd on と同義

root@hostname:/home/shimizu# systemctl enable apache2
Synchronizing state for apache2.service with sysvinit using update-rc.d...
Executing /usr/sbin/update-rc.d apache2 defaults
insserv: warning: script 'K01denyhosts' missing LSB tags and overrides
insserv: warning: script 'denyhosts' missing LSB tags and overrides
Executing /usr/sbin/update-rc.d apache2 enable
insserv: warning: script 'K01denyhosts' missing LSB tags and overrides
insserv: warning: script 'denyhosts' missing LSB tags and overrides

Unitが有効かどうか確認する

root@hostname:/home/shimizu# systemctl is-enabled ssh
enabled

Unitの起動状態の確認

root@hostname:/home/shimizu# systemctl is-active ssh
active

Unitの異常状態の確認

root@hostname:/home/shimizu# systemctl is-failed ssh
active

Unitの依存関係の確認

root@hostname:/home/shimizu# systemctl list-dependencies
default.target
^[[1;31m●^[[0m ├─display-manager.service
^[[1;32m●^[[0m ├─elasticsearch.service
^[[1;31m●^[[0m ├─systemd-update-utmp-runlevel.service
^[[1;32m●^[[0m └─multi-user.target
^[[1;32m●^[[0m   ├─cron.service
^[[1;32m●^[[0m   ├─dbus.service
^[[1;32m●^[[0m   ├─elasticsearch.service
^[[1;32m●^[[0m   ├─rc-local.service

指定Unitより先に起動するUnitをツリー表示する

root@hostname:/home/shimizu# systemctl list-dependencies ssh --after
ssh.service
^[[1;31m●^[[0m ├─auditd.service
^[[1;32m●^[[0m ├─system.slice
^[[1;32m●^[[0m ├─systemd-journald.socket
^[[1;32m●^[[0m ├─basic.target
^[[1;32m●^[[0m │ ├─paths.target
^[[1;32m●^[[0m │ │ ├─acpid.path
^[[1;32m●^[[0m │ │ ├─systemd-ask-password-console.path
^[[1;32m●^[[0m │ │ └─systemd-ask-password-wall.path
...

serviceコマンドの利用について

serviceコマンドの実体はシェルスクリプトで、
/etc/init.d 以下に指定されたサービスのスクリプトがあればそれを実行
無ければsystemctlコマンドにサービス名を渡して実行する

参考

init
https://mowa-net.jp/wiki/init
systemdを本番運用してわかったこと

systemd超入門
http://dev.classmethod.jp/cloud/aws/systemd-getting-started/
東京エリアDebian勉強会 systemd
http://tokyodebian.alioth.debian.org/pdf/debianmeetingresume201211-presentation-iwamatsu.pdf
はじめてのsystemdサービス管理ガイド
http://dev.classmethod.jp/cloud/aws/service-control-use-systemd/
Linux女子部 systemd徹底入門