initとプロセス再起動
-
Upload
takashi-takizawa -
Category
Documents
-
view
27.845 -
download
0
Transcript of initとプロセス再起動
2012-07-18 # 監視ツール勉強会 02
init とプロセス再起動株式会社ハートビーツ 滝澤隆史
私は誰•氏名 : 滝澤 隆史 @ttkzw•所属 : 株式会社ハートビーツ•何やっている人▫メーラ Mutt の国際化や日本語対応パッチ作者▫SpamAssassin の日本語対応パッチ作者▫Unbound/NSD の文書の翻訳
2
アジェンダ•Linux ディストリビューションにおける init と
起動・停止の制御および自動再起動について•対象▫SysV init▫Upstart▫systemd
Linux における 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
SysV 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
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
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
意図しないサービス停止•サービスの不具合や OOM Killer など、意図せ
ずサービスが停止することがある• /etc/inittab での設定によりサービス停止後の
動作を指定できる。
自動再起動の設定•設定ファイル▫/etc/inittab
• respawn アクションの記述▫ID: ランレベル :respawn: サービスの起動コマン
ド•例) Monit▫mo:2345:respawn:/usr/sbin/monit -Ic
/etc/monitrc•設定の反映▫telinit q
サービス監視ツールの併用• respawn の問題点▫サービスによってはうまく制御できないことが
ある。▫停止させることができない。
•daemontools や monit などサービス監視系のツールを inittab に登録し、自動再起動させたいサービスをその制御下に置くとよい
Upstart
Upstart によるサービスの起動• initctl コマンドによりサービスを起動▫initctl start サービス名
•start コマンドは initctl のシンボリックリンク▫start サービス名
•後方互換のために service コマンドも使える▫service サービス名 start
•例) sshd の場合▫initctl start ssh▫start ssh▫service ssh start
Upstart によるサービスの停止• initctl コマンドによりサービスを停止▫initctl stop サービス名
•stop コマンドは initctl のシンボリックリンク▫stop サービス名
•後方互換のために service コマンドも使える▫service サービス名 stop
•例) sshd の場合▫initctl stop ssh▫stop ssh▫service ssh stop
Upstart の制御外でサービス停止•サービスの不具合や OOM Killer な
ど、 Upstart の制御外でサービスが停止することがある
•Upstart の設定によりサービス停止後の動作を指定できる。
サービス毎の設定ファイル•サービス毎の設定ファイル▫/etc/init/XXX.conf
•例) sshd に対する設定ファイル▫/etc/init/ssh.conf
異常終了時の動作•設定ファイルに respawn と記述することによ
り異常終了時にサービスを自動再起動させることができる。
/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
systemd
systemd とは•Linux 用のシステムおよびサービスのための管
理デーモン•SysV init / LSB init と互換性あり
systemd によるサービスの起動•systemctl コマンドにより起動する▫systemctl start サービス名 .service
•後方互換のために service コマンドも使える▫service サービス名 start
•例) sshd の場合▫systemctl start sshd.service▫service sshd start
systemd によるサービスの停止•systemctl コマンドにより停止する▫systemctl stop サービス名 .service
•後方互換のために service コマンドも使える▫service サービス名 stop
•例) sshd の場合▫systemctl stop sshd.service▫service stop start
systemd の制御外でサービス停止•サービスの不具合や OOM Killer な
ど、 systemd の制御外でサービスが停止することがある
•systemd の設定によりサービス停止後の動作を指定できる。
サービス毎の設定ファイル•サービス毎の設定ファイル▫/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
サービス停止時の動作の設定•Service セクションの Restart の設定値により
サービス停止時の動作を指定できる。設定値 サービス停止時の動作
no 再起動しない。(デフォルト)
on-success 正常終了したときのみ再起動する。すなわち、終了コード 0 の場合。
on-failure 正常終了しなかったときのみ再起動する。終了コードが 0 以外、あるいはシグナルによる終了。
on-abort キャッチしていないシグナルの受信により終了したときのみ再起動する。
always 正常終了や異常終了やシグナルによる終了をしたとき再起動する。
サービス停止時の自動再起動の設定
•Service セクションに Restart=always を追加▫[Service]EnvironmentFile=/etc/sysconfig/sshdExecStartPre=/usr/sbin/sshd-keygenExecStart=/usr/sbin/sshd -D $OPTIONSExecReload=/bin/kill -HUP $MAINPIDRestart=always
設定の反映•systemctl コマンドにより設定を反映させる▫systemctl --system daemon-reload
デモ•sshd のプロセスを kill してみよう