コアファイルの管理は coreadm コマンドを使用して行います。たとえば、coreadm コマンドを使用して、プロセスコアファイルをすべて同じシステムディレクトリに置くようにシステムを構成できます。Solaris のプロセスやデーモンが異常終了した場合に、特定のディレクトリにあるコアファイルを調べればよいため問題の追跡が容易になります。
Solaris のこれまでのプロセスコアダンプ機能には次の制約がありました。
プロセス core ファイルはそれぞれの現在の作業ディレクトリに置かれるため、すべての Solaris デーモンが core ファイルを互いに上書きします (一般に Solaris デーモンは初期化の過程で chdir により作業ディレクトリをルート (/) ディレクトリに変更します)。
statd など多くのシステムデーモンは setuid 操作を行いますが、セキュリティ上の理由から、問題が起きてもコアファイルを生成しません。
次の 2 つの構成可能な新しいコアファイルの設定は、個別に有効または無効にすることができます。
プロセス別コアファイルの設定にはデフォルトで core が使用されます。この設定はデフォルトで有効になっています。プロセス別コアファイルの設定が有効になっていると、プロセスが異常終了したときに core ファイルが生成されます。プロセス別の設定は、親プロセスから新しいプロセスに継承されます。
プロセス別コアファイルは生成されるとプロセスの所有者によって所有され、所有者には読み取り/書き込み権が与えられます。所有者だけがこのファイルを表示できます。
グローバルコアファイルの設定にはデフォルトで core が使用されます。この設定はデフォルトで無効になっています。この設定が有効になっていると、プロセス別コアファイルの設定と同じ内容のコアファイルがグローバルコアファイルの設定に追加で作成されます。
グローバルコアファイルは生成されるとスーパーユーザーによって所有され、スーパーユーザーだけに読み取り/書き込み権が与えられます。アクセス権のないユーザーはこのファイルを表示できません。
プロセスが異常終了すると、以前の Solaris リリースと同じように core ファイルが現在のディレクトリに作成されます。しかし、たとえば、グローバルコアファイルの設定が有効で /corefiles/core に設定されていると、プロセスが終了するたびにコアファイルが 2 つ、1 つは現在の作業ディレクトリに、1 つは /corefiles ディレクトリにそれぞれ作成されます。
デフォルトでは Solaris のコアの設定とコアファイルの保存方法は従来と同じです。
setuid プロセスは、グローバルの設定やプロセス別の設定を使ってコアファイルを生成することはありません。
グローバルコアファイルディレクトリが有効な場合、次の表に示す変数を使って core ファイルを相互に区別できます。
変数名 |
変数の定義 |
---|---|
%p |
プロセス ID |
%u |
実効ユーザー ID |
%g |
実効グループ ID |
%f |
実行可能ファイル名 |
%n |
システムノード名。uname -n の出力と同じ |
%m |
マシン名。uname -m での出力と同じ |
%t |
time(2) システム呼び出しの 10 進数 |
%% |
リテラル % |
たとえば、グローバルコアファイル設定が次のように設定されている場合、
/var/core/core.%f.%p
PID 12345 の sendmail プロセスが異常終了すると、次の core ファイルが作成されます。
/var/core/core.sendmail.12345
コアファイル名パターンは、グローバルに設定したりプロセス単位で設定したりできます。さらに、この設定をシステムリブート後も有効になるように保存するかどうかを指定できます。
たとえば、次の coreadm コマンドでは、init プロセスで起動されたすべてのプロセスに対しグローバルのコアファイルパターンを設定します。このパターンは複数のシステムリブート後も有効です。
$ coreadm -i /var/core/core.%f.%p |
グローバルのコア値は /etc/coreadm.conf ファイルに格納されるため、この設定値はシステムリブート後も有効になるように保存されます。
次の coreadm コマンドでは、すべてのプロセスに対しプロセス別コアファイル名パターンを設定します。
$ coreadm -p /var/core/core.%f.%p $$ |
$$ 記号には、現在実行中のシェルのプロセス ID を指定します。プロセス別コアファイル名パターンは、すべての子プロセスに継承されます。
グローバルまたはプロセス別のコアファイル名パターンを設定したら、これを coreadm -e コマンドで有効にする必要があります。詳細は、次の手順を参照してください。
このコマンドをユーザーの $HOME/.profile または .login ファイルに入れておけば、ユーザーのログインセッションで実行するすべてのプロセスに対しコアファイル名パターンを設定できます。
coreadm コマンドを使って setuid プログラムを有効または無効にすれば、次の設定を行うことによって、すべてのシステムプロセスに対して、または各プロセスに対してコアファイルを作成できます。
グローバル setuid オプションが有効になっていると、グローバルコアファイル設定に従って、システムのすべての setuid プログラムが core ファイルを作成します。
プロセス別 setuid オプションが有効になっていると、プロセス別コアファイル設定に従って、特定の setuid プロセスが core ファイルを作成します。
デフォルトでは、両方のフラグが無効になっています。セキュリティ上の理由により、グローバルコアファイル設定は、/ で始まるフルパス名であることが必要です。スーパーユーザーがプロセス別コアファイルを無効にすると、個別のユーザーがコアファイルを得ることはできなくなります。
setuid コアファイルはスーパーユーザーによって所有され、スーパーユーザーだけに読み取り/書き込み権が与えられます。通常ユーザーは、たとえ setuid コアファイルを生成したプロセスを所有していても、それらのファイルにアクセスできません。
詳細は、coreadm(1M) のマニュアルページを参照してください。
現在のコアダンプ構成を表示するには、オプションを指定しないで coreadm コマンドを実行します。
$ coreadm global core file pattern: /var/core/core.%f.%p init core file pattern: core global core dumps: enabled per-process core dumps: enabled global setid core dumps: enabled per-process setid core dumps: disabled global core dump logging: disabled |
現在のプロセスのコアファイル設定を知るには、次の coreadm コマンドを使用します。$$ 記号には、実行されているシェルのプロセス ID を指定します。
$ coreadm $$ 278: core.%f.%p |
スーパーユーザーは coreadm process ID を指定すれば、どのユーザーのコアファイル設定でも照会できます。通常のユーザーは、自分のプロセスのコアファイル設定だけを照会できます。
スーパーユーザーになります。
プロセス別コアファイル設定を有効にします。
# coreadm -e process |
現在のプロセスのコアファイル設定を表示して構成を確認します。
$ coreadm $$ 1180: /home/kryten/corefiles/%f.%p |
スーパーユーザーになります。
グローバルのコアファイル設定を有効にします。
# coreadm -e global -g /var/core/core.%f.%p |
現在のプロセスのコアファイル設定を表示して構成を確認します。
# coreadm global core file pattern: /var/core/core.%f.%p init core file pattern: core global core dumps: enabled per-process core dumps: enabled global setid core dumps: disabled per-process setid core dumps: disabled global core dump logging: disabled |
NOTICE: 'set allow_setid_core = 1' in /etc/system is obsolete NOTICE: Use the coreadm command instead of 'allow_setid_core' |
setuid コアファイルを許容する古いパラメータが /etc/system ファイルにあります。
/etc/system ファイルから allow_setid_core=1 を削除し、coreadm コマンドを使ってグローバル setuid コアファイルの設定を有効にします。