Linuxのコアダンプ保存場所と設定|core_pattern・coredumpctl・ulimitの違い

Linuxシステムにおけるコアダンプは、プロセスがダンプ対象のシグナルで異常終了した際に、その時点でのプロセスのメモリイメージをファイルとして保存することです。これにより、開発者やシステム管理者は後からその状況を分析し、問題の原因を特定することができます。コアダンプの保存場所や設定方法を適切に管理することは、効率的なシステムトラブルシューティングに不可欠です。この記事では、コアダンプの基本的な概念と、その保存場所の確認・変更方法について解説します。

最初に sysctl kernel.core_pattern で収集方式を確認します。先頭が | なら保存先のファイル名ではなく、systemd-coredump などの収集プログラムを指します。ファイル保存方式と収集プログラム方式では、保存先やサイズ制限の確認方法が違います。コアには秘密情報を含むメモリーが記録され得るため、アクセス権・保管期間・共有先を管理してください。

目次

コアダンプとは何か

コアダンプは、プログラムが異常終了した際に、その時点でのプロセスの状態を記録したファイルのことを指します。このファイルには、プログラムのメモリ内容、オープンしていたファイルの情報、CPUのレジスタ状態などが含まれ、プログラムのクラッシュ原因を調査するための重要な情報源となります。コアダンプファイルは、デバッガなどのツールを用いて解析することができ、システムやアプリケーションの問題解析に役立ちます。

Linuxシステムでは、コアダンプの生成はデフォルトで有効になっていることが多いですが、システムによっては設定が必要な場合もあります。また、セキュリティ上の理由からコアダンプを無効にしている環境もあります。コアダンプの設定を確認し、必要に応じて有効化またはカスタマイズすることで、システムの運用とメンテナンスをより効率的に行うことが可能になります。

コアダンプの保存場所の確認方法

Linuxシステムでコアダンプの保存場所を確認する方法には、いくつかの手順があります。主に、システム設定ファイルやコマンドを使用して確認することができます。ここでは、最も一般的な方法を紹介します。

sysctlを使用する方法

sysctl コマンドは、カーネルパラメータをランタイムで読み書きするために使用されます。コアダンプの保存場所も、このコマンドを使って確認することができます。

sysctl kernel.core_pattern

このコマンドは現在のカーネル設定を表示します。core などの相対ファイル名なら、クラッシュしたプロセスの作業ディレクトリが基準です。絶対パスならその保存先、先頭が | なら後ろに書かれた収集プログラムを確認します。ディストリビューションごとの設定があるため、どの環境もカレントディレクトリに保存されるとは限りません。

/proc/sys/kernel/core_patternを直接確認する方法

sysctl コマンドで確認できる情報は、/proc/sys/kernel/core_pattern ファイルにも保存されています。このファイルを直接確認することで、コアダンプの保存場所を知ることができます。

cat /proc/sys/kernel/core_pattern

このファイルに記載されているパターンに従って、コアダンプファイルが生成されます。パターンには、ファイル名にプロセスIDやタイムスタンプを含めるための特殊な指定子を使用することができ、より柔軟な設定が可能です。

コアダンプの保存場所やファイル名のパターンを確認することで、システム上で発生した問題の解析を効率的に行うための準備が整います。また、必要に応じてこのパターンを変更することで、コアダンプファイルの管理をより柔軟に行うことが可能です。次のセクションでは、その変更方法について詳しく解説します。

systemd-coredump を使う環境の確認

収集先が systemd-coredump の環境では、まず次の読み取り用コマンドで記録を確認します。コマンドの有無や閲覧できる範囲は環境・権限によって異なります。

coredumpctl list
coredumpctl info

一覧に記録があってもコア本体が期限・サイズ制限で削除済みの場合があります。coredump.conf の Storage、ProcessSizeMax、ExternalSizeMax、MaxUse など、収集側の保存・処理制限も確認します。別の収集プログラムなら、その製品の設定を調べてください。

コアダンプの保存場所の変更方法

以下は管理者が直接ファイル保存方式を選ぶ場合の設定例です。core_pattern はカーネル全体の収集経路を変えるため、パイプ指定を上書きすると既存の systemd-coredump 等を置き換えます。現在値と設定ファイルを控え、既存の収集方式を維持したい場合はこの変更を行わないでください。

