KDUMP - vmcore 분석 방법

2022. 9. 25. 17:13✨ Linux

Intro

kdump는 Kernel Crash된 시스템의 장애 원인을 분석하기 위한 core dump를 생성하는 역할을 한다.
kdump은 커널 패닉이 발생하면 kexec 시스템 콜을 사용해서 본래 부팅하던 커널이 아닌, capture kernel 로 부팅한다.
capture kernel로 부팅하면 crash 된 커널의 메모리 덤프(ex. vmcore)를 떠서 파일로 남기게 된다.
사용자는 서버 재부팅 후 vmcore 파일로 시스템 장애 원인을 분석할 수 있다.

vmcore의 커널과 다른 버전의 OS에서 디버깅 하는 법을 테스트 하기 위해 일부러 상이한 버전에서 진행하였다.
고객사의 vmcore을 받아 분석해야 하는 경우 꼭 같은 버전에서 분석하라는 법이 없기 때문에 알아두면 좋다.

TIP
sosreport는 용량이 크기 때문에 가끔 vmcore 파일이 같이 안 받아질 수 있다.
고객사로부터 sosreport를 먼저 받은 다음, vmcore가 없으면 vmcore만 다시 요청 하는 것이 순서상 좋다.

 

kdump 분석을 위한 패키지 설치

core dump 를 분석하기 위해 crash 유틸리티를 설치한다.

[root@wglee ~]# yum install crash

debuginfo-install은 특정 패키지를 디버깅 하기 위한 rpm 설치를 하는 명령어이다. vmcore 파일을 디버깅 하기 위해서는 vmcore 과 동일한 커널 버전의 vmlinux 실행 파일이 필요하다.
vmcore 파일로 받은 system의 OS 버전을 확인한다.

[root@wglee-vm ~]# crash --osrelease /home/vmcore-test/vmcore
3.10.0-1160.el7.x86_64

분석을 하는 나의 시스템은 rocky 8.4 이기 때문에 커널 버전이 일치하지 않는다.

[root@wglee ~]# uname -r
4.18.0-305.3.1.el8_4.x86_64

동일한 커널 버전의 kernel-debuginfo-common, kernel-debuginfo 패키지를 설치한다.
kernel-debuginfo-common 없이 kernel-debuginfo를 먼저 설치하려고 하면 에러가 발생한다.
kernel-debuginfo 패키지들은 아래 repo 에서 찾을 수 있다.
http://debuginfo.centos.org/7/x86_64/

[root@wglee ~]# wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-common-x86_64-3.10.0-1160.el7.x86_64.rpm
[root@wglee ~]# wget http://debuginfo.centos.org/7/x86_64/kernel-debuginfo-3.10.0-1160.el7.x86_64.rpm

[root@wglee ~]#  yum install kernel-debuginfo-common-x86_64-3.10.0-1160.el7.x86_64.rpm
[root@wglee ~]#  yum install kernel-debuginfo-3.10.0-1160.el7.x86_64.rpm

...
# 번외 : kernel-debuginfo-common 설치하지 않으면 에러 발생
[root@ubuntu ~]# yum install kernel-debuginfo-3.10.0-1160.el7.x86_64.rpm
Last metadata expiration check: 0:27:21 ago on Sun 25 Sep 2022 05:24:16 PM UTC.
Error:
 Problem: conflicting requests
  - nothing provides kernel-debuginfo-common-x86_64 = 3.10.0-1160.el7 needed by kernel-debuginfo-3.10.0-1160.el7.x86_64
(try to add '--skip-broken' to skip uninstallable packages or '--nobest' to use not only best candidate packages)

이렇게 하면 vmcore와 동일한 커널 버전의 vmlinux 가 생성되었다.

[root@wglee 3.10.0-1160.el7.x86_64]# pwd
/usr/lib/debug/usr/lib/modules/3.10.0-1160.el7.x86_64
[root@wglee 3.10.0-1160.el7.x86_64]# ls
kernel  vdso  vmlinux

 

vmcore 덤프 파일 분석

crash utility 를 사용하여 vmcore 파일을 분석한다.

[root@wglee ~]# crash /usr/lib/debug/usr/lib/modules/3.10.0-1160.el7.x86_64/vmlinux /home/vmcore-test/vmcore

 

Crash interface Commands

Crash 명령어로 interactive 환경에 도입하면 몇가지 명령어로 vmcore를 효율적으로 분석할 수 있다.
그 중 몇가지는 아래와 같다.

bt
명령어로 backtrace 를 확인한다.
각각의 hash (#)로 시작하는 라인이 crash 직전에 호출된 system call에 해당한다. 프로그램의 실행을 위해 커널에서 동작 중이던 커널의 function call 을 확인할 수 있다.
exception RIP 문자열로 어떤 함수를 호출 할 때 문제가 발생했는지 파악할 수 있다.

ps -t
프로세스 별로 runtime을 확인 한다.

ps -p [PID]
특정 프로세스의 정보를 확인 한다.

files [PID]
해당 프로세스로 open 중인 파일 리스트를 확인 한다.

rd [메모리 주소]
메모리 번지수에 담긴 내용을 16진수(hexadecimal)로 확인할 수 있다.

 

참고

https://access.redhat.com/documentation/en-us/red_hat_enterprise_linux/8/html/managing_monitoring_and_updating_the_kernel/installing-kdumpmanaging-monitoring-and-updating-the-kernel
https://docs.oracle.com/en/operating-systems/oracle-linux/6/admin/ol_ssc_crash.html
https://mapoo.net/os/oslinux/vmcore-analyze/
https://www.dedoimedo.com/computers/crash-analyze.html#mozTocId782257
tainted? : https://support.hpe.com/hpesc/public/docDisplay?docId=emr_na-c02905321
https://www.kernel.org/doc/html/v5.8/admin-guide/tainted-kernels.html
https://crash-utility.github.io/crash_whitepaper.html