2014年3月26日水曜日

CentOS6(RHEL6)でクラッシュダンプを取得する SSH経由で他のホストへ出力

前回の続きで、タイトルのとおりSSH経由でダンプをリモートのホスト上にはかせてみようというのが今回の内容です。

※評価は、CentOS6.5(x86_64)でメモリ2GBを搭載したマシンを2台用意して行っています
※また、2台のIPアドレスは下記のとおりです
 ダンプを受け取るリモート側のホスト:192.168.233.21
 ダンプをはくホスト        :192.168.233.12



ダンプを受け取るリモート側での作業


ダンプをはく側からSSH経由でアクセスしてくるので、事前にダンプ用ユーザ(下記の例ではkdumpユーザ)の作成とそのユーザでデータを保存できる領域(下記の例では、ホームディレクトリをとして/kdumpを指定)を作成します。
# useradd -m -d /kdump kdump
# grep kdump /etc/passwd
kdump:x:502:502::/kdump:/bin/bash
#




ダンプをはく側での作業



1. /etc/kdump.confの編集

※リモート側で準備したkdumpユーザの権限で、(SCPを使って)データ転送を実施します
※デフォルトで/var/crash配下にデータを転送しようとしますが、その際のアクセス権に注意する必要があります
→pathで任意の場所を指定すれば、デフォルト以外の場所に転送可能なので、下記の例ではリモート側で準備した/kdump配下に転送します
 net kdump@192.168.233.21
 path /kdump
 core_collector makedumpfile -c --message-level 1 -d 31



2. kdump用SSH鍵の登録
以下のようにkdumpスクリプトを使って、ダンプをはく側での秘密鍵と公開鍵の生成とダンプを受け取るリモート側への公開鍵の登録までを実施します。

# /etc/rc.d/init.d/kdump propagate
Generating new ssh keys... done.
kdump@192.168.233.21's password:          ←★パスワードを入力
/root/.ssh/kdump_id_rsa has been added to ~kdump/.ssh/authorized_keys on 192.168.233.21
#
(注意)
ダンプを受け取るリモート側で、SSHのパスワード認証が有効になっている必要があります
→鍵認証のみで運用している場合は、鍵登録に失敗しますが、その際は
  /root/.ssh/kdump_id_rsa.pubを手動でauthorized_keysとして登録します


3.変更の適用
# /etc/rc.d/init.d/kdump restart
Stopping kdump:                                            [  OK  ]
Detected change(s) the following file(s):
  /etc/kdump.conf
Rebuilding /boot/initrd-2.6.32-431.1.2.0.1.el6.x86_64kdump.img
Starting kdump:                                            [  OK  ]
#




動作確認

ダンプをはく側でkernelをクラッシュさせて、リモートで受け取る側にダンプが出力されているか確認します。

# ls -l /kdump/192.168.233.12-2014-03-24-17\:55\:07/
total 19884
-rw-rw-r-- 1 kdump kdump    85833 Mar 24 17:55 vmcore-dmesg.txt
-rw-rw-r-- 1 kdump kdump 20274689 Mar 24 17:55 vmcore.flat
#

2014年3月17日月曜日

CentOS6(RHEL6)でクラッシュダンプを取得する

OSが突然死するとログに手掛かりとなるような出力(判断材料)が意外な程なく、途方にくれる事が多いのですが、その対策としてダンプをはかせてみようというのが今回の内容です。
※評価は、CentOS6.5(x86_64)でメモリ2GBを搭載したマシンで行っています



クラッシュダンプを取得する為のセットアップ


CentOS6.5でクラッシュダンプを取得するには、kdumpサービスを利用します。
以下、その手順です。


1. 必要なパッケージのインストール


kdumpサービスを利用するには、kexec-toolsがインストールされている必要があります。
# yum install kexec-tools


2. メモリー使用量の設定


クラッシュダンプ用に割り当てるメモリ容量を設定します。
→通常、起動しているOSからはそのメモリ領域はないものとして扱われます(※下記の(備考)参照)


設定は、grub.confのkernelの行に”crashkernel”パラメータを渡すことで行いますが、
通常、最初から”crashkernel=auto”と指定されていると思います。

※CentOS6.5では、2GB以上のメモリが搭載されていればkdumpサービスが有効になっていなくても、自動的にメモリの割り当てだけは行われています
※autoで割り当てられたメモリ容量は以下のいずれかのコマンドで確認できます
 # cat /proc/cmdline
 # cat /sys/kernel/kexec_crash_size

