レッドハットの森若です。Red Hat Enteprise Linux 6から、ABRT(Automatic Bug Reporting Tool)が同梱されています。RHELを運用していて、ABRTからのレポートメール「[abrt] full crash report」を受信したことがある方もいるかと思います。今回はRHEL7でのABRTについて見てみましょう。
ABRTとは何か?
RHELに含まれるソフトウェアに何かしらの問題があり、クラッシュしたとしましょう。
レッドハットのサポートへ相談をするときに何をするでしょうか? 問題の再現と情報収集ですね。
問題の解析をする際には、問題発生時にそのソフトウェアが何をしようとしていたか、どのような環境で動作していたか、前後のログはどうであったか、コマンドラインはどうなっていたか、ファイルやメモリをどう使用していたかなどの多数の情報が必要になります。再現して収集するのではなく、これらの情報を最初から収集することができれば、問題解析の初動が非常に早くできます。
ABRTは、ユーザがアプリケーションのクラッシュを発見し、報告する時に必要になる作業を自動化するための仕組みです。ABRTは各種の問題を検出するabrtdと、検出した問題に関連した情報を収集し報告するためのプログラム群でできています。
ABRTのおおまかな動作は以下のようになっています。
- 起動時にabrtdを起動。ログの監視や、各種クラッシュの検出設定を仕込む
- 問題が発生。abrtが問題を検出
- 検出した問題の関連情報をできるだけ収集してファイルに保存
- 管理者へのメール送信などで問題があったことを通知
- レポート送信
ABRTはどのような問題を検出するか?
問題にはいろいろな種類がありますが、現在ABRTが対応する問題は以下のものです。クラッシュなどが発生せず意図しない動作をするような場合には対応できません。
- C/C++, Python, Ruby, Java で作成されたプログラムのクラッシュ
- linux kernel が”OOPS”メッセージを出力した場合
- linux kernel がクラッシュしkdumpを出力した場合
- Xサーバがクラッシュした場合
問題時の情報収集
ABRTが具体的にどのような情報を収集するかは、対応する問題によっても変わりますが、典型的には問題が発見されたプロセスがどのような状態であったかが収集されます。
収集した情報は/var/spool/abrt以下に保存されます。abrt-cliコマンドでその一覧を見ることができます。
# abrt-cli list id cb36e53c4f8d61a7b93520735df0448349ee8936 reason: systemd-logind killed by SIGABRT time: Tue 24 May 2016 10:43:23 AM JST cmdline: /usr/lib/systemd/systemd-logind package: systemd-219-19.el7_2.9 uid: 0 (root) count: 2 Directory: /var/spool/abrt/ccpp-2016-05-24-10:43:23-679 Run 'abrt-cli report /var/spool/abrt/ccpp-2016-05-24-10:43:23-679' for creating a case in Red Hat Customer Portal
この中のDirectoryが対応するディレクトリで、この中に問題に関連する情報が含まれています。
# ls /var/spool/abrt/ccpp-2016-05-24-10 abrt_version dso_list machineid pkg_name type analyzer environ maps pkg_release uid architecture event_log open_fds pkg_version ureports_counter cgroup executable os_info proc_pid_status username cmdline global_pid os_release pwd uuid component hostname package reason var_log_messages core_backtrace kernel pid runlevel coredump last_occurrence pkg_arch sosreport.tar.xz count limits pkg_epoch time
これらの定義については以下のナレッジベースに記載があります。
https://access.redhat.com/articles/2134281
収集した情報をレポート送信
ABRTではレポート送信がlibreportとしてモジュール化されており、レッドハットのカスタマーサポートに送信する他にもメールでの送信やbugzillaへ送信するなどいくつかの処理ができるようになっています。冒頭の「[abrt] full crash report」というメールはABRTがrootユーザ宛にこのレポートを送信したメールです。
RHELのデフォルトでは以下のコマンドにより、レッドハットのカスタマーサポートへレポートを送信できます。このふるまいは /etc/libreport/report_event.conf の設定により変更できます。
# abrt-cli report /var/spool/abrt/ccpp-2016-05-24-10:43:23-679
上記のようにコマンド入力すると、カスタマーポータルヘ接続可能であればアカウント情報を求められたのち、viでレポート入力をおこなってその場でレポートを送信できます。
ABRTの注意点
以上のようにABRTは問題解析を手助けしてくれる強力なツールなのですが、自分でプログラムを開発している場合はABRTの仕組みが邪魔になってしまうことがあります。たとえば同じ問題が繰り返し発生することを想定して、ABRTでは同じプログラムの同じような問題が繰り返されていれば一旦保存したダンプを削除しますが、開発中はこのような動作は望ましくありません。
このような場合には /etc/abrt/abrt-action-save-package-data.conf でABRTの対象外となるパッケージや、ディレクトリ名を指定することで通常のパッケージについてはABRTを利用しつつ自分の作業についてはABRTを使わないような工夫ができるようになっています。
関連ドキュメント
Red Hat Enterprise Linux 7 システム管理者のガイド 「第20章 自動バグ報告ツール (ABRT)」 https://access.redhat.com/documentation/ja-JP/Red_Hat_Enterprise_Linux/7/html/System_Administrators_Guide/ch-abrt.html