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勉強会より構造について
Unitのタイプ
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
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徹底入門