第18章 kexec と kdump

目次

18.1. 概要
18.2. 必要なパッケージ
18.3. kexec の内側
18.4. 基本的な kexec の使用方法
18.5. kexec を頻繁な再起動用に設定する方法
18.6. 基本的な kdump の設定
18.7. クラッシュダンプの解析
18.8. 高度な kdump 設定
18.9. さらなる情報

kexec は現在実行中のカーネルとは別のカーネルを起動するためのツールです。 これにより、ハードウエアの初期化作業を省略して、より高速なシステムの起動を 行なうことができます。またシステムがクラッシュした場合に備え、他のカーネルを 起動するための準備としても利用することができます。

18.1. 概要

kexec を利用することで、ハードウエア側の再起動を利用することなく、実行中の カーネルを入れ替えることができます。このツールは下記のような理由により、 便利な仕組みになっています:

  • より高速なシステム再起動のため

    何らかの理由でシステムを定期的に再起動しなければならない場合、 kexec は再起動にかかる時間を削減することができます。

  • 信頼できないファームウエアやハードウエアの回避のため

    コンピュータのハードウエアは複雑なものになってしまっていて、 重大な問題がシステムの起動時に発生してしまう場合があります。このような 場合、即時に信頼のできないハードウエアを取り替える必要がありますが、 kexec を利用することで、ハードウエアが既に初期化された、制御可能な 状態でカーネルを起動することができます。これによって、システムの 起動が失敗してしまうリスクを最小限に抑えることができます。

  • クラッシュしたカーネルのダンプ保存のため

    kexec は物理メモリ内の内容を保持するような仕組みになっています。 本番用 として使用しているカーネルの動作に何らかの 問題が発生した場合、 キャプチャ 専用のカーネル (予約された メモリの範囲内で動作する追加のカーネル) が動作して、問題が発生したときの状態を 保存することができます。保存されたイメージは、さらなる分析のために利用する ことができるようになります。

  • GRUB や LILO の設定を使用しない起動のため

    kexec を利用してカーネルを起動する場合、ブートローダの手順を飛ばして 動作します。これにより、通常の起動処理が、ブートローダ側の設定ミスに よって失敗してしまうようなリスクを防ぐことができます。 kexec では、 既存のブートローダ設定を使用しません。

18.2. 必要なパッケージ

openSUSE® 上で kexec を再起動の高速化や潜在的なハードウエア 問題を避けるために使用したい場合は、 kexec-tools パッケージをインストールする必要があります。このパッケージには kexec-bootloader というスクリプトが含まれていて、ここから ブートローダの設定を読み込み、 kexec を通常のブートローダが 行なうのと同じオプション設定でカーネルを起動することができます。 kexec-bootloader -h を実行すると、 利用可能なオプション一覧を表示することができます。

カーネルクラッシュの際に、有益なデバッグ情報を取得できるように環境を設定 するには、さらに makedumpfile パッケージを インストールする必要があります。

openSUSE で kdump を使用する際には、 YaST の Kdump モジュールを使用 するのがお勧めです。シェルを起動して root の状態になり、 zypper install yast2-kdump を実行し、 yast2-kdump パッケージをインストールしてください。

18.3. kexec の内側

kexec で最も重要なコンポーネントは /sbin/kexec コマンドです。 kexec を利用してカーネルを読み込む際、 2 種類の方法で 読み込むことができます:

  • kexec -l カーネルイメージ として実行すると、通常の再起動のように、本番のカーネルが 存在するアドレス領域にカーネルを読み込むことができます。読み込んだ後は、 kexec -e でカーネルを起動することが できます。

  • kexec -p カーネルイメージ として実行すると、カーネルを予約領域内に読み込むことができます。 これにより、このカーネルはシステムクラッシュ時に自動起動されるように なります。

