Solaris Resource Manager 1.1 のシステム管理

第 3 章 構成

Solaris Resource Manager は、中央のシステム管理者 (たとえば、root ユーザー) にとって、構成を行う上で非常に柔軟性があります。この章では、構成について次の項目を説明します。

カーネルのブートパラメータ

中央のシステム管理者がカーネルをブートするときに設定できるパラメータが Solaris Resource Manager にはいくつかあります。Solaris システムでは、起動時に /etc/system ファイルを読み込み、これを使ってカーネルモジュールを構成します (詳細は、system(4) を参照)。SHR モジュールに設定できるパラメータ (すべて 32 ビットの整数) には、次のものがあります。これによって、Solaris Resource Manager のデフォルトの動作を無効にできます。

SRMLnodes

カーネルにキャッシュする l ノードの数。Solaris システムでは、カーネルの l ノードごとに約 3K バイトが必要です。値ゼロ (デフォルト) を指定すると、カーネルが値を決めます。その場合には、次の方法が使用されます。

(nproc / SRMProcsPerUid ) + SRMLnodesExtra 

ここで、nproc はシステムで同時に動作できるプロセスの最大数です。計算の結果が 6 より小さいと、最小値として 6 が使われます。さらに、計算の結果が SRMMemoryMax に指定されている最大値より大きいと、この最大値が使用されます。

SRMProcsPerUid

各ユーザーによって使用されることが予想される平均のプロセス数。デフォルトは 4 です。

SRMLnodesExtra

メモリー内の l ノードの配列のサイズを決めるための方法で使用する偏り。デフォルトは 20 です。

SRMNhash

カーネルの中でユーザー ID の値を l ノードにマップするときに使用するハッシュテーブルのエントリ数。Solaris システムでは、エントリの長さは 4 バイトです。デフォルトはゼロです。この場合には、l ノードの数と同じ数が使用されます。

SRMMemoryMax

この値の逆数が、Solaris Resource Manager の l ノードとハッシュテーブルの合計に使用する実メモリーの最大パーセントを指定する値です。デフォルトは 20 です。この場合には、Solaris Resource Manager のデータ構造に対し、実メモリーの最大 5 パーセントが使用されます。

SRMMemWarnFreq

1 つの l ノードに対し「memory exceeded (メモリーを超過しました)」の警告を通知する最小間隔を秒数で示したもの。デフォルト値は 4 です。

たとえば、/etc/system ファイルに次の行があるとします。

set srmlim:SRMMemWarnFreq=10 

この場合、メモリー超過のメッセージが 1 人のユーザーに対し 10 秒に 2 回以上出されることはありません。

さらに、Solaris Resource Manager のパラメータではありませんが、動作に影響するパラメータがあります。

initclass

スケジューリングクラス名です。init(1M) プロセスはこのクラスで起動されます。Solaris Resource Manager の場合、この値は文字列 "SHR" (二重引用符を含む) にします。Solaris のデフォルト値は "TS" です。Solaris Resource Manager を使って CPU 資源を制御する場合は、次の行で /etc/system ファイルに指定し、デフォルト値より優先させます。

set initclass="SHR"

extraclass

ロードするスケジューリングクラスモジュール名です。ただし、これがデフォルトのスケジューリングクラスとして使用されるとは限りません。Solaris Resource Manager で CPU 資源以外のものだけを制御する場合は、次の行を /etc/system ファイルに指定します。

set extraclass="SHR"

Solaris Resource Manager をロードしていないシステムをブートするには、/etc/system ファイルの代わりに /etc/system.noshrload を使用します。この処理については、「Solaris Resource Manager を使用しない場合の起動」を参照してください。

マルチユーザー起動構成

通常のシステムブートで、システムがシングルユーザーモードからマルチユーザーモードに変わると、Solaris Resource Manager の初期化スクリプトが実行され (付録 A 「Solaris Resource Manager スクリプトの例」 を参照)、Solaris Resource Manager のパラメータが設定されます。このスクリプトの詳細は、第 4 章「ブート手順」で説明します。

初期化スクリプト自体 (/etc/init.d/init.srm) を変更する場合は、元のコピーと変更後のコピーを別々に保存する必要があります。Solaris Resource Manager の更新を適用する場合、現在の初期化スクリプトが保存されるとは限りません。

srmadm による Solaris Resource Manager の大域パラメータ

管理者は、srmadm コマンドを使って Solaris Resource Manager 大域パラメータの設定、変更、および表示を行うことができます。各パラメータの詳細は、srmadm(1MSRM) のマニュアルページを参照してください。

