GNU/Linux >> Linux の 問題 >  >> Linux

Linux カーネル クラッシュ分析に kdump を使用する方法

Kdump は、システム クラッシュが発生した場合にシステム コア ダンプをキャプチャするために使用されるユーティリティです。

これらのキャプチャされたコア ダンプを後で使用して、システム障害の正確な原因を分析し、将来のクラッシュを防ぐために必要な修正を実装できます。

Kdump は、crashkernel と呼ばれるセカンダリ カーネル用にメモリのごく一部を予約します。

このセカンダリ カーネルまたはクラッシュ カーネルは、システムがクラッシュするたびにコア ダンプ イメージをキャプチャするために使用されます。

1. Kdump ツールをインストール

まず、kexec-tools パッケージの一部である kdump をインストールします。

# yum install kexec-tools

2. grub.conf に crashkernel を設定

パッケージをインストールしたら、/boot/grub/grub.conf ファイルを編集して、kdump クラッシュ カーネル用に予約するメモリ量を設定します。

値 crashkernel の /boot/grub/grub.conf を編集して、auto またはユーザー指定の値に設定できます。 2G 以上のメモリを搭載したマシンでは、最低でも 128M を使用することをお勧めします。

次の例では、「kernel」で始まる行を探します。ここでは、「crashkernel=auto」に設定されています。

# vi /boot/grub/grub.conf
default=0
timeout=5
splashimage=(hd0,0)/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux (2.6.32-419.el6.x86_64)
  root (hd0,0)
  kernel /vmlinuz-2.6.32-419.el6.x86_64 ro root=/dev/mapper/VolGroup-lv_root rd_NO_LUKS LANG=en_US.UTF-8 rd_NO_MD rd_LVM_LV=VolGroup/lv_swap SYSFONT=latarcyrheb-sun16 crashkernel=auto rd_LVM_LV=VolGroup/lv_root  KEYBOARDTYPE=pc KEYTABLE=us rd_NO_DM rhgb quiet
  initrd /initramfs-2.6.32-419.el6.x86_64.img

3.ダンプの場所を構成

カーネルがクラッシュすると、/etc/kdump.conf で定義された設定に基づいて、ローカル ファイルシステムまたはリモート ファイルシステム (NFS) にコア ダンプをキャプチャできます (SLES オペレーティング システムでは、パスは /etc/sysconfig/kdump です)。

このファイルは、kexec-tools パッケージのインストール時に自動的に作成されます。

このファイルのすべてのエントリは、デフォルトでコメント アウトされます。最適なオプションに必要なもののコメントを外すことができます。

# vi /etc/kdump.conf
#raw /dev/sda5
#ext4 /dev/sda3
#ext4 LABEL=/boot
#ext4 UUID=03138356-5e61-4ab3-b58e-27507ac41937
#net my.server.com:/export/tmp
#net [email protected]
path /var/crash
core_collector makedumpfile -c --message-level 1 -d 31
#core_collector scp
#core_collector cp --sparse=always
#extra_bins /bin/cp
#link_delay 60
#kdump_post /var/crash/scripts/kdump-post.sh
#extra_bins /usr/bin/lftp
#disk_timeout 30
#extra_modules gfs2
#options modulename options
#default shell
#debug_mem_level 0
#force_rebuild 1
#sshkey /root/.ssh/kdump_id_rsa

上記のファイル内:

  • ダンプを raw デバイスに書き込むには、「raw /dev/sda5」のコメントを解除し、正しいダンプの場所を指すように変更します。
  • ダンプの場所のパスを変更する場合は、コメントを外して「path /var/crash」を新しい場所を指すように変更してください。
  • NFS の場合、「#net my.server.com:/export/tmp」のコメントを外して、現在の NFS サーバーの場所を指定できます。

4.コア コレクターの構成

次のステップは、Kdump 構成ファイルでコア コレクターを構成することです。キャプチャしたデータを圧縮し、キャプチャしたコア ファイルから不要な情報をすべてフィルタリングすることが重要です。

コア コレクターを有効にするには、core_collector で始まる次の行のコメントを外します。