システムがクラッシュした場合に他のカーネルを起動し、本番用としてそれまで 使用していたカーネルのデータを保持したい場合は、システムメモリ内に専用の 領域を予約しておく必要があります。このとき、本番用のカーネルはその領域を 使用することはなく、常に空けたままの状態にしておきます。この領域はキャプチャ 作業用のカーネルのもので、それまで使用していた本番カーネルの領域を保持 するために用意します。メモリ領域の予約を行なうには、本番カーネルの起動時に crashkernel = サイズ@オフセット というパラメータを設定します。なお、このパラメータはキャプチャ作業用の カーネルパラメータではありません。キャプチャカーネル側では kexec を使用 することはありません。

キャプチャカーネルは予約用の領域に読み込まれ、カーネルがクラッシュするのを 待機します。 kdump は本番カーネルがクラッシュすると、キャプチャカーネル側 を実行しようとします。これは本番用に使用していたカーネルは、その時点では 既に信頼できるものではないためです。このことから、場合によっては kdump が失敗する場合もあります。

キャプチャカーネルを読み込むには、カーネルの起動パラメータ内にそれらを設定 します。通常は初期 RAM ファイルシステム (initrd) を使用して設定します。 初期 RAM ファイルシステムは --initrd = ファイル名 の形式で指定します。また、 --append = コマンドライン のように指定すると、起動するカーネルに対してコマンドラインオプションを追加 することができます。これは本番用のカーネルに設定されていた、カーネルの起動に 必要なオプションを設定するのに便利な機能です。本番用のカーネルに設定されて いるものをコピーするだけであれば --append = "$(cat /proc/cmdline)" と設定してもかまいません し、 --append = "$(cat /proc/cmdline) 追加オプション" として追加のものを設定してもかまいません。

なお、読み込み済みのカーネルはいつでも読み込みを解除することができます。 -l オプションで読み込んだカーネルの読み込みを解除する には、 kexec -u コマンドを使用します。 -p オプションで読み込んだクラッシュカーネルの読み込みを 解除するには、 kexec -p -u コマンドを使用します。

18.4. 基本的な kexec の使用方法

お使いの kexec 環境が正しく動作することを確認するには、下記の手順を 実施します:

  1. 現在ログイン中のユーザが存在せず、重要なサービスについてもシステム上で 動作していないことを確認します。

  2. root でログインします。

  3. telinit 1 を実行して、ランレベル 1 に移行します。

  4. 本番用のカーネル内にあるアドレス領域に対して、新しいカーネルを読み込む には、下記のように実行します:

    kexec -l /boot/vmlinuz --append="$(cat /proc/cmdline)" --initrd=/boot/initrd

  5. ルートファイルシステムを除き、すべてのマウント済みファイルシステム のマウントを umount -a で解除 します。

    [Important]ルートファイルシステムのマウント解除について

    ファイルシステムのマウントを解除する場合、よく発生するのが device is busy という警告メッセージです。 ルートファイルシステムは、システムが動作中の場合にはマウントを解除 できませんので、警告メッセージは無視してかまいません。

  6. ルートファイルシステムを読み込み専用モードで再マウントします:

    mount -o remount,ro /

  7. kexec -e を実行し、 ステップ 4 で読み込んでおいた カーネルで起動を行ないます。

以前に読み書き可能な状態でマウントしていたディスクボリュームについて、 これらのマウントを解除する作業が重要な点です。これは、 reboot のシステムコールが呼び出されるとすぐに 動作してしまうため、読み書き可能な状態で マウントされているハードディスクドライブのボリュームが存在すると、自動では 同期もマウント解除も行なわれないためです。この場合は、新しいカーネルが それらを 汚れた 状態にあるものとして認識します。読み込み 専用のディスクボリュームと、仮想的なファイルシステムについては、マウント を解除する必要はありません。マウントを解除すべきファイルシステムの 一覧を得たい場合は、 /etc/mtab ファイルをお読み ください。

