2017년 5월 25일 목요일

Ubuntu 에서 kdump 사용하기 (ppc64le)

아래 Ubuntu 사이트에서 가이드하는대로 따라 하다 보면, 간혹 사용 가능한 상태가 아닌 경우가 있습니다. 이때 kdump 설정하는 방법에 대해 posting 합니다.

Kernel dump가 제대로 enabled 되어있는지 확인하는 Verification 단계

1. crashkernel 파라미터 확인하기

linux-crashdump 패키지 설치 후에는, Reboot 을 해주어야 kdump-tools 가 활성화된다고 합니다. Reboot 을 수행하고 나서 /proc/cmdline을 확인해보면 crashkernel이 설정된 것을 볼 수 있습니다.

root@sys-87396:/etc/default# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet crashkernel=384M-:128M
 

* 간혹 crashkernel 파라미터가 보이지 않는 경우가 있습니다. 이때의 해결방법입니다.

root@sys-87397:~# cat /proc/cmdline
BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet => crashkernel 파라미터가 없음
root@sys-87397:/sys/kernel# cat /sys/kernel/kexec_crash_loaded
=> 1로 셋팅되어야 부트 시 crashkernel이 로드됨

kernel crash가 한번이라도 발생하게 되면, 이후에는 자동으로 crashkernel parameter가 붙게 됩니다. 그러나 초기 kdump 구성 시에 이렇게 crashkernel parameter가 안보이는 경우, 아래와 같이 수행합니다.

u0017496@sys-87481:~$ cat /etc/default/kexec
# Defaults for kexec initscript
# sourced by /etc/init.d/kexec and /etc/init.d/kexec-load

# Load a kexec kernel (true/false)
LOAD_KEXEC=true

# Kernel and initrd image
KERNEL_IMAGE="/boot/vmlinux"
INITRD="/boot/initrd.img"

# If empty, use current /proc/cmdline
APPEND=""

# Load the default kernel from grub config (true/false)
USE_GRUB_CONFIG=true ==> 이 부분은 default=false로 되어 있으나, true로 바꿉니다.

crashkernel에 대한 값은 아래 경로의 kexec-tools.cfg 파일에 정의되어 있습니다. 사이즈를 변경하고 싶다면, 해당 파일을 수정하면 됩니다. 관련 포멧은 링크를 참조하세요.

u0017496@sys-87481:~$ cat /etc/default/grub.d/kexec-tools.cfg
GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT crashkernel=384M-:128M"

u0017496@sys-87481:~$ sudo update-grub
u0017496@sys-87481:~$ sudo reboot

리부팅 후,

Last login: Mon May 29 04:11:02 2017 from 172.29.96.152
u0017496@sys-87481:~$ cat /proc/cmdline
root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet crashkernel=384M-:128M => 파라미터 설정되었습니다.

u0017496@sys-87481:~$ kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic
current state:    ready to kdump => 정상 작동 상태

kexec command:
  /sbin/kexec -p --command-line="root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet  irqpoll nr_cpus=1 nousb systemd.unit=kdump-tools.service" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz
  
 

2. Kernel에서 kdump를 위해 memory reservation 했는지 확인하기

root@sys-87396:/etc/default# dmesg | grep -i crash
[    0.000000] Reserving 128MB of memory at 128MB for crashkernel (System RAM: 2048MB)
[    0.000000] Kernel command line: BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic
 root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet crashkernel=384M-:128M

3. kdump config를 확인해서 현재 사용 가능한 상태인지 확인하기

root@sys-87396:/etc/default# kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: broken symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic
current state:    Not ready to kdump ==> 현재 사용 불가능한 상태입니다. 위에 링크도 잘못걸려 있으므로, 해당 링크를 재설정합니다.

kexec command:
  no kexec command recorded
 
내용을 확인해보면, /var/lib/kdump/initrd.img 에 잘못된 symbolic link가 걸려있습니다. 
 