さまざまなパラメータを設定する場合には、srmadm コマンドを何回でも呼び出すことができます。1 回の呼び出しですべての設定を指定する必要はありません。したがって、srmadm(1MSRM) を使用すれば、動作している Solaris Resource Manager システムの操作パラメータを動作中に変更できます。ただし、この場合には、注意が必要です。

次の srmadm のオプションは、管理者にとって特に重要です。このオプションでは、Solaris Resource Manager の主要機能を有効または無効にできます。

fileopen[={y|n}]

デフォルトデータベースは /var/srm/srmDB です。これは -f オプションで上書きできます。Solaris Resource Manager のデータベースファイルを操作中に閉じるのは、緊急のときだけにしてください。この場合、いくつかの望ましくない結果が生じます。すべてのプロセスが代理の root l ノードで動作を続けるため、プロセスは通常よりも多くの特権を与えられることがあります。SHR スケジューラが無効になり、Solaris Resource Manager の制限値の適用が停止されます。無効にした場合、Solaris Resource Manager のリミットデータベースは開かれず、キャッシュには代理の root l ノードだけが含まれ、そこにすべてのプロセスが接続されています。

share[={y|n}]

有効にすると、Solaris Resource Manager の SHR スケジューラが使用され、Solaris Resource Manager の動的な使用と減少のアルゴリズムに従って CPU スケジューリングが行われます。このモードを設定するためには、fileopen モードが有効になっていなければなりません。これを無効にすると、SHR スケジューラの使用量計算が停止され、プロセスは、固定の同一優先順位を使った「ラウンドロビン方式」でスケジューリングされます。

limits[={y|n}]

有効にすると、Solaris Resource Manager は仮想メモリーとプロセスの制限値を適用します。このモードを設定するためには、fileopen モードが有効になっていなければなりません。無効にすると、Solaris Resource Manager は最新の使用量属性を保持しますが、制限値は適用しません。

adjgroups[={y|n}]

有効にすると、Solaris Resource Manager の SHR スケジューラで大域グループの実効割当率が調整されます。ほとんどの状況では、できるだけ有効にしてください。実行間隔ごとに、すべてのリミットエントリの使用量が再計算されます。adjgroups スケジューリングモードを有効にすると、使用量の計算がさらに次のように行われます。スケジューラはスケジューリングツリーを調べ、各グループが新しく受け取った実効割当率をその権利分と比較します。権利分より少ない割当率を割り当てられたグループには、次の実行間隔でより多くの実効割当率を受け取れるようにします。この結果、そのグループは、メンバーのアクションとは関係なしに、可能な限り権利に相当する CPU サービスを受け取ります。

limshare[={y|n}]

有効にすると、SHR スケジューラは、優先順位上限機能を適用してすべてのユーザーの実効割当率を制限し、使用量が極端に少ないユーザーが短い間 CPU のほとんどすべてを獲得してしまうのを防ぎます。できるだけ有効にしてください。

ユーザーの CPU サービス率は、おおよそユーザーの使用量に反比例します。ユーザーが長い間動作していなければ、使用量の減少はほとんどありません。このユーザーがログインすると、次の実行間隔では、このユーザーのプロセスの優先順位が、CPU を占有するほど高くなることがあります。

limshare スケジューリングフラグを有効にすると、スケジューラは、次の実行間隔までに l ノードが受け取る実効割当率を推定します。この結果がユーザーに割り当てられた権利分よりもある係数 (maxushare を参照) だけ多いと、ユーザーの使用量は再調整されます。

srmadm には、管理者にとって便利なパラメータが 2 つあります。

一般的な srmadm コマンドの例を次に示します。

Solaris Resource Manager を有効にして SHR スケジューラと資源制限値を有効にするには、次のようにします。

# srmadm set -f /var/srm/srmDB fileopen=y:share=y:limits=y 

CPU 使用量の減少速度の半減期を 5 分にするには、次のようにします。

# srmadm set usagedecay=300s 

現在のフラグの設定値と負担を表示するには、次のようにします。

% srmadm 

すべてのデフォルトの設定値を表示するには、次のようにします。

% srmadm show -dv 

Solaris Resource Manager を無効にする

srmadm(1MSRM) コマンドで fileopen フラグをクリアすることによって Solaris Resource Manager を無効にできます。すべてのプロセスが代理の root l ノードに移され、キャッシュにある変更された l ノードがディスクにフラッシュされ、l ノードデータベースが閉じられます。これによって、share フラグと limits フラグが自動的に無効になり、その結果、SHR スケジューラと制限値の適用がそれぞれ無効になります。share フラグとlimits フラグは、必要なら、limits データベースが開いた状態のままで個別に無効にできます。この場合には、プロセスが適切な l ノードに接続されたままになるので、ファイルを閉じるよりも望ましい方法です。