新しい方のカーネルは、古いほうのカーネル内のアドレス領域内に読み込まれた あと、古いカーネルを置き換えて動作し、即時に制御を獲得します。これにより、 通常の起動メッセージが表示されます。また、新しいカーネルが起動すると、 すべてのハードウエア初期化作業とファームウエアチェックが飛ばされます。 このとき、一切の警告メッセージが表示されないことを確認してください。 すべてのファイルシステムは、以前の段階でマウント解除されていれば、 正常な (汚れてはいない) 状態になります。

18.5. kexec を頻繁な再起動用に設定する方法

kexec は頻繁に再起動するような環境でしばしば使用されます。また、たとえば ハードウエアの検出ルーチンを実行するのに長い時間がかかる場合や、起動そのものが 信頼できないような環境でも使用します。

[Note]kexec を利用した再起動

openSUSE® の以前のバージョンでは、設定ファイル /etc/sysconfig/shutdown/etc/init.d/halt を編集して、システムの再起動の際に kexec を利用するように設定する必要がありました。現行のバージョンでは システムファイルを手作業で編集する必要はありません。バージョン 11 以降で あれば、既に kexec を利用するように設定されているためです。

なお、ブートローダとファームウエアについては、 kexec を利用した再起動の 際には使用されることはないことに注意してください。ブートローダに対して 行なった変更が存在する場合、実際の (ハードウエアの) 再起動を行なわない 限り、設定は無視されます。

18.6. 基本的な kdump の設定

kdump を使用することで、カーネルのダンプを保存することができます。カーネル がクラッシュした場合、クラッシュした環境内のメモリイメージをファイル システムにコピーしておくことで、カーネルクラッシュの原因を調べることが できるためです。これを コアダンプ と呼びます。

kdump は kexec (詳しくは 第18章 kexec と kdump をお読みください) に似た動作をします。キャプチャカーネルは本番用のカーネルがクラッシュした 後に動作し始めるもので、 kexec では本番用のカーネルがキャプチャカーネルに 置き換わる動作をしていましたが、 kdump ではクラッシュした本番用のカーネルが 存在するメモリ領域について、以前と同じくアクセスできるという点が異なります。 このことから、 kdump カーネルの環境内からクラッシュしたカーネルのメモリ スナップショットを採取することができるようになっています。

kdump は手作業で設定することができるほか、 YaST を利用して行なうことも できます。

18.6.1. 手作業での kdump 設定

kdump は自身の設定を /etc/sysconfig/kdump ファイル から読み込みます。お使いのシステムで kdump が動作することを確認するには、 まず既定の設定ファイルを利用して行なってください。 kdump を既定の設定の まま使用するには、下記のような手順で行ないます:

  1. お使いのブートローダの設定ファイルに、下記のようなカーネルのコマンドライン オプションを追加して、システムを再起動します:

    crashkernel=サイズ@オフセット

    それぞれ サイズオフセット の値には、下記の表に書かれている値を指定します:

    表18.1 追加のカーネルコマンドラインパラメータに対する推奨値

    アーキテクチャ

    推奨値

    i386 および x86-64

    crashkernel=256M: 0 - 12 GB 以下のメモリ 搭載量の場合
    crashkernel=512M: 13 - 48 GB 程度のメモリ 搭載量の場合
    crashkernel=1G: 49 - 128 GB 程度のメモリ 搭載量の場合
    crashkernel=2G: 129 - 256 GB 程度のメモリ 搭載量の場合

    IA64

    crashkernel=256M (小規模システムの場合) または crashkernel=512M (大規模システムの場合)

    ppc64

    crashkernel=128M@4M または crashkernel=256M@M4 (大規模システムの場合)


  2. kdump 初期化スクリプトを有効にします:

    chkconfig boot.kdump on

  3. /etc/sysconfig/kdump 内のオプション設定を修正する こともできます。それぞれ値の意味については、それぞれコメント欄に 書かれている説明をお読みください。

  4. rckdump start の初期化 スクリプトを実行するか、もしくはシステムを再起動します。

