起動スクリプト

概要

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

ランレベル

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


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

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

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

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

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

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



ディレクト

  • /etc/init.d/ -> rc.d/init.d
  • /etc/rc.d/ 全部ここみてる
    • init.d 起動スクリプトの本体がある
    • rc      起動スクリプト
    • rc0-6.d   各runlevelのスクリプトは/etc/rc.d/init.dみてる
    • rc.local  全てのrunlevelの共通処理
    • rc.sysinit 下記参照
  • /etc/rc.[0-6].d/ -> rc.d/rc[0-6].d
  • /etc/rc.sysinit -> rc.d/rc.sysinit
  • /etc/rc -> rc.d/rc
  • /etc/rc.local -> rc.d/rc.local

/etc/rc.sysinit

/etc/rc.sysinit はシステム起動時にすべてのランレベルで一度だけ実行されるスクリプトで、環境変数 PATH の初期設定、ネットワークの初期化、ホスト名の設定、システムクロックの設定、keymap の読み込み、システムフォントの読み込みなど、システムの基本的な環境設定を行います。また、/proc ファイルシステムのマウント、スワップの有効化、ファイルシステムのチェックとマウントなど、ファイルシステムに関する初期化処理等も行います。さらに、クォータ、RAID 、LVM の設定等が行われている場合には、これらの機能も有効化します。

まとめ

/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

「runlevel」のイベント契機で発動するジョブ

$ 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