SW 개발

[linux] 커널 패닉 로그획득하기

. . . 2020. 3. 9. 18:30
반응형

리눅스 커널패닉시 로그를 획득하는 방법에 대해서 여러가지 자료조사한 내용을 정리한다.

kernel panic 시 로그획득?

개발중에 발생하는 kernel panic 에 대해서 로그를 획득해야, 디버깅이 유리할 것이다. 하지만, 디버깅 콘솔이 없는상태에서 패닉이 나서 리부팅해버리면? 로그획득이 안될것이다.

그래서 별도의 로그획득방법등이 필요하다.

로그획득방법1 : kexec & kdump 활용

  • 관련자료들
    • https://ko.wikipedia.org/wiki/Kexec
    • https://wiki.archlinux.org/index.php/Kexec
    • https://tech.osci.kr/linux/2014/11/13/tistory-1/
    • https://www.kernel.org/doc/html/latest/admin-guide/kdump/kdump.html

결론적으로 이야기하면, kexec 라는 기능을 이용하여 커널을 가상으로 로드시킨다. 일종의 이중 부팅이라고 이해하면 될것같다. 첫번째 커널이 부팅후, kexec 기능을 이용하여 커널을 한번더 부팅시킨다. 새로 부팅시킨 커널은 온전하게 제어권 안에 있기때문에 패닉이나 크러쉬가 날경우 온전히 덤프를 뜨는것이 가능해진다.

하.지.만... 상용 임베디드 리눅스환경에서 굳이 이렇게 까지 이중으로 로딩하는 위험을 감수할 것인가는 유저의 몫인것 같다. kexec 는 사용방법, 세팅또한 복잡하니... 일단 포기하도록 하자.;;

로그획득방법2 : mtd oops 활용

  • 관련자료들
    • https://stackoverflow.com/questions/27107625/mips-linux-logging-kernel-panic-into-mtd-partition
    • https://www.slideshare.net/vishnu_tvrprasad/logging-kernel-oops-and-panic-76832424
    • https://www.kernel.org/doc/html/v4.14/driver-api/mtdnand.html

mtd 파티션을 일종의 로그장치로 활용하는 방법이다. 해당 방법을 사용하면, mtd의 특정파티션을 일종의 tty 장치처럼 로그를 남길수 있다. 때문에 panic 시 에도 파일시스템에 로그가 온전히 남아있게된다.

하.지.만... 단점이 있으니.. mtd 파티션을 사용하지 않는 시스템이라면 좀 귀찮아진다. 그냥 mmcblock 형태로 아예 물리파티션을 나눠서 사용하는 시스템은 굳이 또 파티션레이아웃을 오로지 해당기능을 위해서 사용하는것이 맞지 않다.

만약 사용하고자하는 환경이 mtd 파티션이라면 해당 기능을 사용하는것도 고려해볼만한다.

로그획득방법3 : ramoops 활용

  • 관련자료들
    • https://www.kernel.org/doc/html/v4.12/admin-guide/ramoops.html
    • https://www.raspberrypi.org/forums/viewtopic.php?t=199047
    • https://discuss.96boards.org/t/ramoops-not-working/2396

ram 의 일정역역을 로그장치로 활용하는 방법이다. 해당방법을 사용하면, ram 의 일정영역(reserved memory)에 tty 장치처럼 로그를 남길 수 있다.

하.지.만 단점이 있으니, ram 파일시스템에 남다보니 전원이 차단되면 해당 로그는 날라가게된다. 때문에 부팅시, 커널패닉 로그가 남겨져있다면, 사용자의 파일시스템으로 옮겨주는 초기화 스크립트를 구동시켜야 한다.

ramoops 설정 방법

ramoops 는 시스템설정이 생각보다 간단하여 본 시스템을 적용하게 되었다. 해당과정을 정리한다.

dts 설정

https://www.kernel.org/doc/html/v4.12/admin-guide/ramoops.html 문서를 보면서 적당한 dtsi 파일 부분에 ram oops 메모리 memory 영역을 잡아준다.

 ramoops: ramoops@8f000000 {
     compatible = "ramoops";
     reg = <0 0x8f000000 0 0x100000>;
     record-size = <0x4000>;
     console-size = <0x4000>;
 };

위와같이 메모리에 추가하여 ramoops 에 사용할 메모리부부분을 예약해놓는다.

kernel feature 설정

기본적으로 CONFIG_PSTORE 를 켠다.

Prompt: Persistent store support
  Location:
    -> File systems
(1)   -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y])

Miscellaneous filesystems 하위에 Persistent store support 옵션을 켜면, 여러가지 옵션이 나온다.

menuconfig 화면 -> ramoops 옵션

CONFIG_PSTORE 를 켠후에 다음의 feature 들을 찾아서 enable 시켜주도록하자.

CONFIG_PSTORE_RAM=y

커널 패닉발생시 로그위치

설정이 정상적으로 되었다면, 결론적으로 패닉이 발생할경우 다음의 폴더에 로그가 남겨지게 된다.

  • /sys/fs/pstore

만약에 kernel feature 에서 각종 로그들을 남겨지도록 옵션을 켰다면, 패닉 로그뿐만아니라 일반 커널로그까지 파일로 남겨지게된다. 해당 파일시스템의 파일들은 ram fs 이므로 전원 차단시 삭제된다

때문에, 처음부팅시 해당 폴더에 파일들이 있다면 사용자영역으로 복사해 놓도록 하자.

...

끗.

반응형