2GB未満の場合は、自動的に割り当てられることはないので、autoの箇所に128Mとじかに指定する必要があります

title CentOS (2.6.32-431.5.1.el6.x86_64)
        root (hd0,0)
        kernel /vmlinuz-2.6.32-431.5.1.el6.x86_64 <中略> crashkernel=auto
        initrd /initramfs-2.6.32-431.5.1.el6.x86_64.img

(備考)====================================================
・2GBのメモリ搭載し、crashkernelの指定がない場合のメモリ容量

# cat /proc/meminfo
MemTotal:        2046588 kB
MemFree:         1867764 kB
Buffers:            7584 kB
     ・
     ・
・2GBのメモリを搭載し、crashkernel=autoの指定がある場合のメモリ容量
 →2GBからクラッシュダンプ用に割り当てられたメモリ容量が差し引かれて表示されます
# cat /proc/meminfo
MemTotal:        1914492 kB
MemFree:         1733792 kB
Buffers:            7568 kB
     ・
     ・
============================================================


3. 設定ファイル /etc/kdump.confの編集


今回は、デフォルトのままで特に編集を行いませんでした。


4. kdumpサービスの起動と状態確認

# chkconfig kdump on
# /etc/rc.d/init.d/kdump start
No kdump initial ramdisk found.                            [WARNING]
Rebuilding /boot/initrd-2.6.32-431.1.2.0.1.el6.x86_64kdump.img
Starting kdump:                                            [  OK  ]
#

kdumpサービスが有効になったかは以下のコマンドで確認できます
# /etc/rc.d/init.d/kdump status
Kdump is operational
#
# cat /sys/kernel/kexec_crash_loaded
1
#



コアダンプの分析


コアダンプの分析を行うまでの手順は下記のようになります。

1. 必要なパッケージのインストール


デバッグ情報付きでビルドされたカーネルとcrashパッケージをインストールします
→現在running中のkernelに合わせてインストールします
# yum --enablerepo=debug install kernel-debuginfo-`uname -r` crash


2. kernelクラッシュ


今回は、下記コマンドで強制的にkernelクラッシュを発生させます
# echo c > /proc/sysrq-trigger

これで下記のように/var/crashディレクトリ配下にコアダンプが吐かれます。

# ll /var/crash/127.0.0.1-2014-03-17-17\:36\:44/
total 30292
-rw------- 1 root root 30929131 Mar 17 17:36 vmcore
-rw-r--r-- 1 root root    85835 Mar 17 17:36 vmcore-dmesg.txt
#


3. crashユーティリティの実行

# crash /usr/lib/debug/lib/modules/2.6.32-431.1.2.0.1.el6.x86_64/vmlinux \
> /var/crash/127.0.0.1-2014-03-17-17\:36\:44/vmcore

以下のようにプロンプトが戻っててきたら、各種コマンドで解析が実施できます。
→利用できるコマンドはhelpで確認できます


crash 6.1.0-5.el6
Copyright (C) 2002-2012  Red Hat, Inc.
Copyright (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 K.K.
Copyright (C) 2005, 2011  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 (GDB) 7.3.1
Copyright (C) 2011 Free Software Foundation, Inc.
License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.  Type "show copying"
and "show warranty" for details.
This GDB was configured as "x86_64-unknown-linux-gnu"...

      KERNEL: /usr/lib/debug/lib/modules/2.6.32-431.1.2.0.1.el6.x86_64/vmlinux
    DUMPFILE: /var/crash/127.0.0.1-2014-03-17-17:36:44/vmcore  [PARTIAL DUMP]
        CPUS: 1
        DATE: Mon Mar 17 17:36:41 2014
      UPTIME: 00:41:54
LOAD AVERAGE: 0.10, 0.17, 0.08
       TASKS: 71
    NODENAME: kdump.example.com
     RELEASE: 2.6.32-431.1.2.0.1.el6.x86_64
     VERSION: #1 SMP Fri Dec 13 13:06:13 UTC 2013
     MACHINE: x86_64  (3192 Mhz)
      MEMORY: 2 GB
       PANIC: "Oops: 0002 [#1] SMP " (check log for details)
         PID: 4289
     COMMAND: "bash"
        TASK: ffff880037c20ae0  [THREAD_INFO: ffff880037aea000]
         CPU: 0
       STATE: TASK_RUNNING (PANIC)

crash>