core_collector makedumpfile -c --message-level 1 -d 31
  • core_collector で指定された makedumpfile は、実際にはデータを圧縮して小さな DUMPFILE を作成します。
  • makedumpfile は 2 つの DUMPFILE 形式 (ELF 形式と kdump 圧縮形式) を提供します。
  • デフォルトでは、makedumpfile は kdump 圧縮形式で DUMPFILE を作成します。
  • kdump で圧縮された形式は、クラッシュ ユーティリティでのみ読み取ることができ、圧縮がサポートされているため、ELF 形式よりも小さくすることができます。
  • ELF 形式は、GDB およびクラッシュ ユーティリティで読み取り可能です。
  • -c はダンプデータをページごとに圧縮します
  • -d は不要で無視できるページ数です。

行 #default shell のコメントを外すと、kdump がコアの収集に失敗した場合にシェルが呼び出されます。その後、管理者は makedumpfile コマンドを使用してコア ダンプを手動で取得できます。

5. kdump サービスを再起動

kdump を設定したら、kdump サービスを再起動します。

# service kdump restart
Stopping kdump:   [  OK  ]
Starting kdump:   [  OK  ]

# service kdump status
Kdump is operational

サービスの開始に問題がある場合は、kdump モジュールまたは crashkernel パラメータが正しく設定されていません。そのため、/proc/cmdline を検証し、crashkernel 値が含まれるように反映されていることを確認してください。

6.コア ダンプを手動でトリガーする

次のコマンドを使用して、コア ダンプを手動でトリガーできます:

echo 1 > /proc/sys/kernel/sysrq
echo c > /proc/sysrq-trigger

サーバーは自動的に再起動し、クラッシュ ダンプが生成されます。

7.コア ファイルを表示

サーバーが再起動すると、コア ファイルが /var/crash で定義された場所に基づいて /var/crash の下に生成されます。

vmcore と vmcore-dmseg.txt ファイルが表示されます:

# ls -lR /var/crash
drwxr-xr-x. 2 root root 4096 Mar 26 11:06 127.0.0.1-2014-03-26-11:06:43

/var/crash/127.0.0.1-2014-03-26-11:06:43:
-rw-------. 1 root root 33595159 Mar 26 11:06 vmcore
-rw-r--r--. 1 root root    79498 Mar 26 11:06 vmcore-dmesg.txt

8.クラッシュを使用した Kdump 分析

クラッシュ ユーティリティは、kdump によってキャプチャされたコア ファイルを分析するために使用されます。

また、netdump、diskdump、xendump などの他のダンプ ユーティリティによって作成されたコア ファイルの分析にも使用できます。

「kernel-debuginfo」パッケージが存在し、カーネルと同じレベルにあることを確認する必要があります。

以下に示すように、クラッシュ ツールを起動します。このコマンドを実行すると、クラッシュ コマンドを実行できるキャッシュ プロンプトが表示されます。

# crash /var/crash/127.0.0.1-2014-03-26-12\:24\:39/vmcore /usr/lib/debug/lib/modules/`uname –r`/vmlinux

crash>

9.システムがクラッシュしたときのプロセスを見る

クラッシュ プロンプトで ps コマンドを実行すると、システムがクラッシュしたときに実行中のすべてのプロセスが表示されます。

crash> ps
   PID    PPID  CPU       TASK        ST  %MEM     VSZ    RSS  COMM
      0      0   0  ffffffff81a8d020  RU   0.0       0      0  [swapper]
      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  [migration/0]
      4      2   0  ffff88013e7e9540  IN   0.0       0      0  [ksoftirqd/0]
      7      2   0  ffff88013dc19500  IN   0.0       0      0  [events/0]

10.システムクラッシュ時にスワップスペースを表示

クラッシュ プロンプトで swap コマンドを実行すると、システムがクラッシュしたときのスワップ領域の使用状況が表示されます。

crash> swap
FILENAME           TYPE         SIZE      USED   PCT  PRIORITY
/dm-1            PARTITION    2064376k       0k   0%     -1

