Solaris のシステム管理 (上級編)

第 16 章 コアファイルの管理 (手順)

この章では、coreadm コマンドを使って、コアファイルを管理する方法について説明します。

コアファイルの管理手順については、「コアファイルの管理 (作業マップ)」を参照してください。

コアファイルの管理 (作業マップ)

作業 

説明 

参照先 

1. 現在のコアダンプ構成を表示する 

coreadm コマンドを使用して、現在のコアダンプ構成を変更する

「現在のコアダンプ構成を表示する方法」

2. コアダンプ構成を変更する 

次のいずれかの手順を実行して、コアダンプ構成を変更する 

コアファイル名パターンを設定する 

 

 

プロセス別コアファイルのパスを有効にする 

 

 

グローバルのコアファイルのパスを有効にする 

 

「コアファイル名パターンを設定する方法」

「プロセス別コアファイルパスを有効にする方法」

「グローバルのコアファイルパスを有効にする方法」

3. コアダンプファイルを調べる 

proc ツールを使用して、コアダンプファイルを表示する

「コアファイルの調査」

コアファイルの管理の概要

コアファイルは、プロセスまたはアプリケーションが異常終了した場合に生成されます。コアファイルは coreadm コマンドで管理します。

たとえば、coreadm コマンドを使用して、プロセスコアファイルをすべて同じシステムディレクトリに置くようにシステムを構成できます。プロセスやデーモンが異常終了した場合に、特定のディレクトリにあるコアファイルを調べればよいため、問題の追跡が容易になります。

構成可能なコアファイルのパス

次の 2 つの構成可能な新しいコアファイルのパスは、個別に有効または無効にすることができます。

プロセスが異常終了すると、コアファイルがデフォルトで現在のディレクトリに作成されます。グローバルコアファイルのパスが有効になっていると、プロセスが終了するたびにコアファイルが 2 つ、1 つは現在の作業ディレクトリに、1 つはグローバルコアファイルのディレクトリにそれぞれ作成されます。

デフォルトでは、setuid プロセスは、グローバルの設定やプロセス別のパスを使ってコアファイルを生成することはありません。

拡張されたコアファイル名

グローバルコアファイルディレクトリが有効な場合、次の表に示す変数を使って コアファイルを相互に区別できます。

変数名 

変数の定義 

%d

実行ファイルのディレクトリ名。最大文字数は MAXPATHLEN

%f

実行ファイルの名前。最大文字数は MAXCOMLEN

%g

実効グループ ID 

%m

マシン名 (uname -m)

%n

システムノード名 (uname -n)

%p

プロセス ID 

%t

time(2) の 10 進数 

%u

実効ユーザー ID 

%z

プロセスが実行されているゾーン名 (zonename)

%%

リテラル % 

たとえば、グローバルコアファイルパスが次のように設定されている場合、

/var/core/core.%f.%p

PID 12345sendmail プロセスが異常終了すると、次の コアファイルが作成されます。

/var/core/core.sendmail.12345

コアファイル名パターンの設定

コアファイル名パターンは、グローバル、ゾーン別、またはプロセス別に設定できます。さらに、システムリブート後も有効なプロセス別デフォルトを設定できます。

たとえば、次の coreadm コマンドでは、デフォルトのプロセス別コアファイルパターンを設定します。この設定は、デフォルトのコアファイルパターンを明示的に上書きしていないプロセスに対して適用されます。この設定はシステムリブート後も有効です。


# coreadm -i /var/core/core.%f.%p

次の coreadm コマンドでは、任意のプロセスに対しプロセス別コアファイル名パターンを設定します。


$ coreadm -p /var/core/core.%f.%p $$

$$ 記号には、現在実行中のシェルのプロセス ID を指定します。プロセス別コアファイル名パターンは、すべての子プロセスに継承されます。

グローバルまたはプロセス別のコアファイル名パターンを設定したら、これを coreadm -e コマンドで有効にする必要があります。詳細については次の手順を参照してください。