kdump を既定値で設定したあとは、期待通りに動作することを確認します。 なお動作確認を行なう際には、お使いのシステムに誰もログインしていないこと、 および重要なサービスが動作していないことを確認しておいてください。 動作確認は下記のようにして行ないます:

  1. telinit 1 を実行して、 ランレベル 1 に切り替えます。

  2. ルートファイルシステムを除く、すべてのディスクのファイルシステムについて マウントを解除します。これは umount -a を実行すると実施することができます。

  3. ルートファイルシステムについては、読み込み専用モードで再マウント します: mount -o remount,ro /

  4. Magic SysRq キーに対する procfs のインターフェイスを 利用して、 カーネルパニック を発生させます:

    echo c >/proc/sysrq-trigger

[Important]カーネルダンプのサイズ

KDUMP_KEEP_OLD_DUMPS オプションでは、カーネルダンプを 保持する個数を制御することができます (既定値は 5 です) 。圧縮を行なわない 場合、ダンプのサイズは最大で物理メモリの搭載量に等しくなります。 /var のパーティション内に必要な容量があるかどうかを 確認してください。

キャプチャカーネルが起動すると、クラッシュしたほうのカーネルについて、 メモリのスナップショットがファイルシステム内に保存されます。保存先のパスは KDUMP_SAVEDIR オプションで設定し、既定では /var/crash に設定されています。また、 KDUMP_IMMEDIATE_REBOOTyes に設定 すると、システムはその後本番用のカーネルを利用して再起動します。 再起動が完了したらログインを行なうと、 /var/crash 内のダンプを確認することができるようになります。

[Warning]X11 セッション内での画面フリーズ

X11 セッションにログインしている状態で kdump の制御下に移行すると、 画面には全く表示がなされないまま画面の動きが止まり (フリーズし) ます。 kdump の動きのうちのいくつかは表示から確認することができます (たとえば画面上に起動中のカーネルに関する形の崩れたメッセージが現われたり します) 。

このような場合でも、コンピュータをリセットしたりはしないでください。 kdump が動作を完了するのにしばらくの時間が必要であるためです。

18.6.2. YaST の設定

kdump を YaST から設定するには、まず yast2-kdump パッケージをインストールする必要があります。インストールが完了したら、 root から YaST コントロールセンター の システム カテゴリ内にある カーネル Kdump モジュールを起動するか、もしくは コマンドラインで yast2 kdump と入力します。

図18.1 YaST2 kdump モジュール - スタートアップページ

YaST2 kdump モジュール - スタートアップページ

まず 起動 ウインドウでは、 Kdump の有効化 を選択します。 kdump メモリについては既定値のままでかまいません。ほとんどの システムで十分な値になっているためです。

次に左側の一覧で ダンプフィルタ を選択します。ここでは ダンプにどのページを含めるかを設定します。カーネルの問題をデバッグするに あたっては、下記のメモリ内容については含めなくてもかまいません:

  • ゼロで埋められたページ

  • ページのキャッシュ

  • ユーザデータページ

  • 使われていないページ

さらに ダンプ先 のウインドウでは、ダンプの保存先の種類 と保存先の URL を指定します。 FTP や SSH などのネットワークプロトコルを 選択した場合は、必要なアクセス情報についても設定を行なう必要があります。

続いて 電子メール通知 のウインドウでは、 kdump に対して 電子メールを介した通知を送信させるための設定を行なうことができます。 各項目を設定し終えたら、 OK を押してウインドウを閉じて ください。なお、 熟練者向け設定 ウインドウを利用して より細かい設定を行なうこともできます。これで kdump の設定は完了です。

18.7. クラッシュダンプの解析

ダンプファイルを採取したら、次はそれを解析する段階です。これにはいくつかの 方法があります。

ダンプを解析する際のもっとも原始的なツールが GDB です。もちろん最新の環境でも GDB を利用することができますが、いくつかの不都合や制限があります:

  • GDB はカーネルダンプのデバッグ用に特化した作りにはなっていません。

  • GDB は 32 ビットプラットフォームにおいて、 ELF64 バイナリには 対応していません。

  • GDB は ELF ダンプ以外の形式を解釈できません (圧縮ダンプにも対応して いません) 。

