起動スクリプト

概要

centOSの起動スクリプトについてのメモ。

ランレベル

ランレベル 0 : 稼働中のすべてのデーモンに停止命令を送り、電源を切ります( マザーボード が自動電源オフに対応していない場合は、最後に PowerOff などのメッセージが出るだけになります。)。つまり poweroff などのシステム終了 コマンド と同じ振る舞いをするランレベルです。


ランレベル 1 : WindowsOSのセーフモードに相当します。 root アカウント のみが ログイン 可能で、システムの動作に必要最低限のデーモンのみが起動し、ネットワーク環境などは使用できません。利用目的はWindowsOSのセーフモードと同じく、主に起動プロセスの修復になります。またこのモードではログインにパスワードを必要としませんから、何らかの理由でrootのパスワードが分からなくなってしまったときに利用できます。

ランレベル 2 : 後述のランレベル3からネットワークに関するデーモンのみを起動しないモードです。あまり利用することはないでしょう。

ランレベル 3 : CUI 画面で起動するモードです。 サーバー として稼動させるときは通常このモードを使うことになります。

ランレベル 4 : 予備のモードです。使われていません。

ランレベル 5 : GUI 画面で起動するモードです。 クライアント として稼動させるときは通常このモードを使うことになります。

ランレベル 6 : 稼働中のすべてのデーモンに停止命令を送り、システムを再起動します。つまり reboot などの再起動 コマンド と同じ振る舞いをするランレベルです。



ディレクト

/etc/init.d -> /etc/rc.d/init.d みてる

ll /etc/init.d
lrwxrwxrwx. 1 root root 11 Sep 28 14:02 /etc/init.d -> rc.d/init.d

/etc/rc -> /etc/rc.d/rc みてる

ll /etc/rc*
lrwxrwxrwx.  1 root root    7 Sep 29 02:17 /etc/rc -> rc.d/rc
lrwxrwxrwx.  1 root root   10 Sep 29 02:17 /etc/rc0.d -> rc.d/rc0.d
lrwxrwxrwx.  1 root root   10 Sep 29 02:17 /etc/rc1.d -> rc.d/rc1.d
lrwxrwxrwx.  1 root root   10 Sep 29 02:17 /etc/rc2.d -> rc.d/rc2.d
lrwxrwxrwx.  1 root root   10 Sep 29 02:17 /etc/rc3.d -> rc.d/rc3.d
lrwxrwxrwx.  1 root root   10 Sep 29 02:17 /etc/rc4.d -> rc.d/rc4.d
lrwxrwxrwx.  1 root root   10 Sep 29 02:17 /etc/rc5.d -> rc.d/rc5.d
lrwxrwxrwx.  1 root root   10 Sep 29 02:17 /etc/rc6.d -> rc.d/rc6.d
lrwxrwxrwx.  1 root root   13 Sep 29 02:17 /etc/rc.local -> rc.d/rc.local
lrwxrwxrwx.  1 root root   15 Sep 29 02:17 /etc/rc.sysinit -> rc.d/rc.sysinit

/etc/rc.d:
total 60
drwxr-xr-x. 2 root root  4096 May 10 11:21 init.d
-rwxr-xr-x. 1 root root  2617 Mar 23 03:12 rc
drwxr-xr-x. 2 root root  4096 Apr 25 04:26 rc0.d
drwxr-xr-x. 2 root root  4096 Apr 25 04:26 rc1.d
drwxr-xr-x. 2 root root  4096 Apr 25 04:26 rc2.d
drwxr-xr-x. 2 root root  4096 Apr 25 04:26 rc3.d
drwxr-xr-x. 2 root root  4096 Apr 25 04:26 rc4.d
drwxr-xr-x. 2 root root  4096 Apr 25 04:26 rc5.d
drwxr-xr-x. 2 root root  4096 Apr 25 04:26 rc6.d
-rwxr-xr-x. 1 root root   220 Mar 23 03:12 rc.local
-rwxr-xr-x. 1 root root 20199 Mar 23 03:12 rc.sysinit

/etc/rc.d/rc1-6.d/各シェルスクリプト -> /etc/rc.d/init.d/各シェルスクリプトみてる

ll /etc/rc.d/rc6.d/
total 0
lrwxrwxrwx. 1 root root 18 Sep 29 02:20 K01yum-cron -> ../init.d/yum-cron
lrwxrwxrwx. 1 root root 20 Sep 29 02:22 K10munin-node -> ../init.d/munin-node
lrwxrwxrwx. 1 root root 19 Sep 28 14:04 K10saslauthd -> ../init.d/saslauthd
lrwxrwxrwx. 1 root root 22 Jan 13 16:25 K15htcacheclean -> ../init.d/htcacheclean

まとめ

/etc/rc.d以下へまとめられている

serviceコマンド

$ which service
/sbin/service

/sbin/service

SERVICEDIR="/etc/init.d"

Upstart

  • RHEL6から導入
  • inittabからrunlevelを抜き出して、以下実行。