kernel.core_patternの変更

コアダンプの保存場所とファイル名のパターンは、kernel.core_pattern カーネルパラメータで定義されます。このパラメータを変更することで、コアダンプの保存場所をカスタマイズすることができます。

echo '/var/coredumps/core.%e.%p.%h.%t' | sudo tee /proc/sys/kernel/core_pattern

上記のコマンドは、コアダンプファイルを /var/coredumps/ ディレクトリに保存し、ファイル名にプログラム名(%e)、プロセスID(%p)、ホスト名(%h)、タイムスタンプ(%t)を含むように設定します。実行前にそのディレクトリが存在し、対象プロセスに必要な書き込み権限があること、空き容量と保存上限を確認してください。ディレクトリはこのコマンドでは作成されません。機密性のため、全ユーザーに読み書き可能な設定を安易に与えないでください。

sysctlを使用した永続的な変更

永続設定の読み込み方法はディストリビューションに従います。以下は /etc/sysctl.conf を読み込む環境での例です。既存の kernel.core_pattern 指定を探し、重複を作らず編集してください。設定ファイルをバックアップし、ほかの sysctl 設定も再適用されることを理解してから実施します。

kernel.core_pattern=/var/coredumps/core.%e.%p.%h.%t

上記は設定ファイルに記載する1行で、シェルで実行するコマンドではありません。内容を確認後、sudo sysctl -p /etc/sysctl.conf で読み込み、sysctl kernel.core_pattern で実際の値を再確認します。/etc/sysctl.d/ 等の別設定による上書きにも注意してください。

コアダンプの保存場所を変更することは、大量のコアダンプファイルが生成される可能性がある大規模なシステムや、特定の監視ツールを使用してコアダンプを管理したい場合に特に有用です。適切な保存場所とファイル名の形式を選択することで、システムの安定性と管理のしやすさを向上させることができます。

コアダンプサイズの制限設定

Linuxシステムでは、コアダンプファイルが占めることができる最大サイズを制限することが可能です。これは、特にディスクスペースが限られているシステムで役立つ設定です。大きなアプリケーションでは、コアダンプファイルが数GBにも及ぶことがあり、ディスクスペースを急速に消費してしまう可能性があります。コアダンプサイズの制限を設定することで、システムの安定性を維持しながら、有用なデバッグ情報を保持するバランスを取ることができます。

ulimitを使用したコアダンプサイズの制限

ulimit コマンドは、ユーザーのシェルセッションでリソースの使用量に制限を設けるために使用されます。コアダンプファイルの最大サイズも、このコマンドを使用して制限することができます。

ulimit -c <サイズ>

Bash の通常モードでは -c の単位は1024バイトで、100000は約100MBです。POSIXモードでは512バイト単位になるため、使用中のシェルの仕様を確認します。ulimit -Sc と ulimit -Hc でソフト・ハード上限を確認し、変更はそのシェルから起動するプロセスへ継承されます。既に動いている別プロセスやサービスに一括適用されるものではありません。

ulimit -c 0 は直接ファイル保存時の制限になりますが、core_pattern がパイプの場合、カーネルは RLIMIT_CORE を適用しません。完全に収集を止めたい場合や容量制限が効かない場合は、収集プログラム側の設定を合わせて確認します。

PAM ログインセッションのサイズ制限

/etc/security/limits.conf は pam_limits を使用するログインセッションに適用されます。systemd のシステムサービスや実行中プロセスへ一律に適用する設定ではありません。

* hard core 100000

この例は、PAM経由で適用される対象のハード上限を100000KBに設定します。* の既定ルールは root に自動適用されず、個別ルール等も確認が必要です。ソフト上限は別に確認し、設定変更後は新しいログインセッションで有効値を確かめます。パイプ収集時の制約は前述のとおりです。

コアダンプサイズの制限を設定することは、システムリソースを適切に管理し、特にストレージの容量が限られている環境での問題を防ぐために有効です。ただし、あまりにも小さいサイズに制限を設けると、必要なデバッグ情報が失われる可能性があるため、適切なバランスを見つけることが重要です。

特定のプロセスのコアダンプの設定方法

