initとプロセス再起動

29
2012-07-18 # 監監監監監監監監 02 init 監監監監監監監監 監監監監監監監監監監 監監監監

Transcript of initとプロセス再起動

Page 1: initとプロセス再起動

2012-07-18 # 監視ツール勉強会 02

init とプロセス再起動株式会社ハートビーツ 滝澤隆史

Page 2: initとプロセス再起動

私は誰•氏名 : 滝澤 隆史 @ttkzw•所属 : 株式会社ハートビーツ•何やっている人▫メーラ Mutt の国際化や日本語対応パッチ作者▫SpamAssassin の日本語対応パッチ作者▫Unbound/NSD の文書の翻訳

2

Page 3: initとプロセス再起動

アジェンダ•Linux ディストリビューションにおける init と

起動・停止の制御および自動再起動について•対象▫SysV init▫Upstart▫systemd

Page 4: initとプロセス再起動

Linux における init

Page 5: initとプロセス再起動

Linux における init• init はカーネルのブート後に最初に起動するプロセス• 厳密に言うと、▫カーネルは起動時に、 initrd として指定された initramfs/

initrd イメージをルートパーティションとしてマウントする。

▫ /init (スクリプト)を実行する。▫ /init スクリプト内でデバイスの認識やルートパーティショ

ンのマウントなどを行う。▫ /init スクリプトの最後で、 exec 経由および、 switch_root

あるいは run-init コマンド経由で /sbin/init を実行する。 exec switch_root /sysroot /sbin/init exec run-root /root /sbin/init

Page 6: initとプロセス再起動

SysV init

Page 7: initとプロセス再起動

SysV init• /sbin/init が起動• /etc/inittab を読む。• sysinit に定義したプロセスを実

行▫ rc.sysinit スクリプトを実行

• initdefault に定義したランレベルに切り替え

• ランレベル毎の wait に定義したプロセスを実行。▫ rc スクリプトを実行。

• respawn に定義したプロセスを実行▫ mingetty( 端末 ) あるいは

prefdm( ディスプレイマネージャ ) を起動。

▫ プロセスが終了したら再起動

id:3:initdefault:

si::sysinit:/etc/rc.d/rc.sysinit

l0:0:wait:/etc/rc.d/rc 0l1:1:wait:/etc/rc.d/rc 1l2:2:wait:/etc/rc.d/rc 2l3:3:wait:/etc/rc.d/rc 3l4:4:wait:/etc/rc.d/rc 4l5:5:wait:/etc/rc.d/rc 5l6:6:wait:/etc/rc.d/rc 6

1:2345:respawn:/sbin/mingetty tty12:2345:respawn:/sbin/mingetty tty23:2345:respawn:/sbin/mingetty tty34:2345:respawn:/sbin/mingetty tty45:2345:respawn:/sbin/mingetty tty5x:5:respawn:/etc/X11/prefdm -nodaemon

inittab の形式ID: ランレベル : アクション : プロセ

/etc/inittab

Page 8: initとプロセス再起動

SysV init におけるサービスの起動• init により直接起動する機能が提供されているわ

けではない•サービス毎の rc スクリプトを利用して起動▫/etc/rc.d/init.d/ サービス名 start▫/etc/init.d/ サービス名 start

•service コマンドによりサービスを起動▫service サービス名 start

•例) sshd の場合▫/etc/init.d/sshd start▫service sshd start

Page 9: initとプロセス再起動

SysV init におけるサービスの停止• init により直接停止する機能が提供されているわ

けではない•サービス毎の rc スクリプトを利用して停止▫/etc/rc.d/init.d/ サービス名 stop▫/etc/init.d/ サービス名 stop

•service コマンドによりサービスを停止▫service サービス名 stop

•例) sshd の場合▫/etc/init.d/sshd stop▫service sshd stop

Page 10: initとプロセス再起動

意図しないサービス停止•サービスの不具合や OOM Killer など、意図せ

ずサービスが停止することがある• /etc/inittab での設定によりサービス停止後の

動作を指定できる。

Page 11: initとプロセス再起動

自動再起動の設定•設定ファイル▫/etc/inittab

• respawn アクションの記述▫ID: ランレベル :respawn: サービスの起動コマン

ド•例) Monit▫mo:2345:respawn:/usr/sbin/monit -Ic

/etc/monitrc•設定の反映▫telinit q

Page 12: initとプロセス再起動

サービス監視ツールの併用• respawn の問題点▫サービスによってはうまく制御できないことが

ある。▫停止させることができない。

•daemontools や monit などサービス監視系のツールを inittab に登録し、自動再起動させたいサービスをその制御下に置くとよい

Page 13: initとプロセス再起動

Upstart

Page 14: initとプロセス再起動

