Solaris のシステム管理 (第 1 巻)

第 6 章 実行レベルとブートファイルの手順

この章では、システムのシャットダウンとブートに関するガイドラインを示し、実行レベルとブートファイルについて説明します。

この章で説明する手順は次のとおりです。

この章で説明する主な内容は次のとおりです。

実行レベル

システムの「実行レベル」 (init 状態ともいう) は、ユーザーが使用できるサービスと資源を定義します。システムが 1 度に持つことのできる実行レベルは 1 つだけです。

Solaris ソフトウェア環境には 8 つの実行レベルがあります (表 6-1参照)。デフォルトの実行レベル 3 は、/etc/inittab ファイルに指定されています。

表 6-1 Solaris 実行レベル

実行レベル 

 

init 状態 

種類 

目的 

電源切断状態 

電源切断 

 

オペレーティングシステムをシャットダウンしてシステムの電源を安全に落とせるようにする。

s または S

シングルユーザー状態 

シングルユーザー 

すべてのファイルシステムがマウントされ使用可能な状態で、シングルユーザーとして動作する。 

システム管理状態 

シングルユーザー 

ユーザーがログインできる状態ですべての使用可能なファイルシステムにアクセスする。

マルチユーザー状態 

マルチユーザー 

通常の運用に使用する。複数のユーザーがシステムと全ファイルシステムにアクセスできる。NFS サーバーデーモンを除く、すべてのデーモンが動作する。

NFS 資源を共有したマルチユーザー  

マルチユーザー 

通常の運用に使用する。NFS の資源共有が可能な状態。

マルチユーザー状態 (予備) 

 

このレベルは現在使用されていない。 

電源切断状態 

電源切断 

オペレーティングシステムをシャットダウンしてシステムの電源を安全に落とせるようにする。可能であれば、この機能をサポートしているシステムでは電源を自動的に切断する。 

リブート状態 

リブート 

システムをシャットダウンして実行レベル 0 にしたあと、マルチユーザー状態 (または、inittab ファイルに指定されたデフォルトのレベル) でリブートする。

システムの実行レベルを確認する方法

who -r コマンドを使用してシステムの実行レベル情報を表示すれば、システムの実行レベルがわかります。ただし、実行レベル 0 を除きます。


$ who -r

例-システムの実行レベルを確認する


$ who -r
.       run-level 3  Oct 26 15:04      3      0  S
$

実行レベル 3

現在の実行レベル。 

Oct 26 15:04

実行レベルが最後に変更された日時。 

3

現在の実行レベル。 

0

最後にリブートしてからこの実行レベルになった回数。 

S

以前の実行レベル。 

/etc/inittab ファイル

init または shutdown コマンドを使用してシステムをブートしたり実行レベルを変更したりすると、init デーモンは、/etc/inittab ファイルから情報を読み取ってプロセスを起動します。/etc/inittab ファイルには、init プロセスにとって重要な 3 つの情報が定義されています。

/etc/inittab ファイル内の各エントリは、次のフィールドからなります。

id:rstate:action:process

表 6-2 に、inittab エントリの各フィールドを要約します。

表 6-2 inittab ファイルのフィールド

フィールド 

説明 

id

エントリに固有の (一意の) 識別子。 

rstate

このエントリが適用される実行レベルのリスト。 

action

プロセスフィールドに指定されたプロセスの実行方法。指定できる値は、initdefaultsysinitbootbootwaitwait、および respawn

process

実行するコマンド。 

例 - デフォルトの inittab ファイル

以下の例は、デフォルトの inittab ファイルです。


