kkamagi's story

IT, 정보보안, 포렌식, 일상 공유

OS

커널 패닉 시 재부팅

까마기 2015. 5. 20. 10:36
728x90
반응형

rc.local에 다음 문구 추가.

echo 1 > /proc/sys/kernel/panic

echo 1 > /proc/sys/kernel/panic_on_oops


0 - 재부팅안함.

1 - 1초 후 재부팅.

2 - 2초 후 재부팅 등.



한가지 더 최신 커널부터는 mtdoops기능이 추가되어 커널 패닉 후에 mtd에 패닉 로그를 기록할 수 있다.

linux-2.6.33/drivers/mtd/mtdoops.c    를 다음 내용을 알맞게 변경한다.

static unsigned long record_size = 4096;

static char mtddev[80]="1"; /* mtd1 => 1,    mtd2 => 2 */

static int dump_oops = 1;


올바르게 적용하였으면 부팅시 아래와 같이 attach된 로그가 나온다.

Creating 3 MTD partitions on "mo2440-nor":

0x000000000000-0x000000050000 : "uboot"

0x000000050000-0x0000001f0000 : "kernel"

mtdoops: Attached to MTD device 1

0x0000001f0000-0x000000200000 : "reserved-env"


한가지 더 추가해야할 부분은  패닉시 로그를 write할 루틴인 panic_write함수를 연결해주는 일이다.

여기까지는 작업을 추가해보진 않았다.

앞으로 할 기회가 생기면 다음 코드부분을 부고 연결해주면 될듯싶다.

줏어 들은 말로는 panic_write함수 작성시 DMA및 interrupt를 사용하면 안되며, busy loop를 이용해야 한다. 또 패닉후 자동 재부팅을 너무 빨리 하게 되면 write하기 전에 재부팅이 되므로 적당한 타이밍을 주길 바란다. (관련 echo 1 > /proc/sys/kernel/panic)


linux-3.2.5/drivers/mtd/onenand/onenand_base.c 

아래 함수 참조.

static int onenand_panic_write(struct mtd_info *mtd, loff_t to, size_t len,

             size_t *retlen, const u_char *buf)

반응형