root@sys-87396:/etc/default# ls -al /var/lib/kdump/
total 9672
drwxr-xr-x  3 root root    4096 May 26 00:42 .
drwxr-xr-x 44 root root    4096 May 25 21:35 ..
drwxr-xr-x  5 root root    4096 Mar 17 17:28 initramfs-tools
lrwxrwxrwx  1 root root      42 May 26 00:42 initrd.img -> /var/lib/kdump/initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root 9889523 May 25 21:35 initrd.img-4.4.0-66-generic
lrwxrwxrwx  1 root root      30 May 25 21:45 vmlinuz -> /boot/vmlinux-4.4.0-78-generic
 
/var/lib/kdump 경로를 확인해보니, symbolic link로 걸어놓았던
 initrd.img-4.4.0-78-generic 파일은 없고, 대신 initrd.img-4.4.0-66-generic 파일만 있습니다.
/boot 에 들어가보면 initrd.img-4.4.0-78-generic이 있습니다. copy 해서 가져다 놓습니다.

root@sys-87396:/etc/default# ls -al /boot
total 117680
drwxr-xr-x  3 root root     4096 May 22 11:36 .
drwxr-xr-x 22 root root     4096 May 25 21:45 ..
-rw-r--r--  1 root root  1138911 Mar  3 11:03 abi-4.4.0-66-generic
-rw-r--r--  1 root root  1139503 Apr 27 12:00 abi-4.4.0-78-generic
-rw-r--r--  1 root root   173579 Mar  3 11:03 config-4.4.0-66-generic
-rw-r--r--  1 root root   173546 Apr 27 12:00 config-4.4.0-78-generic
drwxr-xr-x  5 root root     4096 May 25 21:35 grub
lrwxrwxrwx  1 root root       27 May 21 23:14 initrd.img -> initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root 32026385 May 22 02:34 initrd.img-4.4.0-66-generic
-rw-r--r--  1 root root 32035729 May 22 02:43 initrd.img-4.4.0-78-generic
lrwxrwxrwx  1 root root       27 Mar 23 14:04 initrd.img.old -> initrd.img-4.4.0-66-generic
-rw-------  1 root root  3520955 Mar  3 11:03 System.map-4.4.0-66-generic
-rw-------  1 root root  3520298 Apr 27 12:00 System.map-4.4.0-78-generic
lrwxrwxrwx  1 root root       24 May 21 23:14 vmlinux -> vmlinux-4.4.0-78-generic
-rw-------  1 root root 23370856 Mar  3 11:03 vmlinux-4.4.0-66-generic
-rw-------  1 root root 23370856 Apr 27 12:00 vmlinux-4.4.0-78-generic
lrwxrwxrwx  1 root root       24 Mar 23 14:04 vmlinux.old -> vmlinux-4.4.0-66-generic
root@sys-87396:/etc/default# cp /boot/initrd.img-4.4.0-78-generic /var/lib/kdump/
root@sys-87396:/etc/default# ls -al /var/lib/kdump
total 40960
drwxr-xr-x  3 root root     4096 May 26 01:07 .
drwxr-xr-x 44 root root     4096 May 25 21:35 ..
drwxr-xr-x  5 root root     4096 Mar 17 17:28 initramfs-tools
lrwxrwxrwx  1 root root       42 May 26 01:05 initrd.img -> /var/lib/kdump/initrd.img-4.4.0-78-generic
-rw-r--r--  1 root root  9889523 May 25 21:35 initrd.img-4.4.0-66-generic
-rw-r--r--  1 root root 32035729 May 26 01:07 initrd.img-4.4.0-78-generic
lrwxrwxrwx  1 root root       30 May 25 21:45 vmlinuz -> /boot/vmlinux-4.4.0-78-generic


kdump-config 상태 확인합니다.
root@sys-87396:/etc/default# kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic => 링크는 제대로 걸림
 current state:    Not ready to kdump => 아직도 동작 불가

kexec command:
  no kexec command recorded

/var/crash를 살펴보면 vmcore도 기록되지 않은것을 볼수 있습니다.
root@sys-87396:/etc/default# ls /var/crash
root@sys-87396:/etc/default#

다시 커널 정보를 로드합니다.
root@sys-87396:/etc/default# kdump-config load
Modified cmdline:BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet irqpoll nr_cpus=1 nousb systemd.unit=kdump-tools.service elfcorehdr=156800K
 * loaded kdump kernel