Linuxシステムでは、特定のプロセスに対してコアダンプの生成を制御することが可能です。これにより、特定のアプリケーションやサービスの問題解析を行う際に、必要なデータを効率的に収集することができます。以下では、特定のプロセスのコアダンプ設定方法について説明します。

prctl システムコールを使用する方法

prctl() はプログラム内から呼び出すシステムコールで、ここではシェルコマンドではありません。プログラム内から prctl を使用して、そのプロセスのコアダンプ生成の挙動を設定することができます。以下は、prctl を使用してコアダンプを有効にするC言語の例です。

#include <sys/prctl.h>
#include <linux/prctl.h>

int main() {
    // コアダンプ生成を有効にする
    prctl(PR_SET_DUMPABLE, 1);
    // ここにプログラムの主要な処理を書く
}

このコードは、プロセスがダンプファイルを生成できるように PR_SET_DUMPABLE オプションを 1 に設定しています。デフォルトでは、多くのプロセスでこの設定は有効になっていますが、セキュリティの観点から無効に設定されている場合があります。

特定のサービスのコアダンプ設定を変更する

systemdを使用している場合、特定のサービスに対してコアダンプの設定をカスタマイズすることも可能です。通常は対象サービスのドロップインに設定します。例は必要性と保存容量を確認した管理者向けで、無制限化を推奨するものではありません。変更は稼働中プロセスに遡って適用されず、サービスの再起動には業務への影響確認が必要です。

[Service]
# コアダンプの設定をカスタマイズ
LimitCORE=infinity

LimitCORE=infinity は対象サービスの RLIMIT_CORE を無制限にする設定例です。systemd-coredump の保存・処理制限まで無制限になるわけではなく、生成や保存を保証するものでもありません。実環境では必要な上限と収集側の設定を合わせて決めてください。

特定のプロセスやサービスのコアダンプ設定を調整することで、システムのトラブルシューティングをより効率的に行うことができます。これは、開発中のアプリケーションや、特に問題が発生しやすいサービスの分析に特に有効です。

コアダンプ設定のトラブルシューティング

Linuxシステムにおけるコアダンプ設定のトラブルシューティングは、時として必要になります。予期せぬシステムのクラッシュやアプリケーションの異常終了時にコアダンプファイルが生成されない場合、いくつかの一般的な問題とその解決策を検討することが重要です。

コアダンプが生成されない一般的な原因

  1. ディスクスペース不足: コアダンプファイルを保存するための十分なディスクスペースがない場合、ファイルは生成されません。使用可能なディスクスペースを確認し、必要に応じてスペースを確保してください。
  2. コアダンプサイズの制限: ulimit の設定により、コアダンプファイルのサイズが制限されている可能性があります。直接保存かパイプ収集かを確認し、対象プロセスと収集側の上限を調べてください。いきなり無制限にはしません。
  3. セキュリティ設定: 特定のセキュリティ強化機能によって、コアダンプの生成が制限されている場合があります。SELinuxやAppArmorの拒否ログを管理者が確認します。採取だけを目的に保護機能を全面無効化しないでください。

コアダンプ設定の確認と修正

  • カーネルパラメータの確認: kernel.core_pattern の設定を再確認し、コアダンプが期待通りの場所に保存されるように設定されていることを確認してください。
  • プロセスのダンプ可能性: 特定のプロセスが PR_SET_DUMPABLE によってダンプ不可能に設定されていないか確認し、必要に応じて変更してください。
  • システムログの確認: コアダンプ生成に関連するエラーメッセージや情報がシステムログに記録されていないか確認します。dmesg や /var/log/syslog をチェックして、関連するメッセージを探してください。

まとめ

Linuxシステムにおけるコアダンプの設定と管理は、システムやアプリケーションのトラブルシューティングにおいて非常に重要です。この記事では、コアダンプの基本的な概念から、保存場所の確認・変更方法、サイズ制限の設定、特定のプロセスのコアダンプ設定方法、さらにトラブルシューティングのヒントまでを解説しました。これらの情報を活用することで、システムの問題解析を効率的に行い、迅速な問題解決を図ることができるようになります。適切なコアダンプの設定と管理は、安定したシステム運用の基盤を築く上で不可欠です。

参考資料

Linux core(5)
limits.conf(5)
coredumpctl
coredump.conf
systemd.exec
GNU Bash マニュアル

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次