Solaris のシステム管理

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

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

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

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

実行レベル

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

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

表 6-1 Solaris 実行レベル

実行レベル 

init 状態 

種類 

目的 

電源切断状態 

電源切断 

 

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

システム管理状態 

シングルユーザー 

ユーザーがログインできる状態ですべての使用可能なファイルシステムにアクセスする。このコマンドを実行した端末がコンソールになる。

マルチユーザー状態 

マルチユーザー 

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

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

マルチユーザー 

通常の運用に使用する。NFS 資源共有が使用できる状態。

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

 

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

電源切断状態 

電源切断 

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

リブート状態 

リブート 

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

s または S

シングルユーザー状態

シングルユーザー 

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

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

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

次のプロセスフィールドに指定されたプロセスの実行方法。 

process

実行するプロセス (またはコマンド) の名前。 

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

以下の例は、デフォルトの inittab ファイルに注釈を付けたものです。

 [STREAMS モジュールの初期化] ap::sysinit:/sbin/autopush -f /etc/iu.ap
 [socket により使用されるトランスポートプロバイダを構成する。sock2path ファイルにはプロバイダマップを転送するソケットが含まれる。] ap::sysinit:/sbin/soconfig -f /etc/sock2path
 [ファイルシステムのチェック] fs::sysinit:/sbin/rcS  >/dev/console 2>&1 </dev/console
 [デフォルトの実行レベル] is:3:initdefault:
 [電源切断によるシャットダウン] p3:s1234:powerfail:/sbin/shutdown -y -i5 -g0 >/dev/console 2>&1 </dev/console
 [実行レベル 0] s0:0:wait:/sbin/rc0 >/dev/console 2>&1 </dev/console
 [実行レベル 2] s1:1:wait:/sbin/shutdown -y -iS -g0 >/dev/console 2>&1 </dev/console
 [実行レベル 3] s2:23:wait:/sbin/rc2 >/dev/console 2>&1 </dev/console
 [実行レベル 1] s3:3:wait:/sbin/rc3 >/dev/console 2>&1 </dev/console
 [実行レベル 5] s5:5:wait:/sbin/rc5 >/dev/console 2>&1 </dev/console
 [実行レベル 6] 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
 [サービスアクセスコントローラの初期化] sc:234:respawn:/usr/lib/saf/sac -t 300
 [コンソールの初期化] co:234:respawn:/usr/lib/saf/ttymon -g -h -p "`uname -n` console  login: " 
-T terminal_type -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) のマニュアルページを参照してください。

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

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

      キーワード 

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

      powerfail

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

      wait

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

      respawn

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

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

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

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

説明 

/usr/sbin/shutdown

システムをシャットダウンする。init プロセスは、システムが powerfail シグナルを受信したときだけ shutdown コマンドを実行する。

/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 文字列としてソートした順に実行されます。スクリプト名の形式は次のとおりです。

[K,S][0-9][0-9][A-Z][0-99]

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

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

各実行制御スクリプトの処理を表 6-5 から表 6-11 に要約します。

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

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

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

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

  2. 機能を停止します。

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

        # /etc/init.d/filename start
    
  4. ps コマンドと grep コマンドを使用すれば、サービスが停止しているか起動しているかを確認できます。

        # ps -ef | grep service
    

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

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

# /etc/init.d/nfs.server stop
# ps -ef | grep nfs
#

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

# /etc/init.d/nfs.server start
# ps -ef | grep nfs
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
root  1324  1318 11 13:29:52 pts/0 0:00 grep nfs

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

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

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

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

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

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

        # cp filename /etc/init.d
    
  3. 適切な rc*.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
        # cp filename .filename
    
  3. スクリプトの名前が変更されていることを確認します。

        # ls -a 
        # .filename
    

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

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

# cd /etc/rc0.d
# cp K00ANNOUNCE .K00ANNOUNCE

実行制御スクリプトの要約

表 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/rc5

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

 
  • プリンタデーモンと syslog デーモンの終了

  • ローカルおよびリモートのファイルシステムのマウント解除

  • NFS サーバーおよびクライアントのサービス停止

  • NIS、RPC、cron の各サービスの停止

  • すべてのアクティブなプロセスを停止し、対話型ブートを開始する。

  

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

スクリプト名 

説明 

/sbin/rc6

以下の作業を行う。 

 
  • /etc/rc0.d/K* スクリプトを実行して、システムプロセスを停止する。

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

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

  • /etc/inittab ファイル内の initdefault エントリの実行

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

スクリプト名 

説明 

/sbin/rcS

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

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

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

  • システム名の設定

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

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

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

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