ap::sysinit:/sbin/autopush -f /etc/iu.ap
ap::sysinit:/sbin/soconfig -f /etc/sock2path
fs::sysinit:/sbin/rcS sysinit      >/dev/console 2<>/dev/console </dev/console
is:3:initdefault:
p3:s1234:powerfail:/usr/sbin/shutdown -y -i5 -g0 >/dev/console 2<>/dev/console
sS:s:wait:/sbin/rcS                >/dev/console 2<>/dev/console </dev/console
s0:0:wait:/sbin/rc0                >/dev/console 2<>/dev/console </dev/console
s1:1:respawn:/sbin/rc1             >/dev/console 2<>/dev/console </dev/console
s2:23:wait:/sbin/rc2               >/dev/console 2<>/dev/console </dev/console
s3:3:wait:/sbin/rc3                >/dev/console 2<>/dev/console </dev/console
s5:5:wait:/sbin/rc5                >/dev/console 2<>/dev/console </dev/console
s6:6:wait:/sbin/rc6                >/dev/console 2<>/dev/console </dev/console
fw:0:wait:/sbin/uadmin 2 0         >/dev/console 2<>/dev/console </dev/console
of:5:wait:/sbin/uadmin 2 6         >/dev/console 2<>/dev/console </dev/console
rb:6:wait:/sbin/uadmin 2 1         >/dev/console 2<>/dev/console </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  

システムが実行レベル 3 になると実行される処理

  1. init プロセスが起動されます。init プロセスは、/etc/default/init ファイルを読み取って環境変数を設定します。デフォルトでは、TIMEZONE 変数だけが設定されます。

  2. initinittab ファイルを読み取って、次の処理を行います。

    1. デフォルトの実行レベル 3 を定義する initdefault エントリを識別します。

    2. action フィールドが sysinit になっているすべてのプロセスエントリを実行して、ユーザーがログインする前に特別な初期設定処理がすべて行われるようにします。

    3. rstate フィールドが 3 になっている (デフォルトの実行レベル 3 と一致する) プロセスエントリを実行します。

      init プロセスが inittab ファイルを使用する方法についての詳細は、init(1M) のマニュアルページを参照してください。

表 6-3 に、実行レベル 3 の action フィールドで使用するキーワードについて説明します。

表 6-3 実行レベル 3 の action キーワードの説明

キーワード 

指定されたプロセスの実行方法 

powerfail

システムが電源切断シグナルを受信したときだけプロセスを実行する。 

wait

指定されたプロセスの終了を待つ。 

respawn

プロセスがまだ起動されていない場合は起動する。プロセスがすでに起動されている場合は、inittab ファイルの検索を続ける。

表 6-4 に、実行レベル 3 で実行されるプロセス (またはコマンド) について説明します。

表 6-4 実行レベル 3 のコマンドの説明

コマンドまたはスクリプト名 

説明 

/usr/sbin/shutdown

システムをシャットダウンする。init プロセスは、システムが powerfail シグナルを受信した場合にのみ shutdown コマンドを実行する。

/sbin/rcS

ルート (/)、 /usr/var/var/adm のファイルシステムをマウントしてチェックする。

/sbin/rc2

標準のシステムプロセスを起動して、システムを実行レベル 2 (マルチユーザーモード) に移行する。 

/sbin/rc3

実行レベル 3 で使用される NFS 資源共有を開始する。 

/usr/lib/saf/sac -t 30

ポートモニターと UUCP 用のネットワークアクセスを起動する。このプロセスは失敗すると再起動される。 

/usr/lib/saf/ttymon -g -h -p "`uname -n` console login: " -T terminal_type -d /dev/console -l console

コンソールでのログイン要求を監視する ttymon プロセスを起動する。

このプロセスは失敗すると再起動される。SPARC システムの terminal_typesun である。

x86 システムの terminal_typeAT386 である。

実行制御スクリプト

Solaris ソフトウェア環境では、一連の詳細な実行制御 (rc) スクリプトを使用して実行レベルの移行を制御しています。各実行レベルには次の rc スクリプトが対応しています。これらのスクリプトは、/sbin ディレクトリにあります。

/sbin ディレクトリ内の各 rc スクリプトには /etc/rcn.d という名前のディレクトリが対応しており、その中にはその実行レベルのさまざまな処理を実行するスクリプトがあります。たとえば、/etc/rc2.d には、実行レベル 2 のプロセスを起動および停止するためのファイル (スクリプト) があります。


# ls /etc/rc2.d
K20spc@             S70uucp*            S80lp*
K60nfs.server*      S71rpc*             S80spc@
K76snmpdx*          S71sysid.sys*       S85power*
K77dmi*             S72autoinstall*     S88sendmail*
README              S72inetsvc*         S88utmpd*
S01MOUNTFSYS*       S73nfs.client*      S89bdconfig@
S05RMTMPFILES*      S74autofs*          S91leoconfig*
S20sysetup*         S74syslog*          S92rtvc-config*
S21perf*            S74xntpd*           S92volmgt*
S30sysid.net*       S75cron*            S93cacheos.finish*
S47asppp*           S76nscd*            S99audit*
S69inet*            S80PRESERVE*        S99dtlogin*