상태를 보니, kdump를 사용할 수 있는준비가 되었습니다.
root@sys-87396:/etc/default# kdump-config show
DUMP_MODE:        kdump
USE_KDUMP:        1
KDUMP_SYSCTL:     kernel.panic_on_oops=1
KDUMP_COREDIR:    /var/crash
crashkernel addr:
   /var/lib/kdump/vmlinuz: symbolic link to /boot/vmlinux-4.4.0-78-generic
kdump initrd:
   /var/lib/kdump/initrd.img: symbolic link to /var/lib/kdump/initrd.img-4.4.0-78-generic
current state:    ready to kdump

kexec command:
  /sbin/kexec -p --command-line="BOOT_IMAGE=/boot/vmlinux-4.4.0-78-generic root=UUID=2a159e60-be84-4802-9bf1-bdbcf457a39e ro splash quiet irqpoll nr_cpus=1 nousb systemd.unit=kdump-tools.service" --initrd=/var/lib/kdump/initrd.img /var/lib/kdump/vmlinuz

덤프가 떨어지는 /var/crash에도 뭔가 생성되었습니다.
root@sys-87396:/etc/default# ls /var/crash
kexec_cmd
 

4. kdump 서비스가 동작중인지 확인

kdump-tools.service가 로드되어 있고, 정상 동작중(Active)인지 확인합니다. 

root@sys-87396:/sys/kernel# service kdump-tools status
● kdump-tools.service - Kernel crash dump capture service
   Loaded: loaded (/lib/systemd/system/kdump-tools.service; enabled; vendor preset: enabled)
   Active: active (exited) since Mon 2017-05-29 07:52:09 EDT; 56min ago
  Process: 2260 ExecStart=/etc/init.d/kdump-tools start (code=exited, status=0/SUCCESS)
 Main PID: 2260 (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/kdump-tools.service

May 29 07:52:07 sys-87396 systemd[1]: Starting Kernel crash dump capture service...
May 29 07:52:08 sys-87396 kdump-tools[2260]: Starting kdump-tools: Modified cmdline:root=UUID=2a159e60-be84-4802-9b
May 29 07:52:09 sys-87396 kdump-tools[2260]:  * loaded kdump kernel
May 29 07:52:09 sys-87396 kdump-tools[2426]: /sbin/kexec -p --command-line="root=UUID=2a159e60-be84-4802-9bf1-bdbcf
May 29 07:52:09 sys-87396 kdump-tools[2427]: loaded kdump kernel
May 29 07:52:09 sys-87396 systemd[1]: Started Kernel crash dump capture service.
lines 1-13/13 (END)

만약 위의 상태가 아니라면, 아래 명령어를 수행합니다.
#sudo service kdump-tools load
#sudo service kdump-tools start

kdump가 제대로 동작하는지 강제 kernel panic 일으켜서 확인해보는 방법 (Optional)

SysRQ 매커니즘을 enable 하여 kdump가 실제로 동작하는지 테스트해봅니다. 그러나, 아래 테스트는 선택사항입니다. (Reboot이 필요합니다.)

root@sys-87396:/etc/default# cat /proc/sys/kernel/sysrq
176

위 결과가 0이 아니면 실행 가능한 상태입니다. 만약 0이라면, 아래와 같이 수행해줍니다.
# sudo sysctl -w kernel.sysrq=1

이제 강제장애 상황을 일으켜봅니다. 연결중인 네트워크 연결은 끊어질 것이고, Core dump 생성 후 reboot 진행됩니다.
root@sys-87396:/etc/default# echo c > /proc/sysrq-trigger

위 Command 수행 시 Console 환경에서 수행하면, 아래와 같은 진행 절차를 보게 됩니다. 저는 텔넷 환경으로 수행하여 보진 못했습니다.

시스템 재부팅 후, /var/crash에 새로 생성된 덤프를 확인해봅니다.

root@sys-87396:~# ls /var/crash
201705260522  kexec_cmd  linux-image-4.4.0-78-generic-201705260522.crash