上記のような問題により、 crash ユーティリティが 作成されるようになりました。 crash ユーティリティは クラッシュダンプを解析するほか、動作中のシステムからでもデバッグを行なう ことができます。また、 Linux カーネルのデバッグ固有の機能も提供されて いて、より高度なデバッグ作業に便利な作りになっています。

Linux カーネルをデバッグしたい場合は、デバッグ情報のパッケージについても あらかじめインストールしておく必要があります。お使いのシステムに該当する パッケージがインストールされているかどうかを確認するには、 zypper se kernel | grep debug を実行してください。

[Important]デバッグ情報のパッケージリポジトリ

お使いのシステムでオンライン更新の購読を行なっている場合、 debuginfo パッケージは *-Debuginfo-Updates という名称のオンラインインストールリポジトリ内に存在しています。 YaST を利用してリポジトリを有効に設定してください。

お使いのマシンで採取されたダンプを crash で開くには、 下記のようなコマンドを実行します:

crash /boot/vmlinux-2.6.32.8-0.1-default.gz /var/crash/2010-04-23-11\:17/vmcore

最初のパラメータではカーネルイメージを指定します。 2 つめのパラメータでは kdump で採取されたダンプファイルを指定します。ダンプファイルは、既定では /var/crash ディレクトリ内に保存されます。

18.7.1. カーネルのバイナリフォーマット

Linux カーネルは Executable and Linkable Format (ELF) という形式で作成 されています。このファイルは通常 vmlinux と呼ばれ、 コンパイル処理の際に直接作成されます。すべてのブートローダでサポート されているというわけではありません (特に x86 環境 (i386, x86_64) 以外) では ELF バイナリに対応しています。 openSUSE® でサポートされる アーキテクチャでは、それぞれ下記のような解決方法があります。

18.7.1.1. x86 (i386 および x86_64)

多くは歴史上の経緯によるものですが、 Linux カーネルは 2 種類のパートから 構成されます: 1 つは Linux カーネルそれ自身 (vmlinux) 、 もう 1 つはブートローダが実行するセットアップコードです。

これら 2 つのパートは bzImage と呼ばれるファイルに まとめられます。このファイルはカーネルのソースツリー内に存在するはずの ものです。このファイルは現在では、 vmlinuz (x ではなく z であることに注意 してください) とカーネルパッケージ内で呼ばれます。

ELF イメージは x86 環境では直接使用されることはありません。そのため、 カーネルパッケージの本体である vmlinux ファイルは、 圧縮された vmlinux.gz という形式で配置されます。

要約すると、 x86 環境の SUSE カーネルパッケージには、 2 種類の カーネルファイルが存在することになります:

  • ブートローダで実行される vmlinuz ファイル。

  • crash や GDB で利用する圧縮 ELF イメージ vmlinux.gz ファイル。

18.7.1.2. IA64

IA64 アーキテクチャ上で Linux カーネルを起動するためのブートローダ elilo では、特に何らかの作業を行なわなくても ELF 形式の読み込みに対応しています (圧縮されているものにも対応しています) 。 IA64 のカーネルパッケージには vmlinuz と呼ばれる 圧縮 ELF イメージのファイルのみが含まれていて、これは x86 環境における vmlinux.gz ファイルと同じ形式のものになっています。

18.7.1.3. PPC および PPC64

PPC 環境では yaboot ブートローダを使用しますが、 このブートローダは ELF イメージの読み込みには対応しているものの、圧縮された 形式には対応していません。そのため、 PPC 版のカーネルパッケージには、 ELF 形式の Linux カーネルファイル vmlinux だけが 存在しています。 crash を使用するにあたっては、 もっとも扱いやすいアーキテクチャであると言えます。

