커널이 충돌할 때 커널 크래시 덤프를 얻기 위해 kexec-tools를 사용하고 있습니다. 그러나 sysrq-trigger를 사용하여 패닉을 유발하면 시스템이 정지됩니다. 시스템을 복원하려면 전원을 껐다가 다시 켜야 했습니다. 자동 재시작이 없으며 /var/crash에서 크래시 덤프를 사용할 수 없습니다. 구성 및 세부정보는 다음과 같습니다.
- Linux 배포판 - Debian Buster arm64
- 리눅스 커널 - 4.19.35
- kexec-tools v2.0.22(소스에서 빌드)
- arm64를 활성화하기 위해 지정된 모든 커널 구성은 다음과 같습니다.https://www.kernel.org/doc/Documentation/kdump/kdump.txt
메인 커널과 크래시 커널은 동일합니다. (압축되지 않은 이미지를 크래시 커널로 사용하는 동안)
/proc/cmdline = crashkernel=512M nokaslr # Along with other arguments
크래시 커널 공간이 보존됩니다(dmesg로 확인)
crashkernel을 로드하여 커널 패닉을 시작합니다.
$ sudo kexec -p ./Image --append=" root=/dev/sda1 console=same_as_main_kernel earlycon=same_as_main_kernel rootwait rw 1 max_cpus=1 reset_devices
루트 파일 시스템은 기본 커널에서 사용되는 것과 동일합니다.
커널 패닉을 유발합니다.
$ echo c | sudo tee /proc/sysrq-triggger
표준 커널 패닉 스택 추적으로 인해 직렬 콘솔이 정지됩니다. Kdump 관련 로그 중 하나는 다음과 같습니다.
[14645.1099571] CPU: 2 PID: 20518 Comm: tee Kdump: loaded Not tainted 4.19.35-g9e41bb234b42 #2
그러나 시스템은 재부팅되지 않습니다.
한 가지 주목할 점은 명시적으로 부팅하려는 경우 충돌이 발생하는 커널로 부팅할 수 있다는 것입니다.
$ sudo kexec -l ./Image --append=" root=/dev/sda1 console=same_as_main_kernel earlycon=same_as_main_kernel rootwait rw 1 max_cpus=1 reset_devices
$ sudo kexec -e
그러면 지정된 커널로 부팅됩니다.
커널 패닉이 발생하면 커널이 시작되지 않는 것 같습니다. 이 문제를 추가로 해결/디버깅하려면 어떻게 해야 합니까?
답변1
이 문제는 QEMU를 사용하면 설명될 수 있다고 생각합니다.
QEMU에서 Ubuntu 22.04 실행
qemu-system-x86_64 -hda ./ubuntu.qcow2 -enable-kvm -m 8G -smp 8 -serial stdio
Ubuntu 22.04용 grub 편집, 커널 옵션 제거quiet
이렇게 하면 디버깅 메시지를 얻을 수 있습니다.
다음은 kexec -e
로그입니다.
;-1f[ OK ] Started Show Plymouth Reboot with kexec Screen.
plymouth-kexec.service
[ OK ] Stopped LSB: Execute the k…c -e command to reboot system.
[ OK ] Stopped User Manager for UID 1000.
Stopping Userspace Out-Of-Memory (OOM) Killer...
Stopping User Runtime Directory /run/user/1000...
// -------------- and many similar entries -----------------------
// -------------- and many similar entries -----------------------
// many similar entries
[ OK ] Reached target System Shutdown.
[ OK ] Reached target Late Shutdown Services.
Starting Reboot via kexec...
[ 0.000000] Linux version 5.15.0-25-generic (buildd@ubuntu) (gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0, GNU ld (GNU Binutils fo
커널 패닉 로그는 다음과 같습니다.
martins3-Standard-PC-i440FX-PIIX-1996 login: [ 280.288704] sysrq: Trigger a crash
[ 280.290141] Kernel panic - not syncing: sysrq triggered crash
[ 280.292990] CPU: 6 PID: 2539 Comm: tee Kdump: loaded Not tainted 5.15.0-25-generic #25-Ubuntu
[ 280.296366] Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.0-0-gd239552ce722-prebuilt.qemu.org 04/04
[ 280.298395] Call Trace:
[ 280.298847] <TASK>
[ 280.299243] show_stack+0x52/0x58
[ 280.299964] dump_stack_lvl+0x4a/0x5f
[ 280.300862] dump_stack+0x10/0x12
[ 280.301584] panic+0x149/0x321
[ 280.302254] sysrq_handle_crash+0x1a/0x20
[ 280.303120] __handle_sysrq.cold+0xcc/0x1a2
[ 280.304095] ? apparmor_file_permission+0x70/0x160
[ 280.305121] write_sysrq_trigger+0x28/0x40
[ 280.306007] proc_reg_write+0x5a/0x9
[ 280.306802] ? __cond_resched+0x1a/0x50
[ 280.307604] vfs_write+0xc3/0x260
[ 280.308316] ksys_write+0x67/0xe0
[ 280.309014] __x64_sys_write+0x19/0x20
[ 280.309798] do_syscall_64+0x5c/0xc0
[ 280.311102] ? exit_to_user_mode_prepare+0x37/0xb0
[ 280.312097] ? syscall_exit_to_user_mode+0x27/0x50
[ 280.313089] ? __x64_sys_write+0x19/0x20
[ 280.313905] ? do_syscall_64+0x69/0xc0
[ 280.314684] ? irqentry_exit_to_user_mode+0x9/0x20
[ 280.315705] ? irqentry_exit+0x19/0x30
[ 280.316524] ? exc_page_fault+0x89/0x160
[ 280.317322] ? asm_exc_page_fault+0x8/0x30
[ 280.318153] entry_SYSCALL_64_after_hwframe+0x44/0xae
[ 280.319162] RIP: 0033:0x7f39a4c57a37
[ 280.319864] Code: 10 00 f7 d8 64 89 02 48 c7 c0 ff ff ff ff eb b7 0f 1f 00 f3 0f 1e fa 64 8b 04 25 18 00 00 00 85 c0 75 14
[ 280.323539] RSP: 002b:00007ffd893cb268 EFLAGS: 00000246 ORIG_RAX: 0000000000000001
[ 280.325084] RAX: ffffffffffffffda RBX: 0000000000000002 RCX: 00007f39a4c57a37
[ 0.000000] Linux version 5.15.0-25-generic (buildd@ubuntu) (gcc (Ubuntu 11.2.0-19ubuntu1) 11.2.0, GNU ld (GNU Binutils f)
// ---------------- kernel boot messages -----------------------
// ---------------- kernel boot messages -----------------------
[ 0.610479] tun: Universal TUN/TAP device driver, 1.6
[ 0.611162] PPP generic driver version 2.4.2
[ 0.611738] VFIO - User Level meta-driver version: 0.3
[ 0.613621] kthreadd invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, oom_score_adj=0
[ 0.614698] CPU: 0 PID: 93 Comm: kthreadd Not tainted 5.15.0-25-generic #25-Ubuntu
차이점은 분명합니다. kexec -e
패키지입니다.재시작시스템 호출. kexec -e
커널 패닉과 비슷하지만아니 똑같다커널은 패닉 모드에서 많은 것을 보장할 수 없기 때문에 코드 경로입니다. 메모리 부족으로 인해 부팅에 실패한 커널 패닉으로 인해 머신이 정지되었습니다.
그렇다면 이 문제를 해결하는 방법은 무엇입니까? 편집하고 /boot/grub/grub.conf
커널 매개변수를 추가한 crashkernel
후 재부팅하세요.