操作中に Solaris Resource Manager のスケジューラだけを無効にしても、使用量と減少のアルゴリズムが中断されるだけです。スケジューラは、SHR スケジューリングクラスでプロセスの処理を続けます。しかし、各プロセスには更新された優先順位が割り当てられるので同じ値が使用されることになり、単純な「ラウンドロビン」スケジューリングが行われます。

ファイルが閉じられている状態でそのファイルを開いて、share フラグと limits フラグを設定して Solaris Resource Manager を再び有効にしても、既存のプロセスは root l ノードに接続されたままです。通常の操作で Solaris Resource Manager のデータベースを閉じることは避けてください。閉じた場合には、システムを再起動して、プロセスを適切な l ノードに接続する必要があります。

limdaemon の使い方

デフォルトでは、limdaemonsyslog(3) を使用してメッセージを記録します。時刻はメッセージに含まれます。

limdaemon には、起動時に構成できるオプションがいくつかあります。

次はこの limdaemon コマンドの例です。

% limdaemon -g300 

このコマンドでは、デーモンを起動し、猶予時間を 5 分に設定します。コマンドの後にシェル & 文字を続ける必要はありません。limdaemon を起動すると、それ自身がデーモンになります。つまり、子プロセスがフォークされ、その子プロセスがそれ自身を制御端末から切り離し、独自のプロセスグループに入ります。

管理者は、接続時間使用量属性を頻繁に更新することによるオーバーヘッドの増加と、更新の頻度が少なくなることによるばらつきの増加のバランスをどうするかを判断する必要があります。上述オプションやその他のオプションの詳細は、limdaemon(1MSRM) のマニュアルページを参照してください。

PAM サブシステム

Solaris 2.6 システムは Pluggable Authentication Module (PAM) をサポートします。ユーザー識別情報の変更や設定が必要になる操作 (システムへのログイン、rcprsh などの r コマンドの呼び出し、ftp の使用、su の使用など) をユーザーが要求すると、一連の構成可能モジュールを使って、認証、アカウント管理、資格管理、およびセッション管理が行われます。Solaris Resource Manager には、ログインのアカウント処理を行い、su の動作を変更するモジュールがあります。

この操作を要求するときに使用するプログラムをサービスといいます。

PAM システム全体の説明は、pam(3)pam.conf(4)pam_unix(5)pam_srm(5SRM) のマニュアルページを参照してください。

Solaris Resource Manager の PAM モジュールには、アカウント管理とセッション管理の機能があります。PAM の動作を制御するには /etc/pam.conf ファイルを編集します。通常の Solaris Resource Manager の動作の場合は、Solaris Resource Manager の PAM モジュールを、セッション管理に対するすべてのログイン系サービスの requisite として、およびすべての PAM サービスに対するアカウント管理の requisite として構成する必要があります。通常、Solaris Resource Manager のモジュールは、他のすべての required および requisite モジュールの後、他の sufficient または optional モジュールの前に置きます。

Solaris Resource Manager は、インストール時に /etc/pam.conf を編集して、適切な動作を行えるようにします。Solaris Resource Manager は、セッション管理またはアカウント管理がすでに構成されているサービス (other を含む) ごとに次のような行を追加します。

login account requisite pam_srm.so.1 nolnode=/etc/srm/nolnode 
login session requisite pam_srm.so.1
other account requisite pam_srm.so.1 nolnode=/etc/srm/nolnode

最初の行では、サービスログインの場合、モジュール pam_srm.so.1 を使ってアカウント管理を行い、ログインが成功するためにはログインを許可する必要があることを指定します。さらに、引数 nolnode=/etc/srm/nolnode を渡します。制御フラグ (requiredrequisiteoptional、および sufficient) の詳細は、pam.conf(4) のマニュアルページを参照してください。

2 行目では、ログインサービスがセッション管理に pam_srm.so.1 モジュールを使用することを指定します。

Solaris Resource Manager のアカウント管理とセッション管理のモジュールに対してサポートされる引数については、pam_srm(5SRM) のマニュアルページを参照してください。

アカウント管理

Solaris Resource Manager のアカウント管理 PAM モジュールは、制御されると次のことをします。

  1. Solaris Resource Manager がインストールされ、有効になっているかどうかを判定します。Solaris Resource Manager がインストールされていなかったり、有効でない場合は、このモジュールを無視するように PAM システムに通知します。

  2. ユーザーに l ノードがあるかどうかを判定し、ない場合は管理者による構成が可能な nolnode スクリプトを呼び出します。

  3. ユーザーが要求するサービスとデバイスのアクセス権がユーザーにあるかどうかを判定します。

  4. ユーザーが警告限度を超過しているかどうかを判定し、超過している場合は、ログインを許可しません。

  5. 管理者による構成が可能な every login スクリプトを呼び出します。

