4.1 SysV-init システムの起動をカスタマイズする

4.1 SysV-init システムの起動をカスタマイズする
4.1
SysV-init システムの起動をカスタマイズする
このトピックでは、Linux システムの起動の流れとサービスの起動について出題されます。
●
例題
システム起動時のサービスの自動起動設定を行うコマンドを選択して下さい。
A)
B)
C)
D)
service
chkconfig
telinit
chkserv
解答: B
●
概要(試験範囲から抜粋)
重要度
3
さまざまなランレベルのシステムサービスの動作を照会および変更する。init の構造とブートプロ
セスについての完全な理解が必要。これには、ランレベルの操作も含まれる。
主な知識範囲
Linux Standard Base Specification (LSB)
SysV init の環境
重要なファイル、用語、ユーティリティ
/etc/inittab
/etc/init.d/
/etc/rc.d/
chkconfig
update-rc.d
init と telinit
51
第 4 章 システムの起動
4.1.1
ブートプロセス
マシンの電源を入れてから Linux システムが起動するまでの手順を以下に示します。
1.
BIOS が起動し、ハードウェアの初期化とブートデバイスの決定を行う。
2.
BIOS がブートデバイス(一般的にはハードディスク)の MBR から GRUB や LILO といったブー
トローダを読み出す。
3.
ブートローダがカーネルを読み込む。
4.
カーネルが起動する。カーネルは、イニシャル RAM ディスクを暫定的な root ファイルシステムと
してマウントし、各種デバイスの初期化および実際の root ファイルシステムをマウントするため
に必要なドライバをロードし、root ファイルシステムをマウントする。
5.
init プログラム(プロセス ID:1)を実行する。
6.
init プログラムは/etc/inittab の設定に従い、ランレベルの決定、初期化スクリプト
(/etc/rc.d/rc.sysinit)を実行する。
7.
/etc/rc.d/rc スクリプトを実行し、各種サービスが起動する。
8.
ログインプロンプトを表示する。
52
4.1 SysV-init システムの起動をカスタマイズする
4.1.2
/etc/inittab
/etc/inittab ファイルは、すべてのプロセスの親である init プロセスの設定ファイルです。
/etc/inittab(コメント一部省略)
#
# 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)
#
id:5:initdefault:
# System initialization.
si::sysinit:/etc/rc.d/rc.sysinit
l0:0:wait:/etc/rc.d/rc
l1:1:wait:/etc/rc.d/rc
l2:2:wait:/etc/rc.d/rc
l3:3:wait:/etc/rc.d/rc
l4:4:wait:/etc/rc.d/rc
l5:5:wait:/etc/rc.d/rc
l6:6:wait:/etc/rc.d/rc
0
1
2
3
4
5
6
# Trap CTRL-ALT-DELETE
ca::ctrlaltdel:/sbin/shutdown -t3 -r now
# When our UPS tells us power has failed, assume we have a few minutes
# of power left. Schedule a shutdown for 2 minutes from now.
# This does, of course, assume you have powerd installed and your
# UPS connected and working correctly.
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 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
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
53
第 4 章 システムの起動
/etc/inittab の書式
id:runlevels:action:process
●
id
エントリの識別子。
●
runlevels
ランレベルの指定。指定されたランレベルで動作する際に実行される。
「2345」のように複数同時に指定できる。この場合ランレベル 2〜5 で実行される。
●
action
どのような動作を表すかを指定する。action に指定できる主な項目を示す。
action
意味
respawn
process に指定されたプロセスを起動し、プロセスが終了した場合は
常に再起動する。
wait
指定したランレベルになった時に process に指定されたプロセスを起
動し、終了をまつ。
once
指定したランレベルになった時に一度だけ実行する。
initdefault
デフォルトのランレベルを決定する。process の欄は無視される。
sysinit
システムのブート中に実行する。runlevels の欄は無視される。
powerfail
電源に異常が起きた時に実行される。電源異常は、UPS と通信して
いるプロセスから知らされる。
ctrlaltdel
●
[Ctrl]+[Alt]+[Delete]キーが押された場合に実行される。
process
実行されるプロセスを指定する。
54
4.1 SysV-init システムの起動をカスタマイズする
■
1.
/etc/inittab の主な内容
ランレベルの決定
/etc/inittab(抜粋)
id:5:initdefault:
起動時のデフォルトのランレベルを設定します。
2.
初期化処理の実行
/etc/inittab(抜粋)
si::sysinit:/etc/rc.d/rc.sysinit
初期化スクリプト /etc/rc.d/rc.sysinit を実行します。action に sysinit が指定されているためシステム
のブート時に実行されます。主に以下の処理を実行します。
●
ホスト名の設定
●
/proc ファイルシステムのマウント
●
ルートファイルシステムのチェック
●
RAID、LVM の有効化
●
ルートファイルシステムの書き込み可能での再マウント
●
他のファイルシステムのチェック
●
他のファイルシステムのマウント
●
quota の有効化
●
swap の有効化
なお、ファイルシステムのチェック・マウントは、/etc/fstab ファイルに従って行われます。
55
第 4 章 システムの起動
3.
各種サービスの起動
/etc/inittab(抜粋)
l0:0:wait:/etc/rc.d/rc
l1:1:wait:/etc/rc.d/rc
l2:2:wait:/etc/rc.d/rc
l3:3:wait:/etc/rc.d/rc
l4:4:wait:/etc/rc.d/rc
l5:5:wait:/etc/rc.d/rc
l6:6:wait:/etc/rc.d/rc
0
1
2
3
4
5
6
/etc/rc.d/rc スクリプトにより、指定されたランレベルに不要なサービスを停止し、必要なサービスを起
動します。action に wait が指定されているため、init は/etc/rc.d/rc スクリプトの終了を待ち合わせます。
4.
ログインプロンプトの表示
/etc/inittab(抜粋)
# Run gettys in standard runlevels
1:2345:respawn:/sbin/mingetty 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
ランレベル 2 から 5 のときに、/sbin/mingetty を起動し、ログインプロンプトを表示します。action に
respawn が指定されているため、ログアウトにより mingetty が終了した後 init は再度 mingetty を起動
し、ログインプロンプトを表示します。
/etc/inittab(抜粋)
# Run xdm in runlevel 5
x:5:respawn:/etc/X11/prefdm -nodaemon
ランレベル 5 のときに、/etc/X11/prefdm を実行し、X Window System のログイン画面を表示しま
す。
56
4.1 SysV-init システムの起動をカスタマイズする
4.1.3
システムサービスの動作のカスタマイズ
/sbin/init は、/etc/inittab ファイルの設定に従い、/etc/rc.d/rc スクリプトを実行しサービスを起動し
ます。
/etc/rc.d/rc(抜粋)
# First, run the KILL scripts.
for i in /etc/rc$runlevel.d/K*
・・・
action $"Stopping
・・・
done
# Now run the START scripts.
for i in /etc/rc$runlevel.d/S*
・・・
action $"Starting
・・・
done
; do
$subsys: " $i stop
; do
$subsys: " $i start
/etc/rc.d/rc スクリプトでは、各ランレベルに不要なサービスを停止するために、/etc/rcX.d ディレク
トリ内にある K で始まるスクリプトファイルを、引数に stop を指定し実行することでサービスを停止しま
す。その後、/etc/rcX.d ディレクトリ内にある S で始まるスクリプトファイルを、引数に start を指定し実
行することでサービスを起動します。
したがって、/etc/rcX.d ディレクトリ内のファイルを調べることにより、どのようなサービスを起動・停
止するのかを把握することができます。
# ls /etc/rc3.d
K02NetworkManager
K05saslauthd
K10dc_server
・・・
K45named
K50netdump
K50tux
K50vsftpd
K73ypbind
K74nscd
K74ntpd
S09isdn
S09pcmcia
S10network
S56rawdevices
S56xinetd
S80sendmail
K99readahead
K99readahead_early
S06cpuspeed
S08iptables
S40smartd
S44acpid
S55cups
S55sshd
S99local
57
第 4 章 システムの起動
また、 /etc/rcX.d ディレクトリ内のファイルは、/etc/init.d ディレクトリ内の起動スクリプトへのシンボ
リックリンクになっています。
# ls /etc/rc?.d/*sshd
/etc/rc0.d/K25sshd /etc/rc2.d/S55sshd /etc/rc4.d/S55sshd /etc/rc6.d/K25sshd
/etc/rc1.d/K25sshd /etc/rc3.d/S55sshd /etc/rc5.d/S55sshd
# ls -l /etc/rc?.d/*sshd
lrwxrwxrwx 1 root root 14
lrwxrwxrwx 1 root root 14
lrwxrwxrwx 1 root root 14
lrwxrwxrwx 1 root root 14
lrwxrwxrwx 1 root root 14
lrwxrwxrwx 1 root root 14
lrwxrwxrwx 1 root root 14
1月
1月
1月
1月
1月
1月
1月
17
17
17
17
17
17
17
16:59
16:59
16:59
16:59
16:59
16:59
16:59
/etc/rc0.d/K25sshd
/etc/rc1.d/K25sshd
/etc/rc2.d/S55sshd
/etc/rc3.d/S55sshd
/etc/rc4.d/S55sshd
/etc/rc5.d/S55sshd
/etc/rc6.d/K25sshd
->
->
->
->
->
->
->
../init.d/sshd
../init.d/sshd
../init.d/sshd
../init.d/sshd
../init.d/sshd
../init.d/sshd
../init.d/sshd
/etc/init.d ディレクトリ内には、各サービスを制御する起動スクリプトがあります。各スクリプトは、シ
ェルスクリプトファイルであり、実行時の引数を元に処理が分岐するように作られています。
# ls /etc/init.d/
FreeWnn
dhcrelay lisa
portmap squid
NetworkManager
diskdump lm_sensors
acpid
dund
mailman postgresql
・・・
postfix sshd
syslog
# /etc/init.d/sshd status
sshd (pid 3071 1971) を実行中...
# /etc/init.d/sshd stop
sshd を停止中:
[ OK ]
# /etc/init.d/sshd status
sshd は停止しています
# /etc/init.d/sshd start
sshd を起動中:
[ OK ]
# /etc/init.d/sshd status
sshd (pid 3150 3071) を実行中...
58
4.1 SysV-init システムの起動をカスタマイズする
/etc/init.d/sshd(抜粋)
#!/bin/bash
このスクリプトを実行するシェルの指定
#
# Init file for OpenSSH server daemon
・・・
start()
{
# Create keys if necessary
do_rsa1_keygen
do_rsa_keygen
do_dsa_keygen
echo -n $"Starting $prog:"
initlog -c "$SSHD $OPTIONS" && success || failure
RETVAL=$?
[ "$RETVAL" = 0 ] && touch /var/lock/subsys/sshd
echo
}
stop()
{
echo -n $"Stopping $prog:"
killproc $SSHD -TERM
RETVAL=$?
[ "$RETVAL" = 0 ] && rm -f /var/lock/subsys/sshd
echo
}
・・・
case "$1" in
start)
$1 は、実行時の第 1 引数を表します。
引数により処理が分岐します。
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
status)
status $SSHD
RETVAL=$?
;;
・・・
*)
echo $"Usage: $0 {start|stop|restart|reload|condrestart|status}"
RETVAL=1
esac
59
第 4 章 システムの起動
独自のサービスを起動したい場合には、/etc/rcX.d ディレクトリ内に起動スクリプトを配置することで
ランレベルごとにサービスの自動起動を設定することができます。通常は/etc/init.d ディレクトリに起動
スクリプトを作成し、/etc/rcX.d ディレクトリ内に S や K で始まるシンボリックリンクを作成します。
# ls /etc/init.d/customservice
/etc/init.d/customservice
# ln -s /etc/init.d/customservice /etc/rc3.d/S80customservice
ln コマンドによるシンボリックリンクの作成は、動作順序
12
の確認など作業が煩雑になるため、一般
には ln コマンドを用いずにディストリビューションに同梱されるコマンドを使用します。
RedHat 系ディストリビューション
chkconfig コマンド
Debian 系ディストリビューション
update‑rc.d コマンド
chkconfig
機能
サービス起動の設定/確認を行う。
書式
chkconfig
[ option ] service
シンボリックリンク配置、削除
chkconfig service on | off
サービスの起動設定
主なオプション
--list
サービス起動の設定を確認する。
--add
シンボリックリンク(/etc/rcX.d/*service)を作成する。
--del
シンボリックリンクを削除する。
service には、/etc/init.d ディレクトリに配置した起動スクリプトファイル名を指定する。
# chkconfig --list sshd
sshd
0:off 1:off 2:on
3:on
4:on
5:on
6:off
# ls /etc/rc?.d/*sshd
/etc/rc0.d/K25sshd /etc/rc2.d/S55sshd /etc/rc4.d/S55sshd /etc/rc6.d/K25sshd
/etc/rc1.d/K25sshd /etc/rc3.d/S55sshd /etc/rc5.d/S55sshd
# chkconfig --del sshd
# ls /etc/rc?.d/*sshd
ls: /etc/rc?.d/*sshd: そのようなファイルやディレクトリはありません
# chkconfig --add sshd
# ls /etc/rc?.d/*sshd
/etc/rc0.d/K25sshd /etc/rc2.d/S55sshd /etc/rc4.d/S55sshd /etc/rc6.d/K25sshd
/etc/rc1.d/K25sshd /etc/rc3.d/S55sshd /etc/rc5.d/S55sshd
12
動作順序は、S、K に続く 2 桁の数字が小さい順になります。
60
4.1 SysV-init システムの起動をカスタマイズする
update-rc.d
機能
書式
サービス起動の設定を行う。
update-rc.d
service
defaults
[ NN ]
サービスの初期設定に従ってシンボリックリンク(/etc/rcX.d/*service)を作
成する
update-rc.d
-f
service
remove
シンボリックリンクを削除する
update-rc.d
service
start|stop
NN
level...
ランレベルごとにサービスの起動設定を行う
service には、/etc/init.d ディレクトリに配置した起動スクリプトファイル名を指定する。
debian:~# ls /etc/rc?.d/*ssh
/etc/rc0.d/K20ssh /etc/rc2.d/S20ssh /etc/rc4.d/S20ssh /etc/rc6.d/K20ssh
/etc/rc1.d/K20ssh /etc/rc3.d/S20ssh /etc/rc5.d/S20ssh
debian:~# update-rc.d -f ssh remove
Removing any system startup links for /etc/init.d/ssh ...
/etc/rc0.d/K20ssh
/etc/rc1.d/K20ssh
/etc/rc2.d/S20ssh
/etc/rc3.d/S20ssh
/etc/rc4.d/S20ssh
/etc/rc5.d/S20ssh
/etc/rc6.d/K20ssh
debian:~# ls /etc/rc?.d/*ssh
ls: cannot access /etc/rc?.d/*ssh: そのようなファイルやディレクトリはありません
debian:~# update-rc.d ssh defaults
Adding system startup for /etc/init.d/ssh ...
/etc/rc0.d/K20ssh -> ../init.d/ssh
/etc/rc1.d/K20ssh -> ../init.d/ssh
/etc/rc6.d/K20ssh -> ../init.d/ssh
/etc/rc2.d/S20ssh -> ../init.d/ssh
/etc/rc3.d/S20ssh -> ../init.d/ssh
/etc/rc4.d/S20ssh -> ../init.d/ssh
/etc/rc5.d/S20ssh -> ../init.d/ssh
debian:~# ls /etc/rc?.d/*ssh
/etc/rc0.d/K20ssh /etc/rc2.d/S20ssh /etc/rc4.d/S20ssh /etc/rc6.d/K20ssh
/etc/rc1.d/K20ssh /etc/rc3.d/S20ssh /etc/rc5.d/S20ssh
debian:~#
61