カーネルは最新のLinuxシステムではかなり高いレベルの安定性を備えていますが、それでも深刻なシステムエラーの可能性は常に存在します。 回復不能なエラーが発生すると、カーネルパニックと呼ばれる状態が発生します。標準ハンドラーはトラブルシューティングに役立つ情報を表示し、無限ループに入ります。
カーネル障害の原因を診断および分析するために、RedHatの開発者は専用ツールkdumpを開発しました。 その動作原理は次のように簡単に説明できます。 メインとクラッシュの2つのコアが作成されます(メモリダンプの収集に使用されます)。 メインカーネルをロードするとき、特定のメモリサイズが緊急カーネルに割り当てられます。 kexecを使用すると、メインカーネルのパニック中にクラッシュがロードされ、ダンプが収集されます。
この記事では、kdumpを構成し、それを使用してシステムエラーを分析する方法について詳しく説明します。 Ubuntu OCでkdumpを使用する機能を検討します。 他のディストリビューションでは、kdumpのセットアップと構成の手順が大きく異なります。
kdumpをインストールして構成する
コマンドを使用してkdumpをインストールします
$ sudo apt-get install linux-crashdump kdump-tools
Kdump設定は、構成ファイル/ etc / default / kdump-toolsに保存されます
#kdump-tools設定 #------------------------------------------------- -------------------------- #USE_KDUMP-コントロールkdumpが構成されます #0-kdumpカーネルはロードされません #1-kdumpカーネルがロードされ、kdumpが構成されます #KDUMP_SYSCTL-sysctlを使用して、パニックが発生するタイミングを制御します #インターフェイス。 この変数の内容は #「sysctl -w」コマンドの「変数=値...」部分。 #設定されていない場合、デフォルト値「kernel.panic_on_oops = 1」は #使用される。 KDUMP_SYSCTL = ""を設定して、この機能を無効にします #例-oomでもパニック: #KDUMP_SYSCTL = "kernel.panic_on_oops = 1 vm.panic_on_oom = 1" # USE_KDUMP = 1 #KDUMP_SYSCTL = "kernel.panic_on_oops = 1"
kdumpをアクティブにするには、このファイルを編集し、パラメーターUSE_KDUMP = 1の値を設定します。
また、構成ファイルには次のパラメーターが含まれています。
- KDUMP_KERNEL-クラッシュカーネルへのフルパス。
- KDUMP_INITRD-クラッシュカーネルのinitrdへのフルパス。
- KDUMP_CORE-コアダンプファイルが保存される場所を示します。 デフォルトでは、ダンプは/ var / crashディレクトリに保存されます(KDUMP_CORE = / var / crash);
- KDUMP_FAIL_CMD-ダンプの保存中にエラーが発生した場合に実行するアクションを示します(デフォルトでは、reboot -fコマンドが実行されます)。
- DEBUG_KERNEL-動作中のカーネルのデバッグバージョン。 デフォルトでは、/ usr / lib / debug / vmlinux- $が使用されます。 このパラメーターが設定されていない場合、makedumpfileユーティリティはメモリのすべてのページのみをダンプします。
- MAKEDUMP_ARGS-makedumpfileユーティリティに渡される追加の引数が含まれます。 デフォルトでは、このパラメーターの値は「-c -d 31」であり、圧縮を使用し、使用済みのカーネルページのみをダンプに含める必要があることを示します。
必要なパラメーターをすべて設定したら、update-grubコマンドを実行し、パッケージメンテナーのバージョンのインストールを選択します。
次に、システムを再起動し、kdumpが準備完了であることを確認します。
$ cat / proc / cmdline BOOT_IMAGE = / boot / vmlinuz-3.8.0-35-generic root = UUID = bb2ba5e1-48e1-4829-b565-611542b96018 ro crashkernel = 384-:128M quiet splash vt.handoff = 7
パラメーターcrashkernel = 384-:128Mに特に注意してください。 これは、クラッシュカーネルがブート時に128 MBのメモリを使用することを意味します。 grubでcrashkernel = autoパラメータを指定できます。この場合、緊急カーネルのメモリが自動的に割り当てられます。
crashユーティリティを使用してダンプを分析するには、デバッグ情報を含むvmlinuxファイルも必要です。
$ sudo tee /etc/apt/sources.list.d/ddebs.list << EOF deb http://ddebs.ubuntu.com/ $(lsb_release -cs)メイン制限ユニバースマルチバース deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-security main limited universe multiverse deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-メインの制限されたユニバースのマルチバースを更新 deb http://ddebs.ubuntu.com/ $(lsb_release -cs)-proposed main limited universe multiverse Eof $ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ECDCAD72428D7C01 $ sudo apt-get update $ sudo apt-get install linux-image-$(uname -r)-dbgsym
インストールが完了したら、kdumpのステータスを再度確認します。
$ kdump-config status
kdumpが動作している場合、次のメッセージがコンソールに表示されます。
現在の状態:kdump準備完了
kdumpのテスト
次のコマンドでカーネルパニックを引き起こします。
エコーc | sudo tee / proc / sysrq-trigger
それらの実装の結果、システムは「フリーズ」します。
その後、数分以内にダンプが作成され、再起動後に/ var / crashディレクトリで使用可能になります。
カーネルクラッシュ情報は、クラッシュユーティリティを使用して表示できます。
$ sudo crash /usr/lib/debug/boot/vmlinux-3.13.0-24-generic /var/crash/201405051934/dump.201405051934 クラッシュ7.0.3 著作権(C)2002-2013 Red Hat、Inc. 著作権(C)2004、2005、2006、2010 IBM Corporation Copyright(C)1999-2006 Hewlett-Packard Co Copyright(C)2005、2006、2011、2012 Fujitsu Limited Copyright(C)2006、2007 VA Linux Systems Japan KK Copyright(C)2005、2011 NEC Corporation Copyright(C)1999、2002、2007 Silicon Graphics、Inc. 著作権(C)1999、2000、2001、2002 Mission Critical Linux、Inc. このプログラムはフリーソフトウェアであり、GNU General Public Licenseの対象です。 そして、あなたはそれを変更し、そして/または、そのコピーを配布することを歓迎します 特定の条件。 「ヘルプのコピー」と入力して、条件を確認します。 このプログラムには一切の保証がありません。 詳細については、「ヘルプ保証」と入力してください。 GNU gdb(GDB)7.6 Copyright(C)2013 Free Software Foundation、Inc. ライセンスGPLv3 +:GNU GPLバージョン3以降<http://gnu.org/licenses/gpl.html> これはフリーソフトウェアです。自由に変更して再配布できます。 法律で許可されている範囲での保証はありません。 「show copy」と入力します 詳細については「保証を表示」。 このGDBは、「x86_64-unknown-linux-gnu」として構成されました... カーネル:/usr/lib/debug/boot/vmlinux-3.13.0-24-generic ダンプファイル:/var/crash/201405051934/dump.201405051934 [部分ダンプ] CPU:4 日付:月5月5日19:34:38 2014 稼働時間:00:54:46 負荷平均:0.14、0.07、0.05 タスク:495 ノード名:Ubuntu リリース:3.13.0-24-generic バージョン:#46-Ubuntu SMP Thu Apr 10 19:11:08 UTC 2014 マシン:x86_64(2675 Mhz) メモリ:8 GB パニック:「エラー:0002 [#1] SMP」(詳細についてはログを確認してください) PID:7826 コマンド:「ティー」 タスク:ffff8800a2ef8000 [THREAD_INFO:ffff8800a2e68000] CPU:2 状態:TASK_RUNNING(PANIC) クラッシュ>
上記の結論に基づいて、teeコマンドの実行時にCPU2で発生したイベント「Oops:0002 [#1] SMP」がシステム障害の前にあったと結論付けることができます。
クラッシュユーティリティには、カーネルクラッシュの原因を診断するための幅広い機能もあります。 それらをより詳細に検討しましょう。
クラッシュユーティリティを使用したクラッシュの原因の診断
クラッシュは、カーネルクラッシュの前に発生したすべてのシステムイベントに関する情報を保存します。 その助けを借りて、クラッシュ時のシステムの状態を再作成できます。クラッシュ時に実行されていたプロセス、開いていたファイルなどを見つけます。 この情報は、正確な診断を行い、将来のコアクラッシュを防ぐのに役立ちます。
クラッシュユーティリティには、独自のコマンドセットがあります。
$ crash>ヘルプ *ファイルマッハリピートタイマー エイリアスforeach mod runqツリー アスキーフューザーマウントサーチユニオン bt gdb net set vm btopヘルプp sig vtop dev ipcs ps struct waitq dis irq pte swap whatis eval kmem ptob sym wr 出口リストptov sys q ログrdタスクを拡張する クラッシュバージョン:7.0.3 gdbバージョン:7.6 上記のコマンドのヘルプについては、「help <コマンド>」と入力してください。 入力オプションのヘルプについては、「help input」と入力してください。 出力オプションのヘルプについては、「help output」と入力してください。 クラッシュ>
コマンドごとに、次のような簡単なマニュアルを呼び出すことができます。
crash>ヘルプセット
すべてのコマンドについては説明しません(詳細情報はRedHatの公式ユーザーガイドに記載されています)が、最も重要なコマンドについてのみ説明します。
まず、btコマンドに注意を払う必要があります(バックトレースの略語はリバーストレースです)。 その助けを借りて、カーネルメモリの内容に関する詳細情報を見ることができます(詳細と使用例はこちらをご覧ください )。 ただし、多くの場合、カーネルメッセージバッファの内容を時系列で表示するlogコマンドで、システム障害の原因を特定できます。
出力の一部を次に示します。
[3288.251955] CPU:2 PID:7826通信:ティー汚染:PF O 3.13.0-24-generic#46-Ubuntu [3288.251957]ハードウェア名:システムメーカーシステム製品名/ P7P55D LE、BIOS 2003 12/16/2010 [3288.251958]タスク:ffff8800a2ef8000 ti:ffff8800a2e68000 task.ti:ffff8800a2e68000 [3288.251960] RIP:0010:[<ffffffff8144de76>] [<ffffffff8144de76>] sysrq_handle_crash + 0x16 / 0x20 [3288.251963] RSP:0018:ffff8800a2e69e88 EFLAGS:00010082 [3288.251964] RAX:000000000000000f RBX:ffffffff81c9f6a0 RCX:0000000000000000 [3288.251965] RDX:ffff88021fc4ffe0 RSI:ffff88021fc4e3c8 RDI:0000000000000063 [3288.251966] RBP:ffff8800a2e69e88 R08:0000000000000096 R09:0000000000000387 [3288.251968] R10:0000000000000386 R11:0000000000000003 R12:0000000000000063 [3288.251969] R13:0000000000000246 R14:0000000000000004 R15:0000000000000000 [3288.251971] FS:00007fb0f665b740(0000)GS:ffff88021fc40000(0000)knlGS:0000000000000000 [3288.251972] CS:0010 DS:0000 ES:0000 CR0:000000008005003b [3288.251973] CR2:0000000000000000 CR3:00000000368fd000 CR4:00000000000007e0 [3288.251974]スタック: [3288.251975] ffff8800a2e69ec0 ffffffff8144e5f2 0000000000000002 00007fff3cea3850 [3288.251978] ffff8800a2e69f50 0000000000000002 0000000000000008 ffff8800a2e69ed8 [3288.251980] ffffffff8144eaff ffff88021017a900 ffff8800a2e69ef8 ffffffff8121f52d [3288.251983]呼び出しトレース: [3288.251986] [<ffffffff8144e5f2>] __handle_sysrq + 0xa2 / 0x170 [3288.251988] [<ffffffff8144eaff>] write_sysrq_trigger + 0x2f / 0x40 [3288.251992] [<ffffffff8121f52d>] proc_reg_write + 0x3d / 0x80 [3288.251996] [<ffffffff811b9534>] vfs_write + 0xb4 / 0x1f0 [3288.251998] [<ffffffff811b9f69>] SyS_write + 0x49 / 0xa0 [3288.252001] [<ffffffff8172663f>] tracesys + 0xe1 / 0xe6 [3288.252002]コード:65 34 75 e5 4c 89 ef e8 f9 f7 ff ff eb db 0f 1f 80 00 00 00 00 00 66 66 66 66 90 55 c7 05 94 68 a6 00 01 00 00 00 48 89 e5 0f ae f8 <c6 > 04 25 00 00 00 00 00 01 5d c3 66 66 66 66 90 55 31 c0 c7 05 be [3288.252025] RIP [<ffffffff8144de76>] sysrq_handle_crash + 0x16 / 0x20 [3288.252028] RSP <ffff8800a2e69e88> [3288.252029] CR2:0000000000000000
出力行の1つは、システムエラーの原因となったイベントを示します。
[3288.251889] SysRq:クラッシュのトリガー
psコマンドを使用すると、クラッシュ時に実行されていたプロセスのリストを表示できます。
crash> ps PID PPID CPUタスクST%MEM VSZ RSS COMM 0 0 0 ffffffff81a8d020 RU 0.0 0 0 [スワッパー] 1 0 0 ffff88013e7db500 IN 0.0 19356 1544 init 2 0 0 ffff88013e7daaa0 IN 0.0 0 0 [kthreadd] 3 2 0 ffff88013e7da040 IN 0.0 0 0 [移行/ 0] 4 2 0 ffff88013e7e9540 IN 0.0 0 0 [ksoftirqd / 0] 7 2 0 ffff88013dc19500 IN 0.0 0 0 [イベント/ 0]
仮想メモリの使用に関する情報を表示するには、vmコマンドを使用します。
crash> vm PID:5210タスク:ffff8801396f6aa0 CPU:0コマンド: "bash" MM PGD RSS TOTAL_VM ffff88013975d880 ffff88013a0c5000 1808k 108340k VMA開始終了フラグファイル ffff88013a0c4ed0 400000 4d4000 8001875 / bin / bash ffff88013cd63210 3804800000 3804820000 8000875 /lib64/ld-2.12.so ffff880138cf8ed0 3804c00000 3804c02000 8000075 /lib64/libdl-2.12.so
swapコマンドは、コンソールにスワップ領域の使用に関する情報を表示します。
crash>スワップ ファイル名タイプサイズ使用されるPCT優先度 / dm-1パーティション2064376k 0k 0%-1
CPU割り込み情報は、irqコマンドを使用して表示できます。
crash> irq -s CPU0 0:149 IO-APIC-edgeタイマー 1:453 IO-APIC-edge i8042 7:0 IO-APIC-edge parport0 8:0 IO-APIC-edge rtc0 9:0 IO-APIC-fasteoi acpi 12:111 IO-APIC-edge i8042 14:108 IO-APIC-edge ata_piix
filesコマンドを使用して、コンソールで失敗時に開いているファイルを一覧表示できます。
crash>ファイル PID:5210タスク:ffff8801396f6aa0 CPU:0コマンド: "bash" ルート:/ CWD:/ルート FDファイルデンドリノノードタイプパス 0 ffff88013cf76d40 ffff88013a836480 ffff880139b70d48 CHR / tty1 1 ffff88013c4a5d80 ffff88013c90a440 ffff880135992308 REG / proc / sysrq-trigger 255 ffff88013cf76d40 ffff88013a836480 ffff880139b70d48 CHR / tty1
最後に、sysコマンドを使用して、システムの一般的な状態に関する圧縮された情報を取得できます。
crash> sys カーネル:/usr/lib/debug/lib/modules/2.6.32-431.5.1.el6.x86_64/vmlinux DUMPFILE:/var/crash/127.0.0.1-2014-03-26-12:24:39/vmcore [部分ダンプ] CPU:1 日付:2014年3月26日水曜日12:24:36 2014 稼働時間:00:01:32 負荷平均:0.17、0.09、0.03 タスク:159 ノード名:elserver1.abc.com リリース:2.6.32-431.5.1.el6.x86_64 バージョン:#1 SMP Fri Jan 10 14:46:43 EST 2014 マシン:x86_64(2132 Mhz) メモリ:4 GB パニック:「エラー:0002 [#1] SMP」(詳細についてはログを確認してください)
おわりに
核崩壊の原因の分析と診断は非常に具体的で複雑なトピックであり、1つの記事の枠組みに当てはめることはできません。 次の出版物でそれに戻ります。
もっと知りたい人のために-いくつかの便利なリンク:
ここにコメントを投稿できない読者は、私たちのブログに参加してください。