Linuxの起動と起動スクリプト

ここでは、Linuxの起動と起動スクリプトについて説明する。 RedHat Linuxで起動時に立ち上げるdemonは/etc/rc.d/init.d/ の中に入っているものから選ばれる。 なので、起動スクリプトは このあたりのファイルを参照して作ってやればよい。 今回は、DynamicDNSサービスでIPのアップデート自動で行って くれるデーモンであるez-ipupdateをモデルにして説明して行く。

もどる

起動とRUNレベル

Linuxの起動は以下の手順をふんで起動される。

  1. ブートローダからLinuxカーネルを開始させる。
  2. 初期設定やハードウェア環境チェックを行ったあとinitというプロセス を開始する。
  3. initは/etc/inittabの中身を参照して、システムを起動させる。
  4. /etc/rc.d/rc.sysinitを実行する。
  5. /etc/inittabの情報にしたがって、/etc/rc.d/rcという スクリプトを使っていろんなプロセスを起動させる。

と行った感じなる。/etc/inittabの中に、Runレベルの説明が書いてある。

# Default runlevel. The runlevels used by RHS are:
#   0 - halt (Do NOT set initdefault to this)
#   1 - Single user mode
#   2 - Multiuser, without NFS (The same as 3, if you do not have networking)
#   3 - Full multiuser mode
#   4 - unused
#   5 - X11
#   6 - reboot (Do NOT set initdefault to this)

0はシステムを落すときに使うものである。
1は、シングルユーザモードである。
2はNFSマウントなしのマルチユーザモード、
3がフルサポートのマルチユーザモードで、
5がXからの立ち上げとなる。
6は、再起動時に用いられる。
通常の立ち上げ時には、3か、5のどちらかになっているはず。

これに従って作られているのが、/etc/rc.d/rc$runlevel.d ディレクトリである。 /etc/rc.d/rcというスクリプトが、対応するrunlevelのディレクトリ中の 起動スクリプトを実行する。

/etc/rc.d/rc$runlevel.dの中には、 KではじまるものとSではじまるものが入っている。
Kではじまるものが止めるプロセスで、引数stopをつけて 実行される。
Sではじまるものがスタートさせるプロセスで、 引数startを付けて実行される。

起動スクリプトをつくる。

/etc/rc.d/init.dの下に起動スクリプトをつくる。 他の起動スクリプトを参照して作ったのが以下のスクリプトである。

#!/bin/bash
#
# Version: 0.1
#
# chkconfig: 345 99 01
# description: Runs the autoupdate daemon that update DynamicDNS IP address
# processname: /usr/local/bin/ez-ipupdate
# config: /etc/ipupdate.conf

# We require the /etc/delegeted.conf file, but supply it in the package, so it
# should always be there.
progname=ez-ipupdate
lockfile=/var/lock/subsys/ipupdate
prog=/usr/local/bin/ez-ipupdate
conffile=/etc/ipupdate.conf
[ -f $conffile ] || exit $?

# Source function library.
. /etc/init.d/functions

RETVAL=0

start() {
	echo -n $"Starting $progname: "
	daemon $prog -c $conffile
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && touch $lockfile
	return $RETVAL
}

stop() {
	echo -n $"Stopping $progname: "
	killproc $prog
	RETVAL=$?
	echo
	[ $RETVAL = 0 ] && rm -f $lockfile
	return $RETVAL
}

# See how we were called.
case "$1" in
  start)
        start
	;;
  stop)
        stop
	;;
  status)
	status $prog
	RETVAL=$?
	;;
  restart)
	stop
	start
	;;
  condrestart)
        if [ -f $lockfile ]; then
	    stop
	    start
	fi
	;;
  reload)
	action $"Reloading $progname:" killall -HUP $prog
	;;
  *)
 	echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
	exit 1
esac

exit $RETVAL

上から順番に説明して行くと、

# chkconfig: 345 99 01

chkconfigやlinuxconfで自動でいろいろ見てもらうための設定。
最初の数字がデフォルトのRUNレベルの設定でRUNレベル3,4,5の がデフォルトになる事を示す。
2番目の数字がstart時のpriorityで99までの数字でしめす。 (100以上の数字も使えるのか試したことはない。)
3番目の数字がstop時のpriorityで00からの数字で示す。 100からstartの数字を引いて書いておけば、スタート時と 逆の順番でstopされていく事になる。

# description: Runs the autoupdate daemon that autoupdate DynamicDNS's IP address
# processname: /usr/loca/bin/ez-ipupdate
# config: /etc/ipupdate.conf

linuxconfに情報を伝えるもの。config:で示されたファイルが 更新されたら、linuxconfは、このプロセスを再起動しようとする。

progname=ez-ipupdate
lockfile=/var/lock/subsys/ipupdate
prog=/usr/local/bin/ez-ipupdate
conffile=/etc/ipupdate.conf

ファイルの名前や、conifgファイルの名前をlockファイルの名前を 定義する。

# Source function library.
. /etc/init.d/functions

用意してあるfunctionライブラリ(daemon,killproc,status等)を includeする。

	daemon $prog -c $conffile

$progを -c $conffileの引数で起動する。
daemonファンクションは、後ろにそのまま、起動したいプロセス と引数を書けばよい。

このあたりを設定すれば、ほとんど動くでしょう。

linuxconfやchkconfigで起動を有効にする。

linuxconfやchkconfigで以上の設定を確認できる。 また、どのレベルで立ち上げるかを決めることができる。

まずは、chkconfig --listでちゃんと入っているかどうか 確認してみる。

# chkconfig --list ipupdate
ipupdate        0:off   1:off   2:off   3:off   4:off   5:off    6:off

自分のいれた起動スクリプトの名前がちゃんと表示されればOKである。

chkconfigでスタート時に起動するようにいれるためには、
--addオプションを使えばよい。
起動しないようにするには、--delを使えばいい。

# chkconfig --add ipupdate
# chkconfig --list ipupdate
ipupdate        0:off   1:off   2:off   3:on    4:on    5:on    6:off

# chkconfig --del ipupdate
# chkconfig --list ipupdate
ipupdate        0:off   1:off   2:off   3:off   4:off   5:off   6:off
	

linuxconfでも起動の設定をすることができる。
Control->Control panel->Control service activity
を選択する。

そこに自分の追加した項目(ipupdate)があるはずである。それを選択する。

それを選択すると、立ち上げなどの設定ができる。

Descriptionは起動スクリプトのdescription:の項目に書いてあるものが 表示される。

両方のツールが無い人は、 /etc/rc.d/rc$runlevel.d/の下にあるlinkにしたがって自分も 同じようにlinkを張っておけばよい。

# cd /etc/rc.d/rc3.d/
# ln -s ../init.d/ipupdate S98ipupdate
# cd /etc/rc.d/rc4.d/
# ln -s ../init.d/ipupdate S98ipupdate
# cd /etc/rc.d/rc5.d/
# ln -s ../init.d/ipupdate S98ipupdate
# cd /etc/rc.d/rc0.d/
# ln -s ../init.d/ipupdate K01ipupdate
# cd /etc/rc.d/rc6.d/
# ln -s ../init.d/ipupdate K01ipupdate
	

自分の好きなrunlevelに登録しておけば、 起動時にスタートアップしたり、シャットダウン時に ストップすることができる。

もどる


Kenji Ohmori
Last modified: Tue May 31 02:00:05 JST 2005