/etc/rcn.d 内のスクリプトは常に、スクリプト名を ASCII 文字列としてソートした順に実行されます。スクリプト名の形式は次のとおりです。

[KS][0-9][0-9]*

名前が K で始まるスクリプトを実行すると、システムプロセスが終了 (kill) します。名前が S で始まるスクリプトを実行すると、システムプロセスが起動されます。

実行制御スクリプトは、/etc/init.d ディレクトリにもあります。これらのファイルは、/etc/rcn.d ディレクトリ内の対応する実行制御スクリプトにリンクされています。

各実行制御スクリプトの処理について、表 6-5 から表 6-10 に要約を示します。

実行制御スクリプトを使用してサービスを起動または停止する

実行レベルごとに対応するスクリプトを持つことの利点は、/etc/init.d ディレクトリ内の個々のスクリプトを実行することにより、システムの実行レベルを変更しないで (現在の実行レベルの) 機能を停止できる点です。

実行制御スクリプトを使用してサービスを起動または停止する方法

  1. スーパーユーザーになります。

  2. 機能を停止します。


    # /etc/init.d/filename stop
    
  3. 機能を再開します。


    # /etc/init.d/filename start
    
  4. pgrep コマンドを使用して、サービスが停止または起動しているかを確認します。


    # pgrep -f service
    

例-実行制御スクリプトを使用してサービスを起動または停止する

NFS サーバーの機能を停止するには、次のように入力します。


# /etc/init.d/nfs.server stop
# pgrep -f nfs
#

NFS サービスを再開するには、次のように入力します。


# /etc/init.d/nfs.server start
# pgrep -f nfs
141
143
245
247
# pgrep -f nfs -d, | xargs ps -fp
root   141     1 40   Jul 31 ?     0:00 /usr/lib/nfs/statd
root   143     1 80   Jul 31 ?     0:01 /usr/lib/nfs/lockd
root   245     1 34   Jul 31 ?     0:00 /usr/lib/nfs/nfsd -a 16
root   247     1 80   Jul 31 ?     0:02 /usr/lib/nfs/mountd

実行制御スクリプトの追加

サービスを起動または停止するための実行制御スクリプトを追加するには、そのスクリプトを /etc/init.d ディレクトリにコピーして、rcn.d ディレクトリ内の適切なファイルへのリンクを作成します。

実行制御スクリプトの命名法についての詳細は、/etc/rcn.d ディレクトリ内の README ファイルを参照してください。以下に、実行制御スクリプトの追加方法を説明します。

実行制御スクリプトを追加する方法

  1. スーパーユーザーになります。

  2. スクリプトを /etc/init.d ディレクトリにコピーします。


    # cp filename /etc/init.d
    # chmod 0744 /etc/init.d/filename
    # chown root:sys /etc/init.d/filename
    
  3. 適切な rcn.d ディレクトリへのリンクを作成します。


    # cd /etc/init.d
    # ln filename /etc/rc2.d/Snnfilename
    # ln filename /etc/rcn.d/Knnfilename
    
  4. ls コマンドを使用して、スクリプトが指定されたディレクトリ内のファイルにリンクされているかどうかを確認します。


    # ls /etc/init.d/ /etc/rc2.d/ /etc/rcn.d/
    

例-実行制御スクリプトを追加する


# cp xyz /etc/init.d
# cd /etc/init.d
# ln xyz /etc/rc2.d/S100xyz
# ln xyz /etc/rc0.d/K100xyz
# ls /etc/init.d /etc/rc2.d /etc/rc0.d

実行制御スクリプトを無効にする

実行制御スクリプトを無効にするには、スクリプト名の先頭にドット (.) を付けます。ドットで始まるファイルは実行されません。接尾辞を追加してファイルをコピーすると、両方のファイルが実行されます。

