2009년 10월 8일 목요일

Crash Dump

Linux Kernel은 panic이나 crash발생하게 되면 dump파일을 생성하여 문제가 발생하게 된 원인을 알 수 있도록 한다. oops message와 비슷하나, 보다 자세한 정보로 문제가 일어나게 된 요건등을 알수 있도록 보다 많은 정보를 제공 한다. 다음은 dump file들이 담고 있는 내용들이다.
1. General system information
2. Type of crash
3. Dump of the system buffer, which contains the latest messages printed via the kernel's printk function
4. CPU summary
5. Kernel stack trace leading up to the system PANIC
6. Disassembly of instructions before and after the instructions that caused the crash

다음은 dump file 분석에 사용되는 명령어들 이다.
1. stat : 현재까지 printk를 통해 print된 모든 메시지를 보여주기위한 commend
2. vtop : kernel과 application의 virtual-to-physical 맴핑 주소를 보여준다.
3. trace : 선택된 task또는 system에 운영중인 모든 task들의 back trace정보를 보여주는 commend.
4. dis : 기계어들을 보여주기 위한 commend.

dump 파일들은 주로 /var/log/dump디렉토리 아래 저장되는데, /etc/sysconfig/dump 파일안에 DUMPDIR값을 바꿈으로서 위치를 바꿀수 있다. 또한 dump file은 gigabytes를 넘을 수 있기 때문에 dump 파일이 저장될 위치의 공간이 충분한가를 먼저 파악해야 한다.


Patch
모든 linux kernel에서 Crash dump기능을 제공하지 않을 수 있다. 이에 자신의 kernel에서 해당 기능을 제공하는지는 make xconfig--> kernel hacking 메뉴를 통해 확일 할수 있다.
만약 위메뉴가 없다면 아래와 같은 방법으로 자신의 kernel읠 패치하여야 한다.
1. pd /usr/src/linux
2. download lkcdutils-6.x.x.patch.gz
3. gunzip lkcdutils-6.xx.patch.gz
4. patch -p1 -dry-run < /run/src/linux/lkcd-6.x.x.patch하여 이상없을으면 "-dry-run"을빼고 패치하면 된다.

Build
1.make xconfig
2. Kernel hacking->Crash dump support선택
3. make clean && make bzImage
4. 아래와 같은 명령을 하는 이유는 잘 모르겠음.....
cp arch/i386/boot/bzImage /boot/bzImage-2.x.x-lkcd
cp System.map /boot/System.map-2.x.x-lkcd
kerntypes는 kernel에 대한 정보를 보여주기 위한 파일이며,default는 /boot/Kerntypes
cp init/kerntypes.o /boot/Kerntypes-2.x.x-lkcd
rm /boot/System.map && ln -s /boot/System.map-2.x.x-lkcd System.map
rm /boot/Kerntypes && ln -s /boot/Kerntypes-2.x.x-lkcd Kerntypes

General Crash Dump Steps
1. dump되는 메시지의 level을 결정
8 : 모든 system 메모리
4 : 오직 사용된 메모리
2 : kernel 메모리
1 : Dump header
0 : Do nothing

2. dump에 필요한 partition size 결정.
예) system이 1GB이고, dump level은 8이면, 1GB의 partition size필요하다
3. create a symlink
ln -s /device/partition number
예) ln -s /dev/hda3 /dev/vmdump
4. /etc/sysconfig/dump에 DUMP_LEVEL을 8로 설정하다
5. Run /sbin/lkcd config
6. "dmesg"를 통해 lkcd 설정을 확인한다.
7. Enable sys-request
echo "1" > /proc/sys/kernel/sysrq

8. Trigger the dump
echo "c" > /proc/sysrq-trigger
DUMP_PANIC설정에 따라, system이 reboot되거나 shell로 돌아간다.

9. dump를 save하기 위해, run /sbin/lkcd save
dump는 partition에서 /var/log/dump/n으로 copy된다.

10. dump는 lcrash프로그램을 통해 display된다.
lcrash [System.map] [dump file] [kerntypes]하여 dump파일을 볼수있다.
위에서 마지막에 trace 수행을 하였는데, 이때 bash가 수행됨을 보여준다. 여기서 shell로 넘어가기 위해서는 echo "c" > /proc/sysrq-trigger 를 수행하면 된다.


View crash dump
아래는 kernel panic이 발생한 system을 예로 보여준다.
kernel panic이후 system은 reboot되었다.
위 메시지를 통해 null point가 jfs_mount의 offset 0x25에서 발생함을 알수 있다.


출처 : Debugging and Performance Tuning Chapter 14