11.システム クラッシュ時に IPCS を表示

クラッシュ プロンプトで ipcs コマンドを実行すると、システムがクラッシュしたときの共有メモリの使用状況が表示されます。

crash> ipcs
SHMID_KERNEL     KEY      SHMID      UID   PERMS BYTES      NATTCH STATUS
(none allocated)

SEM_ARRAY        KEY      SEMID      UID   PERMS NSEMS
ffff8801394c0990 00000000 0          0     600   1
ffff880138f09bd0 00000000 65537      0     600   1

MSG_QUEUE        KEY      MSQID      UID   PERMS USED-BYTES   MESSAGES
(none allocated)

12.システムがクラッシュしたときに IRQ を表示

クラッシュ プロンプトで irq コマンドを実行すると、システムがクラッシュしたときの IRQ 統計が表示されます。

crash> irq -s
           CPU0
  0:        149  IO-APIC-edge     timer
  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
 .
 .

vtop – このコマンドは、ユーザーまたはカーネルの仮想アドレスを物理アドレスに変換します。
foreach – このコマンドは、システム内の複数のタスクのデータを表示します
waitq – このコマンドは、待機キューにキューイングされたすべてのタスクを表示します。

13.システムがクラッシュしたときに仮想メモリを表示する

クラッシュ プロンプトで vm コマンドを実行すると、システムがクラッシュしたときの仮想メモリの使用状況が表示されます。

crash> vm
PID: 5210   TASK: ffff8801396f6aa0  CPU: 0   COMMAND: "bash"
       MM              		 PGD          RSS    TOTAL_VM
ffff88013975d880  ffff88013a0c5000  1808k   108340k
      VMA           START       END     FLAGS FILE
ffff88013a0c4ed0     400000     4d4000 8001875 /bin/bash
ffff88013cd63210 3804800000 3804820000 8000875 /lib64/ld-2.12.so
ffff880138cf8ed0 3804c00000 3804c02000 8000075 /lib64/libdl-2.12.so

14.システムがクラッシュしたときに開いているファイルを表示する

クラッシュ プロンプトで files コマンドを実行すると、システムがクラッシュしたときに開いているファイルが表示されます。

crash> files
PID: 5210   TASK: ffff8801396f6aa0  CPU: 0   COMMAND: "bash"
ROOT: /    CWD: /root
 FD       FILE            DENTRY           INODE       TYPE PATH
  0 ffff88013cf76d40 ffff88013a836480 ffff880139b70d48 CHR  /tty1
  1 ffff88013c4a5d80 ffff88013c90a440 ffff880135992308 REG  /proc/sysrq-trigger
255 ffff88013cf76d40 ffff88013a836480 ffff880139b70d48 CHR  /tty1
..

15.システムがクラッシュしたときにシステム情報を表示する

クラッシュ プロンプトで sys コマンドを実行すると、システムがクラッシュしたときにシステム情報が表示されます。

crash> sys
      KERNEL: /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  [PARTIAL DUMP]
        CPUS: 1
        DATE: Wed Mar 26 12:24:36 2014
      UPTIME: 00:01:32
LOAD AVERAGE: 0.17, 0.09, 0.03
       TASKS: 159
    NODENAME: elserver1.abc.com
     RELEASE: 2.6.32-431.5.1.el6.x86_64
     VERSION: #1 SMP Fri Jan 10 14:46:43 EST 2014
     MACHINE: x86_64  (2132 Mhz)
      MEMORY: 4 GB
       PANIC: "Oops: 0002 [#1] SMP " (check log for details)

Linux
  1. 大規模なLinuxバックアップに高度なrsyncを使用する方法

  2. Linuxシステムリカバリにsystemd-nspawnを使用する方法

  3. LinuxでUnzipを使用する方法

  1. LinuxでBusyBoxを使用する方法

  2. Linuxでcronを使用する方法

  3. LinuxでFINDを使用する方法

  1. Linuxのアクセシビリティ設定の使用方法

  2. LinuxでSuコマンドを使用する方法

  3. Linux –緊急時にのみスワップスペースを使用する方法は?