いずれかの手順が失敗すると、残りの手順は行われません。Solaris Resource Manager のアカウント管理 PAM モジュールはサービスの使用を拒否します。可能であれば、メッセージがこのサービスを経由してユーザーに渡されます。

スクリプト

デフォルトの missing lnode スクリプトでは、ユーザーの l ノードを作成し、そのことを知らせるメールをシステム管理者に送ります。このデフォルトスクリプトは /etc/srm/nolnode です。このスクリプトを変更するには、ファイル /etc/pam.conf を編集して、Solaris Resource Manager アカウント管理モジュールの行で nolnode オプションの値を変更します。every login スクリプトは通常構成されていません。これを変更する場合は、/etc/pam.conf のいずれかの Solaris Resource Manager アカウント管理モジュールに [everylogin=pathname] オプションを追加します。スクリプトは root ユーザーで呼び出されます。標準の入力、出力、およびエラー処理はクローズされます。スクリプトがゼロ以外で終了すると、アクセスは拒否されます。すべての情報は環境変数として渡されますが、これらの環境変数は、サービスから PAM に渡される情報から直接抽出されます。

USER

プログラムに渡されるログイン名。この名前は、パスワードマップの検索によってすでに認証されています。この名前がない場合は、アカウント管理モジュールがすでにエラーコードを PAM に返しています。

UID

認証されているユーザーのユーザー ID。ユーザー ID を変更するサービス (su など) の場合、これはサービスを呼び出すユーザーのユーザー ID です。ユーザー ID を設定するサービス (login など) の場合、これはターゲットユーザー ID (USER のユーザー ID) です。

RHOST

ネットワークを介するアクセスの場合は、アクセスを要求しているホスト名です。それ以外の場合、この値は実装によって異なります。

SERVICE

アクセスサービスの名前 (rshloginftp など)。

TTY

サービスを呼び出す TTY の名前。厳密な意味で制御端末がないサービス (ftp など) のうち、一部のものはこの変数にプロセス情報を入れます (たとえば、ftp12345 など。12345ftpd のプロセス識別子 (PID))。制御端末がないサービスのうち、それ以外のものは、この変数に何も入れないか、サービス名を入れます。

DEBUG

pam.conf ファイルでデバッグを指定すると、DEBUG が真に設定されます。この指定をしなければ、偽に設定されます。他の環境変数は設定されないので、必要な場合は、どのスクリプトも独自の PATH 変数を指定する必要があります。

デフォルトの「no lnode」スクリプトは、l ノードをデフォルトのスケジューリンググループ (そのようなユーザーがパスワードマップに存在する場合は other、存在しない場合は root) に作成します。そして、システム管理者にメッセージをメールして、新しい l ノードをスケジューリング階層の適切な場所に移す必要があることを知らせます。スクリプトの例については、「デフォルトの「no lnode」スクリプト」を参照してください。

PAM とデバイスグループとの相互作用

Solaris Resource Manager の PAM モジュールは、デバイス階層の端末名とサービス名を検索し、制限値を超過しているか、デバイスフラグが set に評価されると、呼び出し側に「permission denied (アクセス権がありません)」というメッセージを返します。

調べるデバイスカテゴリは、端末名に対しては terminal、要求された種類のサービスに対しては services です。たとえば、rlogin を行うときにネットワークデバイスグループのファイルを使用することがあります。このユーザーに対しては次のフラグがこの順に検査されます (すべてのフラグが group として設定されているとします)。

これらがすべて set と評価されたときだけアクセスが許可されます。さらに、対応するカテゴリ (terminalservices) の制限値が検査されます。

セッション管理

ログインのようなサービス (utmp ファイルにエントリを作成したもの) では、PAM のセッション管理機能とアカウント管理機能が両方とも /etc/pam.conf に構成されていれば、これらが呼び出されます。

Solaris Resource Manager 製品のセッション管理では、デバイスに対する課金処理をします。接続時間の制限値を超えたかどうかや、onelogin フラグが設定されていて、ユーザーがすでにログインしているかどうかを調べ、該当する場合には、ログインを拒否します。

ログイン可能な場合には、セッション管理機能により、limdaemon プロセスへのメッセージが生成され、ログイン可能であることと、ログインに使用する端末の構成コストがこのプロセスに知らされます。次に、現在のプロセスが login header process (ログインヘッダープロセス) であることと、セッション管理が終了した場合には limdaemon プロセスに知らせる必要があることがカーネルに通知されます。

limdaemon プロセスは接続時間の制限値を監視し、超過しそうになると、警告を出します。