実行制御スクリプトを無効にする方法

  1. スーパーユーザーになります。

  2. スクリプト名の先頭に下線 ( _ ) を付けて、スクリプト名を変更します。


    # cd /etc/rcn.d
    # mv filename _filename
    
  3. スクリプト名が変更されたことを確認します。


    # ls -a
    _filename
    

例-実行制御スクリプトを無効にする

次の例は、S100datainit というスクリプト名を変更しますが、元のスクリプトも保存しています。


# cd /etc/rc2.d
# mv S100datainit _S100datainit

実行制御スクリプトのまとめ

表 6-5 /sbin/rc0 スクリプト

スクリプト名 

説明 

/sbin/rc0

以下の作業を実行する。 

 

  • システムサービスとデーモンの終了

  • 実行中の全プロセスの停止

  • 全ファイルシステムのマウント解除

表 6-6 /sbin/rc1 スクリプト

スクリプト名

説明 

/sbin/rc1

/etc/rc1.d ディレクトリ内のスクリプトを実行して以下の作業を実行する。

 

  • システムサービスとデーモンの終了

  • 実行中の全プロセスの停止

  • 全ファイルシステムのマウント解除

  • システムをシングルユーザーモードに移行

表 6-7 /sbin/rc2 スクリプト

スクリプト名 

説明 

/sbin/rc2

/etc/rc2.d ディレクトリ内のスクリプトを実行して以下の作業を実行する。

 
  • すべてのローカルファイルシステムのマウント

  • quota オプションを指定してマウントされたファイルシステムが 1 つでも存在する場合は、ディスク割り当てを有効にする。

  • エディタの一時ファイルを /usr/preserve 内に保存する。

  • /tmp ディレクトリにあるすべてのファイルの削除

  • システムアカウントの設定

  • デフォルトのルータの設定

  • NIS ドメインと ifconfig ネットワークマスクの設定

  • インストール媒体またブートサーバー (/.PREINSTALL または /AUTOINSTALL のどちらかが存在する場合) からシステムをリブートする。

  • 必要に応じて、inetdrpcbindnamed を起動する。

  • Kerberos のクライアント側デーモン kerbd を起動する。

  • NIS デーモン (ypbind) および NIS+ デーモン (rpc.nisd) を起動する。どちらを起動するかは、システムが NIS または NIS+ のどちら用に設定されているか、またシステムがクライアントとサーバーのどちらであるかによって異なる。

  • keyservstatdlockdxntpdutmpd の起動

  • すべての NFS エントリのマウント

  • ncsd (ネームサービスキャッシュデーモン) の起動

  • automountcron、 LP 印刷サービス、 sendmailutmpdvold の各デーモンの起動


注 -

実行レベル 2 で起動されるシステムサービスとアプリケーションの多くは、システム上にインストールされているソフトウェアによって決まります。


表 6-8 /sbin/rc3 スクリプト

スクリプト名 

説明 

/sbin/rc3

/etc/rc3.d ディレクトリ内のスクリプトを実行して以下の作業を行う。

 
  • sharetab のクリーンアップ

  • nfsds の起動

  • mountd の起動

  • ブートサーバーの場合は、rarpdrpc.bootparamdrpld を起動する。

  • snmpdx を起動する (SolsticeTM EnterpriseTM AgentTM プロセス)。

表 6-9 /sbin/rc5 スクリプトと /sbin/rc6 スクリプト

スクリプト名 

説明 

/sbin/rc5 および /sbin/rc6

/etc/rc0.d/k* ディレクトリ内のスクリプトを実行して以下の作業を行う。

 
  • すべてのアクティブなプロセスを停止する。

  • ファイルシステムのマウント解除

  

表 6-10 /sbin/rcS スクリプト

スクリプト名 

説明 

/sbin/rcS

/etc/rcS.d ディレクトリ内のスクリプトを実行して、システムを実行レベル S に移行する。以下の作業は、これらのスクリプトが実行する。

 
  • 最小限のネットワークの確立

  • 必要なら、/usr をマウントする。

  • システム名の設定

  • / および /usr ファイルシステムのチェック

  • 擬似ファイルシステム (/proc/dev/fd) のマウント

  • 再構成用ブートのデバイスエントリの再構築

  • シングルユーザーモードでマウントされる他のファイルシステムをチェックしてマウントする。