1. kdump란?
kdump 는 커널 crash 가 일어났을 때 메모리 덤프를 해주는 역할로 구 버전의 diskdump와 netdump가 kexec와 kdump로 대체되었습니다. kdump에서는 raw device, disk partition, nfs, ssh 등을 지원합니다.
2. kexec / kdump
1) kexec 의 역할
kexec는 새로운 커널이 BIOS를 통하지 않고 재부팅이 될 수 있게 해 줍니다. kexec는 부팅시에 메모리에(RAM)에 상주하게 되며 패닉(panic) 발생 시 현재 커널을 정지 시키고 새로운 커널(dump용 커널)을 동작시키는 역할을 합니다.
2) kdump의 역할
/etc/kdump.conf 환경설정 파일을 가지고 있으며, 서버의 panic 상황을 지켜보는 역할을 합니다.
3. dump 생성 작동 단계
1) 시스템 패닉 발생.(System panics)
2) kdump 커널로 부팅
3) kdump initramfs 로딩 및 init 작동
4) /etc/kdump.conf에 덤프 타켓이 설정되어 있는지 확인(예 5, 아니오 9)
5) /etc/kdump.conf설정에 따라 capture dump
6) capture가 정상적으로 완료 되었는지 확인 (예 12, 아니오 7)
7) /etc/kdump.conf 설정 중 default_action 이 halt 일 경우 (예 14, 아니오 8)
8) /etc/kdump.conf 설정 중 default_action 이 reboot 일 경우 (예 12, 아니오 9)
9) root filesystem을 마운트 한 뒤, pivot_root(change root file system), /sbin/init 진행
10) kdump 서비스 시작
11) capture core는 CP로 /proc/vmcore /var/crash/<host-addr>-<date>/vmcore로 진행
12) 재부팅
13) shell drop
14) 시스템 다운(정지)
kdump가 설정되면, 패닉 발생 시 덤프를 뜨기 위한 비상용 커널이 미리 메모리에 올라가 있다가, 패닉 발생시 해당 비상 커널로 제어권이 넘어가고(실제로는 특수한 형태의 재부팅이 이루어집니다) 물리메모리(Raw memory)를 읽어 저장하게 됩니다.
4. kdump 설정법
1) /etc/kdump.conf
#raw /dev/sda5
#ext3 /dev/sda3
#ext3 LABEL=/boot
#ext3 UUID=03138356-5e61-4ab3-b58e-27507ac41937
#net my.server.com:/export/tmp
#net user@my.server.com
#path /var/crash
#core_collector makedumpfile -c --message-level 1
#link_delay 60
#kdump_post /var/crash/scripts/kdump-post.sh
#extra_bins /usr/bin/lftp
#extra_modules gfs2
#options modulename options
#default shell
옵션 설명
1) raw device에 dump 받기
raw <devicename>
2) disk에 dump 받기
① ext3 <devicename>
② ext3 LABEL=라벨명
③ ext3 UUID=f15759be-89d4-46c4-9e1d-1b67e5b5da82
생성 디렉토리를 변경
path /원하는 디렉토리명
3) NETWORK를 통한 dump file 생성
① NFS설정
net <nfs server>:</nfs/mount>
② SSH설정
net <user>@<ssh server>
설정 이 후, service kdump propagate 명령어로 ssh keys를 생성
4) dump 파일 생성 옵션
core_collector makedumpfile -c --message-level 1
vmcore를 대용량의 메모리를 FULL DUMP로 생성하게 되면, 오래 걸리기 때문에 확인 쓸모 없는 페이지를 빼고, 압축을 하여 시간을 단축 시키는 것이 좋다. 옵션 확인 방법은 /sbin/makedumpfile --help로 확인이 가능하다
-c : 각 페이지를 압축하는 옵션
-d : 특정 분석이 불필요한 페이지를 빼는 옵션(X표 있는 것은 제외되는 page)
Dump |
zero |
cache |
cache |
user |
free |
Level |
page |
page |
private |
data |
page |
0 |
|||||
1 |
X |
||||
2 |
X |
||||
4 |
X |
X |
|||
8 |
X |
||||
16 |
X |
||||
31 |
X |
X |
X |
X |
X |
즉, FULL DUMP를 위해서는 –d 0 옵션을 주어야 하며, -d 31는 가장 적은 양의 덤프 옵션이다.
–c, 옵션과 –d 옵션 적용 시에는 vmcore 생성하는 시간이 늘어날 수 있으니, 재부팅 이 후 빨리 원복이 되어야 하는 시스템에서는 제외 하는 것이 좋다.
아무것도 설정 안 했을 시, 기본으로 적용 되는 옵션 path /var/crash core_collector --message-level 7 |
5) 커널 파라미터 설정
/etc/grub.conf
# grub.conf generated by anaconda
#
#boot=/dev/hda
default=0
timeout=5
splashimage=(hd0,0)/boot/grub/splash.xpm.gz
hiddenmenu
title Red Hat Enterprise Linux Client (2.6.17-1.2519.4.21.el5)
root (hd0,0)
kernel /boot/vmlinuz-2.6.17-1.2519.4.21.el5 ro root=LABEL=/ rhgb quiet crashkernel=128M@16M
initrd /boot/initrd-2.6.17-1.2519.4.21.el5.img
crashkernel=128M@16M에서 x86시리즈에서는 32bit든 64bit든 기본은 128M@16M으로 설정을 한다. 여기에서 128M은 RAM에 상주하는 용량이다. 기본 권고는 상 위와 같으나 메모리 용량이 클 경우에는 좀 달리한다. 메모리 용량이 256GB이상이거나 TB급일 경우에는 crashkernel=128M@32M로 설정하라는 access.redhat.com 권고가 있으니, vmcore 생성이 정상적이지 않을 경우에는 참조하여 변경 하도록 한다.
참조:https://access.redhat.com/kb/docs/DOC-2164 , https://access.redhat.com/kb/docs/DOC-31705
5. Daemon 구동
1) kdump daemon 서비스 등록
# chkconfig kdump on (혹은 chkconfig --level 345 kdump on)
2) kdump daemon 구동
# service kdump start
3) kdump daemon 정지
# service kdump stop
4) kdump daemon 상태 확인
# service kdump status
6. kdump 테스트 방법
1) Alt+ SysRq + C
/etc/sysctl.conf 에서 kernel.sysrq = 1 로 설정 후 sysctl -p로 활성화 이 후 사용 가능
① 키보드에서 Alt + sysRq + C 키를 동시에 눌러서 패닉 유발.
② echo c > /proc/sysrq-trigger 명령어를 통해서 패닉 유발
2) NMI_WATCHDOG
서버 HANG 상태로 인하여, keyboard interrupts가 먹혀들지 않아 " Alt+ SysRq + C"로 패닉 유발이 되지 않을 때 셋팅
① /etc/grub.conf에 nmi_watchdog=1(혹은 2) 파라미터를 설정
② (vmware의 경우)nmi 시그널을 보냄
3) NMI(Non maskable interrupt) button
H/W에서 지원하는 nmi 버튼을 이용 하기 위한 셋팅
① /etc/sysctl.conf 에 kernel.unknown_nmi_panic = 1을 설정 후 활성화
② /etc/grub.conf에 nmi_watchdog=1(혹은 2) 파라미터를 설정
③ nmi 버튼을 누름