Upstart によるサービスの起動• initctl コマンドによりサービスを起動▫initctl start サービス名

•start コマンドは initctl のシンボリックリンク▫start サービス名

•後方互換のために service コマンドも使える▫service サービス名 start

•例) sshd の場合▫initctl start ssh▫start ssh▫service ssh start

Page 15: initとプロセス再起動

Upstart によるサービスの停止• initctl コマンドによりサービスを停止▫initctl stop サービス名

•stop コマンドは initctl のシンボリックリンク▫stop サービス名

•後方互換のために service コマンドも使える▫service サービス名 stop

•例) sshd の場合▫initctl stop ssh▫stop ssh▫service ssh stop

Page 16: initとプロセス再起動

Upstart の制御外でサービス停止•サービスの不具合や OOM Killer な

ど、 Upstart の制御外でサービスが停止することがある

•Upstart の設定によりサービス停止後の動作を指定できる。

Page 17: initとプロセス再起動

サービス毎の設定ファイル•サービス毎の設定ファイル▫/etc/init/XXX.conf

•例) sshd に対する設定ファイル▫/etc/init/ssh.conf

Page 18: initとプロセス再起動

異常終了時の動作•設定ファイルに respawn と記述することによ

り異常終了時にサービスを自動再起動させることができる。

Page 19: initとプロセス再起動

/etc/init/ssh.conf# ssh - OpenBSD Secure Shell server## The OpenSSH server provides secure shell access to the system.

description "OpenSSH server"

start on filesystem or runlevel [2345]stop on runlevel [!2345]

respawnrespawn limit 10 5umask 022

# 'sshd -D' leaks stderr and confuses things in conjunction with 'console log'console none

pre-start script test -x /usr/sbin/sshd || { stop; exit 0; } test -e /etc/ssh/sshd_not_to_be_run && { stop; exit 0; } test -c /dev/null || { stop; exit 0; }

mkdir -p -m0755 /var/run/sshdend script

# if you used to set SSHD_OPTS in /etc/default/ssh, you can change the# 'exec' line here insteadexec /usr/sbin/sshd -DA

Page 20: initとプロセス再起動

systemd

Page 21: initとプロセス再起動

systemd とは•Linux 用のシステムおよびサービスのための管

理デーモン•SysV init / LSB init と互換性あり

Page 22: initとプロセス再起動

systemd によるサービスの起動•systemctl コマンドにより起動する▫systemctl start サービス名 .service

•後方互換のために service コマンドも使える▫service サービス名 start

•例) sshd の場合▫systemctl start sshd.service▫service sshd start

Page 23: initとプロセス再起動

systemd によるサービスの停止•systemctl コマンドにより停止する▫systemctl stop サービス名 .service

•後方互換のために service コマンドも使える▫service サービス名 stop

•例) sshd の場合▫systemctl stop sshd.service▫service stop start

Page 24: initとプロセス再起動

systemd の制御外でサービス停止•サービスの不具合や OOM Killer な

ど、 systemd の制御外でサービスが停止することがある

•systemd の設定によりサービス停止後の動作を指定できる。

Page 25: initとプロセス再起動

サービス毎の設定ファイル•サービス毎の設定ファイル▫/etc/systemd/system/multi-user.target.wants/XXX.service

•実態は次のファイルのシンボリックリンク▫/usr/lib/systemd/system/XXX.service

•例) sshd に対する設定ファイル▫/etc/systemd/system/multi-user.target.wants/sshd.service

▫/usr/lib/systemd/system/sshd.service

Page 26: initとプロセス再起動

サービス停止時の動作の設定•Service セクションの Restart の設定値により

サービス停止時の動作を指定できる。設定値 サービス停止時の動作

no 再起動しない。(デフォルト)

on-success 正常終了したときのみ再起動する。すなわち、終了コード 0 の場合。

on-failure 正常終了しなかったときのみ再起動する。終了コードが 0 以外、あるいはシグナルによる終了。

on-abort キャッチしていないシグナルの受信により終了したときのみ再起動する。

always 正常終了や異常終了やシグナルによる終了をしたとき再起動する。

Page 27: initとプロセス再起動

サービス停止時の自動再起動の設定

•Service セクションに Restart=always を追加▫[Service]EnvironmentFile=/etc/sysconfig/sshdExecStartPre=/usr/sbin/sshd-keygenExecStart=/usr/sbin/sshd -D $OPTIONSExecReload=/bin/kill -HUP $MAINPIDRestart=always

Page 28: initとプロセス再起動

設定の反映•systemctl コマンドにより設定を反映させる▫systemctl --system daemon-reload

Page 29: initとプロセス再起動

デモ•sshd のプロセスを kill してみよう