/etc/inittab

id:3:initdefault:

↑これだけの記載。ランレベルを参照されるだけのものになった。

ジョブ

/etc/init以下に用意された.confがジョブと呼ばれる。ジョブ同士でイベントを送り/受け て起動や停止の処理をする

Upstart起動シーケンス

ランレベル3(CUI)の場合

カーネル起動
↓

/sbin/initがstartupイベント発動 

↓
/etc/init/rcS.confジョブが実行。(startupイベントを受信。start on startup の記載があるので)
↓
/etc/init/rcS.confの中で以下を実行
@@@@@@@@@@@@@@@@@@

/etc/rc.d/rc.sysinit実行

exec telinit $runlevel 実行 (runlevelのイベントを発生) 今回だとレベル3

@@@@@@@@@@@@@@@@@@
↓
/etc/init/@@@.confで各ランレベルに対応したジョブが実行
ランレベル3の場合だと/etc/rc.confがだけが該当 下記に中身記載

↓

/etc/init/rc.confの中で
@@@@@@@@@@@@@@@@@@

/etc/rc.d/rc $runlevel

@@@@@@@@@@@@@@@@@@
↓
/etc/rc.d/rcの中で、
/etc/rc[ランレベル].d/Sを順次実行するような処理がある。  sysvinitと同じ。

↓

各デーモンが起動して終わり。

/etc/init/rcS.conf

# rcS - runlevel compatibility
#
# This task runs the old sysv-rc startup scripts.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file rcS.override and put your changes there.

start on startup

stop on runlevel

task

# Note: there can be no previous runlevel here, if we have one it's bad
# information (we enter rc1 not rcS for maintenance).  Run /etc/rc.d/rc
# without information so that it defaults to previous=N runlevel=S.
console output
pre-start script
        for t in $(cat /proc/cmdline); do
                case $t in
                        emergency)
                                start rcS-emergency
                                break
                        ;;
                esac
        done
end script
exec /etc/rc.d/rc.sysinit
post-stop script
        if [ "$UPSTART_EVENTS" = "startup" ]; then
                [ -f /etc/inittab ] && runlevel=$(/bin/awk -F ':' '$3 == "initdefault" && $1 !~ "^#" { print $2 }' /etc/inittab)
                [ -z "$runlevel" ] && runlevel="3"
                for t in $(cat /proc/cmdline); do
                        case $t in
                                -s|single|S|s) runlevel="S" ;;
                                [1-9])       runlevel="$t" ;;
                        esac
                done
                exec telinit $runlevel
        fi
end script

ランレベル3で発動するジョブ

$ grep 'start on runlevel' /etc/init/*
/etc/init/ck-log-system-restart.conf:start on runlevel 6
/etc/init/ck-log-system-stop.conf:start on runlevel 0
/etc/init/kexec-disable.conf:start on runlevel [!S016]
/etc/init/quit-plymouth.conf:start on runlevel S or stopping rc RUNLEVEL=[234]
/etc/init/rc.conf:start on runlevel [0123456]
/etc/init/rcS-sulogin.conf:start on runlevel S
/etc/init/serial.conf:# start on runlevel [23]

/etc/init/rc.conf のみ!!!

/etc/init/rc.conf 見てみる

$ cat /etc/init/rc.conf 
# rc - System V runlevel compatibility
#
# This task runs the old sysv-rc runlevel scripts.  It
# is usually started by the telinit compatibility wrapper.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file rc.override and put your changes there.

start on runlevel [0123456]

stop on runlevel [!$RUNLEVEL]

task

export RUNLEVEL
console output
exec /etc/rc.d/rc $RUNLEVEL

/etc/rc.d/rc[0-6].d/各ファイルが実行される。

このジョブが終わるとジョブ完了イベント発生。

ジョブ定義ファイル

/etc/init/定義ファイル

/etc/init/定義ファイルにジョブ完了イベント契機のジョブが順次起動 ジョブ完了イベント契機のジョブはいくつかあるようなのでここが並列で実行できる。

例 /etc/init/rc.conf

# rc - System V runlevel compatibility
#
# This task runs the old sysv-rc runlevel scripts.  It
# is usually started by the telinit compatibility wrapper.
#
# Do not edit this file directly. If you want to change the behaviour,
# please create a file rc.override and put your changes there.

start on runlevel [0123456]

stop on runlevel [!$RUNLEVEL]

task

export RUNLEVEL
console output
exec /etc/rc.d/rc $RUNLEVEL

まとめ

  • upstatでも/etc/rc.d/rc1-6.d/各シェルスクリプト -> /etc/rc.d/init.d/各シェルスクリプトランレベルシェルスクリプトが実行される。sysvinitと同じもの。
  • Upstartでも前からあるinittabとほぼ同じ起動順番。ただ、ジョブ化することで並列化できて高速化できるみたい。

参考

http://www.obenri.com/_operation/runlevel.html