他のマシンでダンプを解析しようとしている場合は、まずコンピュータの アーキテクチャと、デバッグに必要なファイルが存在しているかどうかを確認 しなければなりません。

他のコンピュータでダンプを解析するにあたっては、そのマシンでは同じ アーキテクチャの Linux システムを動作させる必要があります。互換性を確認 するには、両方のコンピュータで uname -i を実行し、出力が同じであることを確認してください。

なお、他のコンピュータでダンプを解析する場合は、 kernelkernel debug パッケージに含まれるファイルも 必要となることに注意してください。

  1. まずはカーネルダンプと、 /boot ディレクトリに あるカーネルイメージを用意します。また、関連するデバッグ情報ファイルを /usr/lib/debug/boot ディレクトリから専用の 単一ディレクトリにコピーします。

  2. あわせて /lib/modules/$(uname -r)/kernel/ ディレクトリにあるカーネルモジュールと、 /usr/lib/debug/lib/modules/$(uname -r)/kernel/ ディレクトリにある関連するデバッグ情報ファイルをコピーします。 コピー先は modules というサブディレクトリに行なって ください。

  3. ダンプとカーネルイメージ、およびカーネルのデバッグ情報ファイル、そして modules サブディレクトリが存在する状態で、 crash ユーティリティを起動します: crash vmlinux-(バージョン) vmcore

[Note]カーネルイメージに対するサポート

圧縮されたカーネルイメージ (gzip による圧縮形式で、 bzImage ファイルは 除きます) への対応については、 SUSE パッケージでは openSUSE® 11 以降の バージョンで対応しています。古いバージョンをお使いの場合は、 vmlinux.gz (x86 アーキテクチャの場合) または vmlinuz (IA64 アーキテクチャの場合) の圧縮を解除し、 vmlinux に展開しておく必要があります。

どのコンピュータでダンプの解析を行なう場合であっても、 crash ユーティリティは 下記のような出力を行ないます:

tux@mercury:~> crash /boot/vmlinux-2.6.32.8-0.1-default.gz
/var/crash/2010-04-23-11\:17/vmcore

crash 4.0-7.6
Copyright (C) 2002, 2003, 2004, 2005, 2006, 2007, 2008  Red Hat, Inc.
Copyright (C) 2004, 2005, 2006  IBM Corporation
Copyright (C) 1999-2006  Hewlett-Packard Co
Copyright (C) 2005, 2006  Fujitsu Limited
Copyright (C) 2006, 2007  VA Linux Systems Japan K.K.
Copyright (C) 2005  NEC Corporation
Copyright (C) 1999, 2002, 2007  Silicon Graphics, Inc.
Copyright (C) 1999, 2000, 2001, 2002  Mission Critical Linux, Inc.
This program is free software, covered by the GNU General Public License,
and you are welcome to change it and/or distribute copies of it under
certain conditions.  Enter "help copying" to see the conditions.
This program has absolutely no warranty.  Enter "help warranty" for details.

GNU gdb 6.1
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu"...

      KERNEL: /boot/vmlinux-2.6.32.8-0.1-default.gz
   DEBUGINFO: /usr/lib/debug/boot/vmlinux-2.6.32.8-0.1-default.debug
    DUMPFILE: /var/crash/2009-04-23-11:17/vmcore
        CPUS: 2
        DATE: Thu Apr 23 13:17:01 2010
      UPTIME: 00:10:41
LOAD AVERAGE: 0.01, 0.09, 0.09
       TASKS: 42
    NODENAME: eros
     RELEASE: 2.6.32.8-0.1-default
     VERSION: #1 SMP 2010-03-31 14:50:44 +0200
     MACHINE: x86_64  (2999 Mhz)
      MEMORY: 1 GB
       PANIC: "SysRq : Trigger a crashdump"
         PID: 9446
     COMMAND: "bash"
        TASK: ffff88003a57c3c0  [THREAD_INFO: ffff880037168000]
         CPU: 1
       STATE: TASK_RUNNING (SYSRQ)