このコマンドをユーザーの $HOME/.profile または $HOME/.login ファイルに入れておけば、ユーザーのログインセッションで実行するすべてのプロセスに対しコアファイル名パターンを設定できます。

setuid プログラムがコアファイルを作成できるようにする

coreadm コマンドを使って setuid プログラムを有効または無効にすれば、次のパス設定を行うことによって、すべてのシステムプロセスに対して、または各プロセスに対してコアファイルを作成できます。

デフォルトでは、両方のフラグが無効になっています。セキュリティー上の理由により、グローバルコアファイルパスは、/ で始まるフルパス名であることが必要です。スーパーユーザーがプロセス別コアファイルを無効にすると、個別のユーザーがコアファイルを得ることはできなくなります。

setuid コアファイルはスーパーユーザーによって所有され、スーパーユーザーだけに読み取り/書き込み権が与えられます。通常ユーザーは、たとえ setuid コアファイルを生成したプロセスを所有していても、それらのファイルにアクセスできません。

詳細は、coreadm(1M) のマニュアルページを参照してください。

現在のコアダンプ構成を表示する方法

現在のコアダンプ構成を表示するには、オプションを指定しないで coreadm コマンドを実行します。


$ coreadm
               global core file pattern: 
     global core file content: default
       init core file pattern: core
       init core file content: default
            global core dumps: disabled
       per-process core dumps: enabled
      global setid core dumps: disabled
 per-process setid core dumps: disabled
     global core dump logging: disabled

Procedureコアファイル名パターンを設定する方法

  1. プロセス別コアファイルを設定するのか、グローバルコアファイルを設定するのかを決めて、次のどちらかの手順に従います。

    1. プロセス別コアファイル名パターンを設定します。


      $ coreadm -p $HOME/corefiles/%f.%p $$
      
    2. スーパーユーザーになるか、同等の役割を引き受けます。

      役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (セキュリティサービス)』「RBAC の構成 (作業マップ)」を参照してください。

    3. グローバルコアファイル名パターンを設定します。


      # coreadm -g /var/corefiles/%f.%p
      

Procedureプロセス別コアファイルパスを有効にする方法

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (セキュリティサービス)』「RBAC の構成 (作業マップ)」を参照してください。

  2. プロセス別コアファイルのパスを有効にする


    # coreadm -e process
    
  3. 現在のプロセスのコアファイルパスを表示して構成を確認します。


    $ coreadm $$
    1180:   /home/kryten/corefiles/%f.%p

Procedureグローバルのコアファイルパスを有効にする方法

  1. スーパーユーザーになるか、同等の役割を引き受けます。

    役割には、認証と特権コマンドが含まれます。役割の詳細については、『Solaris のシステム管理 (セキュリティサービス)』「RBAC の構成 (作業マップ)」を参照してください。

  2. グローバルのコアファイルのパスを有効にする


    # coreadm -e global -g /var/core/core.%f.%p
    
  3. 現在のプロセスのコアファイルパスを表示して構成を確認します。


    # coreadm
           global core file pattern: /var/core/core.%f.%p
         global core file content: default
           init core file pattern: core
           init core file content: default
                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 コアファイルパスを有効にします。

コアファイルの調査

一部の proc ツールが拡張されて、プロセスのコアファイルやライブプロセスが調べられるようになりました。proc ツールは、/proc ファイルシステムの機能を操作するユーティリティーです。

現在、コアファイルを処理できるツールは /usr/proc/bin ディレクトリにある pstackpmapplddpflagspcred です。これらのツールを使用するには、プロセス ID を指定するように、コアファイルの名前をコマンド行に指定します。

proc ツールを使用してコアファイルを調べる方法については、proc(1) のマニュアルページを参照してください。


例 16–1 proc ツールによるコアファイルの調査


$ ./a.out
Segmentation Fault(coredump)
$ /usr/proc/bin/pstack ./core
core './core' of 19305: ./a.out
 000108c4 main     (1, ffbef5cc, ffbef5d4, 20800, 0, 0) + 1c
 00010880 _start   (0, 0, 0, 0, 0, 0) + b8