Solaris のブート手順では、Solaris Resource Manager ソフトウェアのさまざまな要素をいろいろな時点で有効にします。主な手順は次のとおりです。
カーネルは、起動するときに、さまざまなパラメータを /etc/system ファイルから読み込みます。これらのいくつかは Solaris Resource Manager に影響を与えます。この詳細は、「Solaris Resource Manager を使用しない場合の起動」で説明します。
カーネルは、初期化を続ける過程でプロセス 0 を作成してからプロセス 1 を起動するまでの間に、デフォルトのスケジューリングクラスではなく、Solaris Resource Manager CPU スケジューリングクラス (SHR) で init を起動して、Solaris Resource Manager を初期化します。SHR モジュールが読み込まれ、プロセス 1 (init プロセス) は Solaris Resource Manager ソフトウェアによってスケジュールされます (init(1M) のマニュアルページを参照してください)。
最初に init プロセスとそのすべての子が代理の root l ノードに接続されます。
カーネルが完全に初期化されると、システムはシングルユーザーモードからいずれかのマルチユーザーモード (通常は、実行レベル 2 または 3) へ移行します。この手順の始めの段階で /etc/init.d/init.srm スクリプトが実行されます。このスクリプトの動作によって、Solaris Resource Manager の通常の操作が有効になります。この動作については、「ブートシーケンスのイベント」で説明します。
Solaris Resource Manager を動作させずにシステムを起動しなければならない場合には、/etc/system ファイルの initclass 変数を SHR ではなくタイムシェアリング (TS) に変更します。これを簡単に行うには、boot コマンドの -a (ask) オプションを使用します。これによって、システムファイルを要求するプロンプトが表示されます。他のプロンプトに対しては、システムファイル名の入力プロンプトが表示されるまで Return キーを押してデフォルト値を設定します。システムファイル名を要求するプロンプトが表示されたら、etc/system.noshrload (最初のスラッシュは不要) と入力します。次はこの手順の例です。
/etc/system.noshrload は、Solaris Resource Manager をインストールしたときに作成された /etc/system のバックアップコピーです。それ以後に /etc/system を変更した場合には、/etc/system.noshrload も変更する必要があります。この変更を行わないと、Solaris Resource Manager での変更が反映されません。
# diff /etc/system /etc/system.noshrload < # enable srm < set initclass="SHR" |
Solaris Resource Manager では、マルチユーザーモードに切り替わる間に発生するイベントのシーケンスが特に重要です。Solaris Resource Manager システムを正しく確立するには、次の手順が必要です。
srmadm コマンドを使って Solaris Resource Manager を構成し、有効にします。
この時点で、リミットデータベースが開かれて、SHR スケジューラが有効になります。この手順については、「srmadm を使って Solaris Resource Manager を有効にする」を参照してください。
lost l ノード (srmlost) と idle l ノード (srmidle) を割り当てます。
Solaris Resource Manager のデーモンを起動します。
この手順については、「Solaris Resource Manager のデーモンの起動」を参照してください。
他のシステムデーモンを適切な l ノードで起動します。
上の手順 1 から 3 で使用するデフォルトのスクリプトは、付録 A 「Solaris Resource Manager スクリプトの例」 を参照してください。
デーモン (通常永続的に実行するシステム保守プロセス) を root l ノード以外の l ノードに接続することが重要です。root l ノードに接続されているプロセスには特殊なスケジュールが行われ、要求するすべての CPU が必ず与えられます。したがって、CPU をかなり占有する可能性があるプロセスを root l ノードに接続することは避けてください。デーモンをそれぞれの l ノードに接続すれば、中央のシステム管理者が適切な CPU の割当数を割り当てることができます。
ブート手順では、新しいプロセスは親プロセスの l ノード接続を継承します。init プロセスは root l ノードに接続されているので、それ以後のすべてのプロセスもこれを継承します。プロセスを他の l ノードに接続するためには、Solaris Resource Manager の初期化スクリプトを実行し、リミットデータベースを開かなければなりません。しかし、その場合でも、実際に接続するためには、プロセスが (login(1) のように) setuid システムコールを明示的に行うか、(srmuser(1SRM) コマンドのように) 指定した l ノード への接続を Solaris Resource Manager に明示的に要求する必要があります。setuid ファイルモードビットが有効の状態でプログラムを実行すると、l ノードの接続は変更されません。
この結果、システム起動時に自動的に起動されるすべてのシステムプログラムは root l ノードに接続されます。これは望ましくない結果をもたらすことがあります。root l ノードに接続されているプロセスが CPU をかなり占有するようになると、他のプロセスの実行に顕著な影響があるからです。したがって、ブート手順の間にデーモンプロセスを起動する場合は、srmuser コマンドでそれらのプロセスを呼び出して、それぞれの l ノードに明示的に接続する必要があります。この場合にはそれらの実ユーザー ID または実効ユーザー ID には影響しません。
次に例を示します。
/usr/srm/bin/srmuser network in.named |
起動スクリプトにある named(1M) デーモンの呼び出しをこの行で置き換えることができます。そのためには、「ネットワーク」のユーザーアカウントと l ノードが事前に確立されている必要があります。
システム管理者は、srmadm コマンドを使って、Solaris Resource Manager の操作状態やシステム全体の構成を制御できます。このコマンドは、通常、実行レベル 2 または 3 に移行するときに、Solaris Resource Manager の init.d(4) スクリプト /etc/init.d/init.srm の中で使用されます。この目的は、システムをブートするたびにすべてのパラメータに適切な値を設定し、ユーザーがシステムにアクセスする前に Solaris Resource Manager システムを有効にすることです。さらに、srmadm コマンドは、Solaris Resource Manager の大域パラメータを管理するときにも使用します。srmadm を使って設定できるパラメータのリストについては、srmadm(1MSRM) のマニュアルページを参照してください。Solaris Resource Manager の init.d スクリプトで srmadm コマンドを実行すると、次のことが行われます。
リミットデータベースを開きます。この時点までに起動されたプロセスは、自動的に代理の root l ノードに接続されます。代理の root l ノードを使用する理由は、Solaris Resource Manager の操作状態に関係なく、プロセスを接続する l ノードが存在することを保証するためです。そのため、非 root プロセスが起動される前にリミットデータベースを開いておくことが重要です。リミットデータベースを開くと、代理の root l ノードの使用量属性の値は実際の root l ノードの対応する属性に追加されます。この方法では、使用量の正味減少分が考慮されず、リミットデータベースが開かれる前の使用量の変更が必ず保存されます。
制限の適用を有効にします。
Solaris Resource Manager SHR スケジューラの動作 (たとえば、減少速度) を制御するパラメータを設定します。
SHR スケジューラを有効にします。ここまでは、SHR スケジューリングクラスのプロセスは単純なラウンドロビン方式でスケジューリングされるため、Solaris Resource Manager システムに設定されている CPU の使用権利は無効です。
srmadm コマンドの一般的な呼び出し方法については、「srmadm による Solaris Resource Manager の大域パラメータ」を参照してください。
Solaris Resource Manager ユーザーモードデーモンは、limdaemon(1MSRM) プログラムです。このプログラムは、通常、実行レベル 2 または 3 への移行時に Solaris Resource Manager の init.d スクリプトの最後の手順として呼び出されます。これは、カーネルによって呼び出される SYS クラスの srmgr システムプロセスとは違うので注意してください。次の ps(1) リストには、両方のプロセスが表示されています。
# ps -efc | egrep 'limdaemon|srmgr' root 4 0 SYS 60 18:42:14 ? 0:05 srmgr root 92 1 SHR 19 18:42:32 ? 0:41 limdaemon |
通知メッセージを受け取り、宛先ユーザーの端末に転送します。
ログインやログアウトの通知メッセージを受け取り、現在進行中のすべての Solaris Resource Manager のログインセッションを正確に記録します。
すべてのユーザーの接続時間使用量を、現在進行中の Solaris Resource Manager のログインセッションの使用量を使って定期的に必要に応じて更新します。
接続制限時間に達したユーザーを検出し、一定の猶予時間後にこのプロセスを停止し、必要に応じてログアウトします。
syslog(3) を使用するすべてのアクションを syslogd(1M) に記録します。
limdaemon は、Solaris Resource Manager のログインセッションの通知を受け取ると、すべてのユーザーの端末接続時間を監視し、それぞれの接続制限時間をチェックします。接続制限時間に近づくと、そのユーザーに通知メッセージを送信します。制限時間に達すると、猶予時間後にそのすべてのプロセスを停止し、ログアウトします。
limdaemon プログラムは、接続時間使用量を減少させます。接続時間制限値を適用する場合は、その端末デバイスカテゴリの使用量を減少させる必要があります。limdaemon コマンド行オプションの詳細は、「limdaemon の使い方」を参照してください。