crash>

コマンドの出力では、最初に有益な情報が出力されます。上記の例では、クラッシュ 時点で 42 個のタスクが存在していて、クラッシュの原因はプロセス ID (PID) 9446 による SysRq トリガーであることが示されています。また、原因となったプロセスは Bash プロセスであることが示されています。これは前述の例で、 echo コマンドという Bash シェルの内部コマンドを利用した ことによるものです。

crash ユーティリティはその後 GDB を起動し、多数の追加 コマンドを提供します。たとえば bt コマンドをパラメータ 無しで入力すると、クラッシュが発生した時点でのタスクに対して、バックトレースを 表示させることができます:

crash> bt
PID: 9446   TASK: ffff88003a57c3c0  CPU: 1   COMMAND: "bash"
 #0 [ffff880037169db0] crash_kexec at ffffffff80268fd6
 #1 [ffff880037169e80] __handle_sysrq at ffffffff803d50ed
 #2 [ffff880037169ec0] write_sysrq_trigger at ffffffff802f6fc5
 #3 [ffff880037169ed0] proc_reg_write at ffffffff802f068b
 #4 [ffff880037169f10] vfs_write at ffffffff802b1aba
 #5 [ffff880037169f40] sys_write at ffffffff802b1c1f
 #6 [ffff880037169f80] system_call_fastpath at ffffffff8020bfbb
    RIP: 00007fa958991f60  RSP: 00007fff61330390  RFLAGS: 00010246
    RAX: 0000000000000001  RBX: ffffffff8020bfbb  RCX: 0000000000000001
    RDX: 0000000000000002  RSI: 00007fa959284000  RDI: 0000000000000001
    RBP: 0000000000000002   R8: 00007fa9592516f0   R9: 00007fa958c209c0
    R10: 00007fa958c209c0  R11: 0000000000000246  R12: 00007fa958c1f780
    R13: 00007fa959284000  R14: 0000000000000002  R15: 00000000595569d0
    ORIG_RAX: 0000000000000001  CS: 0033  SS: 002b
crash>

ここでようやく何が行なっているのかが明確になります。内部コマンドである echo/proc/sysrq-trigger というファイルに対して文字を送信します。対応するハンドラがその文字を認識 し、 crash_kexec() 関数を呼び出します。この関数は panic() を呼び出し、 kdump がダンプを保存する動作を 行なっていたことになります。

基本的な GDB コマンドや bt の拡張版に加え、 crash ユーティリティでは Linux カーネルの構造に対応した数多くのコマンドが用意されて います。これらのコマンドは Linux カーネルの内部データ構造を理解するもので、 それらの内容を人間にとって読み取りやすい形式で表示します。たとえばクラッシュが 発生した時点でのタスク一覧を表示させたい場合は、 ps コマンドを利用します。また sym コマンドでは、すべての カーネルシンボル情報と対応するアドレスを一覧表示することができるほか、個別の シンボルに対してアドレスを表示することもできます。それ以外にも files コマンドでは、プロセスが開いているすべてのファイル ディスクリプタを表示することができます。さらに kmem では、 カーネルのメモリ使用に関する詳細な情報を得ることもできます。それ以外にも、 vm コマンドではプロセスの仮想メモリや個別のページマッピングに 対して調査を行なうことができます。これ以外にも便利なコマンドが多数用意されて いて、様々なオプション指定を行なうことができるようになっています。

上述のコマンドは、いずれも一般的な Linux コマンドである pslsof などの機能に対応しています。デバッガを利用して正確な イベント順序を調査したい場合は、 GDB の使い方に関する知識を得て、高度なデバッグ 技術を習得しておく必要があります。これらの知識や技術は本ドキュメントの範疇外で あるため、説明は行なっていません。加えて、 Linux カーネルに関する知識も必要と なります。いくつかの有益な参照情報源については、このドキュメントの末尾に示して います。

18.8. 高度な kdump 設定

