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

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




私は誰
• 氏名: 滝澤 隆史 @ttkzw
• 所属: 株式会社ハートビーツ
• 何やっている人
 ▫ メーラMuttの国際化や日本語対応パッチ作者
 ▫ SpamAssassinの日本語対応パッチ作者
 ▫ Unbound/NSDの文書の翻訳
アジェンダ
• Linuxディストリビューションにおけるinitと起
  動・停止の制御および自動再起動について
• 対象
 ▫ SysV init
 ▫ Upstart
 ▫ systemd
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                                     inittabの形式
                                       ID:ランレベル:アクション:プロセス
• /sbin/initが起動
• /etc/inittabを読む。         /etc/inittab
                          id:3:initdefault:
• sysinitに定義したプロセスを実行
 ▫ rc.sysinitスクリプトを実行     si::sysinit:/etc/rc.d/rc.sysinit

• initdefaultに定義したランレベル   l0:0:wait:/etc/rc.d/rc 0
  に切り替え                   l1:1:wait:/etc/rc.d/rc 1
                          l2:2:wait:/etc/rc.d/rc 2
• ランレベル毎のwaitに定義したプ       l3:3:wait:/etc/rc.d/rc 3
  ロセスを実行。                 l4:4:wait:/etc/rc.d/rc 4
                          l5:5:wait:/etc/rc.d/rc 5
 ▫ rcスクリプトを実行。            l6:6:wait:/etc/rc.d/rc 6
• respawnに定義したプロセスを実
                          1:2345:respawn:/sbin/mingetty tty1
  行                       2:2345:respawn:/sbin/mingetty tty2
 ▫ mingetty(端末)あるいは       3:2345:respawn:/sbin/mingetty tty3
                          4:2345:respawn:/sbin/mingetty tty4
   prefdm(                5:2345:respawn:/sbin/mingetty tty5
   ジャ)を起動。                x:5:respawn:/etc/X11/prefdm -nodaemon
 ▫ プロセスが終了したら再起動
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によるサービスの起動
• 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]
respawn
respawn limit 10 5
umask 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/sshd
end script
# if you used to set SSHD_OPTS in /etc/default/ssh, you can change the
# 'exec' line here instead
exec /usr/sbin/sshd -DA
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/sshd
   ExecStartPre=/usr/sbin/sshd-keygen
   ExecStart=/usr/sbin/sshd -D $OPTIONS
   ExecReload=/bin/kill -HUP $MAINPID
   Restart=always
設定の反映
• systemctlコマンドにより設定を反映させる
 ▫ systemctl --system daemon-reload
デモ
• sshdのプロセスをkillしてみよう

initとプロセス再起動