UNIX システムがブートされると、init が呼び出されます。 init は、/etc/inittab の initdefault エントリの有無を調べます。 存在する場合は、実行レベルとして、そのエントリで指定される実行レベルを使います。 存在しない場合は、仮想システム・コンソールから実行レベルに入ります。
init は、8つの実行レベル、 つまり0から6およびSまたはsのうちの1つをとります。 この実行レベルは、特権ユーザが /sbin/init を実行したとき変わります。 実行レベル0,5,6は、システムをシャットダウンするためのもの、 2,3,4はマルチ・ユーザの運転状態のものです。
各実行レベルでの処理は、/etc/rc{実行レベル}.d に格納されているスクリプトを実行することで処理されます。 実行順序はソート順です。すなわち スクリプトの名前の先頭が K で始まっているものが先に実行されますが、 これらはプロセスを強制終了します。 次に S で始まるものが実行され、これらはプロセスを起動します。
init は、/etc/inittab にある各プロセスを生成し、 自分が生み出したプロセスの終了シグナルを受け取ると、それを記録します。
![]() |
![]() |
レベル | 状 態 | 説 明 |
---|---|---|
0 | 電源切断 | 電源を切れるようにマシンをシャットダウンします |
1 | システム管理 | システム管理者モードにします。すべてのファイル・システムはマウントされ、 アクセス可能ですが、ユーザはログインしていません |
2 | マルチ・ユーザ | システムはマルチ・ユーザ・モードですが、NFS は使用できません。 |
3 | NFS 資源共用 マルチ・ユーザ |
遠隔ファイル共用プロセスとデーモンを起動し、遠隔資源をマウントします。 |
4 | マルチ・ユーザ | 代替マルチ・ユーザ環境構成を定義するのに使用されますが、 通常は使用されません |
5 | 電源切断 | システムを停止し、ファームウェアのモニタに移行します |
6 | 再ブート | システムを停止し、inittab の initdefault エントリで定義される状態に再ブートします |
S,s | シングル・ユーザ | シングル・ユーザ・モードに入り、 必須カーネル・プロセスだけ実行されます |
![]() |
![]() |
init デーモンが起動するプロセスを知るためのファイルで、 inittab ファイル内の各エントリは次の4つのフィールドから構成され、 それらの意味は以下のとおりです。
フィールド | 説 明 |
---|---|
id | エントリの識別子 |
rstate | 実行レベルで実行されるコマンドやスクリプトに対応します。 0/1/2/3/4/5/6/S の 8 です。 |
action | process フィールドに指定するプロセスの実行方法 |
process | 実行するプロセスの名前 |
action はブート init に process
フィールドで指定されたプロセスをどのように扱うかを示します。
以下のアクションを指定できます。
action | 説 明 |
---|---|
boot | ブート init の inittab ファイルの読み込み時のみエントリを処理します。 ブート init は、そのプロセスを開始し、終了を待たず、 プロセスが死んだときも、再起動はしません。 この手順を意味のあるものにするためには rstate を、 デフォルトの実行レベルかブート init のブート時の実行レベルにしなければなりません。 このアクションは、システムのハードウェアリブートの後に行う初期化に便利です。 |
bootwait | ブート init がブートされて、inittab を初めて読むときだけ処理されます。 ブート init はプロセスを起動しその終了を待ちます。 プロセスが死んでも再起動しません。 |
initdefault | ブート init が最初に実行されるときだけ走査されます。 ブート init は、このエントリが存在した場合に、 実行レベルの初期値をこのエントリを使って決めます。 このエントリの rstate フィールドに指定された実行レベルのうち、 最も高いレベルが初期状態として選ばれます。 rstate フィールドに何もなかった場合は、ブート init の実行レベルは 6 になります。 initdefault のエントリでは、ブート init がシングルユーザ状態で起動するようにはできません。 さらに、ブート init が initdefault のエントリを inittab の中に見つけられないときは、 ブート時にユーザに対して実行レベルの初期値を要求します。 |
off | このエントリに対応するプロセスが、現在実行中ならば警告シグナル (SIGTERM) が送られ、20秒後に消去シグナル (SIGKILL) が送られて終了させます。 プロセスが動いていなければ何もしません。 |
once | ブート init がエントリの rstate にマッチする実行レベルに入るとき、 プロセスを開始しその終了を待ちません。 終了するとき、そのプロセスを再起動しません。 ブート init が新しい実行レベルに入るが、 前のレベルで実行されているプロセスがある場合はそのプロセスは再起動されません。 |
ondemand | この命令は、respawn と同じ意味を持ちます。 機能的には、respawn とまったく同一のものですが、 実行レベルとの関連の違いをつけるために違うキーワードが付けられています。 このアクションは、rstate フィールドが a, b, c のどれかの場合のみ使われます。 |
powerfail | このエントリに対応するプロセスは、ブート init が電源異常シグナル (SIGPWR IR signal (5) 参照)を受け取ったときにだけ実行されます。 |
powerwait | このエントリに対応するプロセスは、ブート init が電源異常シグナル (SIGPWR) を受け取ったときだけ実行され、inittab の処理の終了を待ちます。 |
respawn | プロセスが存在しない場合、そのプロセスを開始しますが終了を待ちません (inittab ファイルの走査を続けます)。 終了したときには、プロセスを再起動します。 プロセスが存在する場合は、何もせずに inittab ファイルの走査を続行します。 |
sysinit | ブート init が、コンソールにアクセスを試みる前に実行されます。 これはブート init が実行レベルの情報を入手しようとするデバイスの初期化に のみ使用されることを意図したものです。 これらを実行し、その終了を待ってから実行を継続します。 |
wait | ブート init がエントリの rstate にマッチュするレベルになった場合、 そのプロセスを開始し、その終了を待ちます。 ブート init が同じ実行レベルにある間に、再度 inittab が読まれた場合には、 ブート init は、これを無視します。 |
![]() |
![]() |
ブートとシャットダウンは OS による違いがありますので、 主な違いを以下の表にまとめました。
N は実行レベルで 0/1/2/3/4/5/6/S のいずれかです。
項目 | solaris | HP-UX | Linux |
---|---|---|---|
自動起動スクリプト | /sbin/rcN | /sbin/rc /sbin/rc.utils |
/etc/rc.d/rcN.d |
自動起動用ファイル格納先 | /etc/init.d /etc/rcN.d |
/sbin/init.d /sbin/rcN.d |
/etc/init.d |
メッセージ出力先 | /dev/console | /etc/rc.log | /var/log/boot.log(.N) /var/log/messages(.N) /var/run/utmp /var/log/wtmp (binary) |
スクリプトの PATH | /usr/sbin:/usr/bin | /sbin | /usr/local/sbin:/sbin:/bin:/usr/sbin:/usr/bin |
![]() |
![]() |
現在のランレベルは、以下のコマンドで知ることができます。
who -r
/etc/inittab | init で起動するプロセスの情報が格納されている |
/etc/init.d | 通常 /etc/rcN.d に追加する場合は、 実体はここにいれてシンボリックリンクする |
/sbin/rcS,/etc/rcS.d/* | ブート処理 |
/sbin/rc2,/etc/rc2.d/* /sbin/rc3,/etc/rc3.d/* |
マルチ・ユーザ初期化処理 |
ここで、/sbin/rc{実行レベル} は、 /etc/rc{実行レベル}.d ディレクトリにあるスクリプト・ファイルを実行するスクリプトで、 以下の手順で実行します。
以下は、SunOS 5.5.1 の inittab です。
id r action process --+-+------+----------------------------------------------------- ap::sysinit:/sbin/autopush -f /etc/iu.ap fs::sysinit:/sbin/rcS >/dev/console 2>&1 </dev/console is:3:initdefault: p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/console 2>&1 s0:0:wait:/sbin/rc0 >/dev/console 2>&1 </dev/console s1:1:wait:/usr/sbin/shutdown -y -iS -g0 >/dev/console 2>&1 </dev/console s2:23:wait:/sbin/rc2 >/dev/console 2>&1 </dev/console s3:3:wait:/sbin/rc3 >/dev/console 2>&1 </dev/console s5:5:wait:/sbin/rc5 >/dev/console 2>&1 </dev/console s6:6:wait:/sbin/rc6 >/dev/console 2>&1 </dev/console fw:0:wait:/sbin/uadmin 2 0 >/dev/console 2>&1 </dev/console of:5:wait:/sbin/uadmin 2 6 >/dev/console 2>&1 </dev/console rb:6:wait:/sbin/uadmin 2 1 >/dev/console 2>&1 </dev/console sc:234:respawn:/usr/lib/saf/sac -t 300 co:234:respawn:/usr/lib/saf/ttymon -g -h -p "`uname -n` console login: " -T sun -d /dev/console -l console -m ldterm,ttcompat
各 id の概要は、以下の通りです。
id | 説 明 |
---|---|
ap | STREAMS モジュールの初期化 |
fc | ファイル・システムのチェック |
is | デフォルトのランレベル |
ps | power fail shutdown |
s0 | ランレベル 0 |
s1 | ランレベル 1 |
s2 | ランレベル 2 |
s3 | ランレベル 3 |
s5 | ランレベル 5 |
s6 | ランレベル 6 |
of | off |
fw | Firmware |
RB | リブート |
rb | リブート single user |
sc | service access controller 初期化 |
co | console 初期化 |
それぞれのステージで /sbin/rc{実行レベル} のスクリプトを実行します。
実行制御スクリプト (rc) を使用して実行レベルの移行を制御します。
各実行レベルには、/etc/rc{実行レベル}.d が対応しており、
その中にはさまざまな処理をするスクリプトがあります。
たとえば、SunOS 5.5.1 の /etc/rc0.d には以下のスクリプトがあります。
./ K39oes@ K55syslog* K70cron* ../ K42audit* K57sendmail* K75nfs.client* K00ANNOUNCE* K47asppp* K66nfs.server* K76nscd* K20lp* K50utmpd* K69autofs* K85rpc*
たとえば、SunOS 5.5.1 の /etc/rc2.d には以下のスクリプトがあります。
./ S30sysid.net* S74autofs* S89bdconfig@ ../ S47asppp* S74syslog* S90loc.ja.cssd* K20lp* S69inet* S75cron* S90loc.ja.kmod* K60nfs.server* S70uucp* S76nscd* S91leoconfig* README S71rpc* S80PRESERVE* S92rtvc-config* S01MOUNTFSYS* S71sysid.sys* S80lp* S92volmgt* S05RMTMPFILES* S72autoinstall* S85lmgrd* S93cacheos.finish* S20sysetup* S72inetsvc* S88sendmail* S99audit* S21perf* S73nfs.client* S88utmpd* S99oes@
/etc/rcN.d 内のスクリプトは常に ASCII
文字列としてソートした順に実行されます。
スクリプト名の形式は次のとおりです(正規表現)。
[K,S][0-9][0-9][A-Za-z\-]+
名前が K で始まるスクリプトを実行すると、プロセスを終了 (kill) します。従って、新たに追加する場合は、引数に start と stop を処理できるスクリプトを /etc/init.d に入れ、 rc2.d に S99XXXXX を rc0.d に K00XXX としてそれをシンボリックリンクします。
■ 確認方法# /etc/rc2.d/S99XXXXX start # /etc/rc0.d/K00XXXXX stop
■ 例 : Apache Web Server
#!/bin/sh # Startup script for the Apache Web Server # See how we were called. case "$1" in start) echo -n "Starting Apache" /usr/local/apache/bin/apachectl start ;; stop) echo -n "Shutting down Apache" /usr/local/apache/bin/apachectl stop ;; status) echo -n "Status" /usr/local/apache/bin/apachectl status ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
/etc/inittab | init で起動するプロセスの情報が格納されている |
/etc/init.d | 通常 rcN.d に追加する場合、 実体はここにいれてシンボリックリンクする |
/sbin/rc0,/etc/rc0.d/* | シャットダウン処理 |
/sbin/rc5,/etc/rc5.d/* | シャットダウン処理 |
/sbin/rc6,/etc/rc6.d/* | リブート処理 |
![]() |
![]() |
/etc/inittab | init で起動するプロセスの情報が格納されている |
/sbin/init.d | 通常 /sbin/rcN.d に追加する場合は、 実体はここにいれてシンボリックリンクする |
/sbin/rc,/sbin/rcS.d/* | ブート処理 |
/sbin/rc,/sbin/rc2.d/* /sbin/rc,/sbin/rc3.d/* |
マルチ・ユーザ初期化処理 |
ここで、/sbin/rc は、 /sbin/rc{実行レベル}.d ディレクトリにあるスクリプト・ファイルを実行するスクリプトで、 以下の手順で実行します。
以下は、HP-UX B.11.00 U 9000/800 の inittab です。 それぞれのステージで /sbin/rc のスクリプトを実行します。
id r action process ----+-+------+----------------------------------------------------- init:3:initdefault: ioin::sysinit:/sbin/ioinitrc >/dev/console 2>&1 tape::sysinit:/sbin/mtinit > /dev/console 2>&1 muxi::sysinit:/sbin/dasetup /dev/console 2>&1 # mux init stty::sysinit:/sbin/stty 9600 clocal icanon echo opost onlcr ixon icrnl ignpar < /dev/systty brc1::bootwait:/sbin/bcheckrc /dev/console 2>&1 # fsck, etc. link::wait:/sbin/sh -c "/sbin/rm -f /dev/syscon; \ /sbin/ln /dev/systty /dev/syscon" >/dev/console 2>&1 cprt::bootwait:/sbin/cat /etc/copyright >/dev/syscon # legal req sqnc::wait:/sbin/rc /dev/console 2>&1 # system init #powf::powerwait:/sbin/powerfail >/dev/console 2>&1 # powerfail cons:123456:respawn:/usr/sbin/getty console console # system console #ttp1:234:respawn:/usr/sbin/getty -h tty0p1 9600 #ttp2:234:respawn:/usr/sbin/getty -h tty0p2 9600 #ttp3:234:respawn:/usr/sbin/getty -h tty0p3 9600 #ttp4:234:respawn:/usr/sbin/getty -h tty0p4 9600 #ttp5:234:respawn:/usr/sbin/getty -h tty0p5 9600 ems1::bootwait:/sbin/rm -f /etc/opt/resmon/persistence/runlevel4_flag ems2::bootwait:/sbin/cat /etc/opt/resmon/persistence/reboot_flag ems3:3456:wait:/usr/bin/touch /etc/opt/resmon/persistence/runlevel4_flag ems4:3456:respawn:/etc/opt/resmon/lbin/p_client #ups::respawn:rtprio 0 /usr/lbin/ups_mond -f /etc/ups_conf
たとえば、HP-UX B.11.00 U 9000/800 の /sbin/rc0.d には以下のスクリプトがあります。
./ K10dbora@ K888kminit@ ../ K480syncer@ K890kmbuild@ K10apache@ K800killall@ K900localmount@
たとえば、HP-UX B.11.00 U 9000/800 の /sbin/rc3.d には以下のスクリプトがあります。
./ S100nfs.server@ S990dtlogin.rc@ ../ S200tps.rc@ S99dbora@
/sbin/rcN.d 内のスクリプトは常に ASCII
文字列としてソートした順に実行されます。
スクリプト名の形式は次のとおりです(正規表現)。
[K,S][0-9][0-9][A-Za-z\-]+
名前が K で始まるスクリプトを実行すると、プロセスを終了 (kill) します。従って、新たに追加する場合は、引数に start_msg/start と stop_msg/stop を処理できるスクリプトを /sbin/init.d に入れ、 rc3.d に S99XXXXX を rc0.d に K00XXX としてそれをシンボリックリンクします。
■ 確認方法# /sbin/rc3.d/S99XXXXX start # /sbin/rc0.d/K00XXXXX stop
■ 例 : oracle の自動起動
oracle インストールマニュアルにあるものは、正しく動作しません。 修正部分は緑字で示します。
HP-UX の場合は、start_msg/stop_msg の引数を処理する部分があると、 start/stop に先立って実行されます。 通常実行文は、メッセージ出力で、start_msg はログに、stop_msg はシャットダウンを行った端末に出力されます。
#!/bin/sh # Set ORA_HOME to be equivalent to the $ORACLE_HOME # from which you wish to execute dbstart and dbshut; # # Set ORA_OWNER to the user id of the owner of the # Oracle database in ORA_HOME. LANG=C;export LANG PATH=/bin:/usr/bin:${PATH} ORA_HOME=/home7/asg920/app/oracle/product/9.2.0 ORA_OWNER=asg920 if [ ! -f $ORA_HOME/bin/dbstart ] then echo "Oracle startup: cannot start" exit 1 fi case "$1" in start) # Start the Oracle databases: # The following command assumes that the oracle login # will not prompt the user for any values su - $ORA_OWNER -c "$ORA_HOME/bin/dbstart" ;; stop) # Stop the Oracle databases: # The following command assumes that the oracle login # will not prompt the user for any values su - $ORA_OWNER -c "$ORA_HOME/bin/dbshut" ;; start_msg) echo "Start oracle $ORA_OWNER" ;; stop_msg) echo "Shutdown oracle $ORA_OWNER" ;; esac exit 0
/etc/inittab | init で起動するプロセスの情報が格納されている |
/sbin/init.d | 通常 rcN.d に追加する場合、 実体はここにいれてシンボリックリンクする |
/sbin/rc,/sbin/rc0.d/* | シャットダウン処理 |
/sbin/rc,/sbin/rc5.d/* | シャットダウン処理 |
/sbin/rc,/sbin/rc6.d/* | リブート処理 |
![]() |
![]() |
/etc/inittab | init で起動するプロセスの情報が格納されている |
/etc/init.d | 通常 rcN.d に追加する場合は、 実体はここにいれてシンボリックリンクする |
/etc/rc,/etc/rcS.d/* | ブート処理 |
/etc/rc,/etc/rc2.d/* /etc/rc,/etc/rc3.d/* |
マルチ・ユーザ初期化処理 |
ここで、/etc/rc は、 /etc/rc{実行レベル}.d ディレクトリにあるスクリプト・ファイルを、 以下の手順で実行します。
以下は、Linux 2.4.7-2.24ml の inittab です。 それぞれのステージで /etc/rc のスクリプトを実行します。
id r action process --+-+------+----------------------------------------------------- id:5:initdefault: # System initialization. si::sysinit:/etc/rc.d/rc.sysinit l0:0:wait:/etc/rc.d/rc 0 l1:1:wait:/etc/rc.d/rc 1 l2:2:wait:/etc/rc.d/rc 2 l3:3:wait:/etc/rc.d/rc 3 l4:4:wait:/etc/rc.d/rc 4 l5:5:wait:/etc/rc.d/rc 5 l6:6:wait:/etc/rc.d/rc 6 # Things to run in every runlevel. ud::once:/sbin/update pf::powerfail:/sbin/shutdown -f -h +2 "Power Failure; System Shutting Down" # If power was restored before the shutdown kicked in, cancel it. pr:12345:powerokwait:/sbin/shutdown -c "Power Restored; Shutdown Cancelled" # Run gettys in standard runlevels 1:2345:respawn:/sbin/mingetty --noclear tty1 2:2345:respawn:/sbin/mingetty tty2 3:2345:respawn:/sbin/mingetty tty3 4:2345:respawn:/sbin/mingetty tty4 5:2345:respawn:/sbin/mingetty tty5 6:2345:respawn:/sbin/mingetty tty6 # xdm is now a separate service x:5:respawn:/etc/X11/prefdm -nodaemon
実行制御スクリプト (rc) を使用して実行レベルの移行を制御します。
各実行レベルには、/etc/rc{実行レベル}.d が対応しており、
その中にはさまざまな処理をするスクリプトがあります。
たとえば、Linux 2.4.7-2.24ml の /etc/rc0.d には以下のスクリプトがあります。
./ K05keytable* K25sshd* K75netfs* K92ipchains* K98kparam* ../ K10apache* K50xinetd* K80random* K92iptables* S00killall* K00webmin* K10dbora* K60crond* K88syslog* K95kudzu* S01halt* K05atd* K10xfs* K74nscd* K90network* K95reconfig*
たとえば、Linux 2.4.7-2.24ml の /etc/rc3.d には以下のスクリプトがあります。
./ K74nscd* S08ipchains* S17keytable* S56xinetd* S98webmin* ../ S02kparam* S08iptables* S20random* S90crond* S99apache* K10dbora* S05kudzu* S10network* S25netfs* S90xfs* S99local* K10webmin* S06reconfig* S12syslog* S55sshd* S95atd*
/etc/rcN.d 内のスクリプトは常に ASCII
文字列としてソートした順に実行されます。
スクリプト名の形式は次のとおりです(正規表現)。
[K,S][0-9][0-9][A-Za-z\-]+
名前が K で始まるスクリプトを実行すると、プロセスを終了 (kill) します。従って、新たに追加する場合は、引数に start と stop を処理できるスクリプトを /etc/init.d に入れ、 rc2.d に S99XXXXX を rc0.d に K00XXX としてそれをシンボリックリンクします。
■ 確認方法# /etc/rc2.d/S99XXXXX start # /etc/rc0.d/K00XXXXX stop
■ 例 : Apache Web Server
#!/bin/sh # Startup script for the Apache Web Server # See how we were called. case "$1" in start) echo -n "Starting Apache" /usr/local/apache/bin/apachectl start ;; stop) echo -n "Shutting down Apache" /usr/local/apache/bin/apachectl stop ;; status) echo -n "Status" /usr/local/apache/bin/apachectl status ;; restart) $0 stop $0 start ;; *) echo "Usage: $0 {start|stop|restart|status}" exit 1 esac exit 0
/etc/inittab | init で起動するプロセスの情報が格納されている |
/etc/init.d | 通常 rcN.d に追加する場合、 実体はここにいれてシンボリックリンクする |
/etc/rc,/etc/rc0.d/* | シャットダウン処理 |
/etc/rc,/etc/rc5.d/* | シャットダウン処理 |
/etc/rc,/etc/rc6.d/* | リブート処理 |
![]() |
![]() |
# shutdown -rs # shutdown
![]() |
![]() |
PATH=/sbin export PATH
また、バックグランドでの起動もできません。
![]() |
![]() |