kdump の設定は /etc/sysconfig/kdump ファイル内に保存されて います。 YaST を利用して設定することもできます。 YaST を利用した設定を行なう 場合は、 YaST コントロールセンター から システム+カーネル Kdump を選択してください。それぞれ下記に示す kdump オプションが便利でしょう:

カーネルダンプを出力するディレクトリを指定するには、 KDUMP_SAVEDIR オプションを使用します。なお、カーネルダンプのファイルサイズは非常に大きくなる可能性が あることに注意してください。 kdump は、ディスクの空き容量からダンプファイルの見積もり サイズを引いた値が KDUMP_FREE_DISK_SIZE オプションで指定した値 よりも少ない場合、ダンプの保存を拒否します。また、 KDUMP_SAVEDIR では URL 形式 (プロトコル://仕様) で指定を行なうことができます。ここで プロトコルfile, ftp, sftp, nfs, cifs のいずれかを指定し、 仕様 にはそれぞれの プロトコルにあった指定を行ないます。たとえば FTP サーバ上にカーネルダンプを保存する には、 ftp://ユーザ名:パスワード@ftp.example.com:123/var/crash のように指定します。

カーネルダンプは前述の通り非常に大きくなるものであり、分析には不要な多くのページ情報が 含まれています。 KDUMP_DUMPLEVEL オプションでは、不要なページ 情報を省略するかどうかを設定することができます。このオプションでは 0 から 31 までの 整数を指定します。 0 を指定した場合は、ダンプファイルが 最も大きくなります。逆に 31 を指定すると、最も小さい ダンプファイルを生成する意味になります。指定可能な値に関する詳細情報については、 kdump のマニュアルページ (man 7 kdump) をお読みください。

また、カーネルダンプのサイズを小さくする方法がもう 1 つあります。たとえばネットワーク を介してダンプを転送する場合や、ダンプディレクトリにディスク領域を残しておきたいような 場合は、 KDUMP_DUMPFORMATcompressed (圧縮する) を設定してください。 crash ユーティリティでは、圧縮された ダンプに対する動的な展開にも対応しています。

[Important]kdump 設定ファイルの変更

/etc/sysconfig/kdump ファイルを手作業で編集した場合は、編集後に rckdump restart を実行する必要があります。これを実行しない場合、 システムを再起動するまで変更点が反映されません。

18.9. さらなる情報

本ドキュメントでは kexec や kdump の使用方法に関してすべての範囲を網羅できていません。 それぞれ下記に示す情報資源を参照して必要な情報を得てください:

crash によるダンプ分析や、デバッグツールに関する詳細な情報は、 それぞれ下記をお読みください:

  • GDB の info ページ (info gdb) に加え、印刷もできる形式の ガイド資料が http://sourceware.org/gdb/documentation/ (英語) で公開されています。

  • crash ユーティリティの使用方法に関する説明用のホワイトペーパーが http://people.redhat.com/anderson/crash_whitepaper/ (英語) で公開されています。

  • crash ユーティリティでは完全なオンラインヘルプも用意されています。特定のコマンド に対してオンラインヘルプを表示させたい場合は、 help コマンド を実行してください。

  • 必要な Perl 技術をお持ちの場合は、 Alicia を利用してデバッグを簡素化することも できます。この Perl ベースの crash ユーティリティ向けフロントエンドは、 http://alicia.sourceforge.net/ (英語) で公開されています。

  • Perl ではなく Python をご希望の場合は、 Pykdump というツールをインストールする こともできます。このパッケージは Python スクリプトから GDB を制御することが できるもので、 http://sf.net/projects/pykdump (英語) から ダウンロード可能です。

  • Linux カーネルの内部に関する広範囲の概要を知りたい場合は、 Daniel P. Bovet 氏と Marco Cesati 氏が書かれた 詳解 Linuxカーネル (原文: ISBN 978-0-596-00565-8) (日本語訳: ISBN 978-4873113135) を お読みください。


openSUSE システム分析とチューニングガイド 13.1