SysRq(System Request)는 리눅스 커널에 내장된 긴급 제어 백도어다. 커널이 응답하지 않거나 시스템이 매우 불안정할 때도, SysRq 키 조합을 통해 시스템을 진단하거나 복구할 수 있도록 도와주는 기능을 한다. 이 글에서는 SysRq의 개념부터 활성화 방법, 각 명령어의 사용법, 시리얼 터미널 및 프로그래밍적으로 사용하는 방법까지 알아본다.
SysRq란?
SysRq는 리눅스 커널에 탑재된 긴급 커널 제어 명령 도구다. 커널이 응답하지 않는 상황에서도 Alt + SysRq + <key> 키 입력만으로 시스템을 복구하거나 상태를 덤프하는 명령을 실행할 수 있다. 커널 패닉, 디스크 I/O 중단처럼 일반적인 방법으로는 접근할 수 없는 상황에서도 동작하는 것이 특징이다.
SysRq 사용 환경
| 구분 | 설명 |
|---|---|
| GUI 환경 | 일반 키보드에서 Alt + SysRq + <키> |
| 시리얼 콘솔 | BREAK 시그널 후 SysRq 키 입력 |
| 프로그램에서 호출 | /proc/sysrq-trigger 사용 또는 커널 API |
SysRq 활성화 방법
일시적으로 활성화
echo 1 > /proc/sys/kernel/sysrq
기본값은 0(비활성화)이고, 1이면 전체 기능이 활성화된다.
sysctl.conf에 등록 (재부팅 후 유지)
echo "kernel.sysrq = 1" >> /etc/sysctl.conf
sudo sysctl -p
설정 값 의미
/proc/sys/kernel/sysrq는 단순 on/off가 아니라 비트마스크로, 값에 따라 허용할 기능 범주를 세밀하게 제어할 수 있다.
| 값 | 설명 |
|---|---|
| 0 | 비활성화 |
| 1 | 전체 기능 사용 가능 |
| 2 (0x2) | 콘솔 로그 레벨 제어 |
| 4 (0x4) | 키보드 제어 (SAK, raw 해제) |
| 8 (0x8) | 프로세스 등 디버깅 덤프 |
| 16 (0x10) | sync 명령 허용 |
| 32 (0x20) | 읽기 전용 재마운트 허용 |
| 64 (0x40) | 프로세스 시그널 전송 허용 (term/kill/oom-kill) |
| 128 (0x80) | reboot/poweroff 허용 |
예를 들어 아래처럼 설정하면 sync(s) 명령만 허용된다.
echo 16 > /proc/sys/kernel/sysrq
SysRq 명령어 종류 및 설명
SysRq 명령은 Alt + SysRq + 키 조합으로 실행되며, 자주 쓰는 키는 다음과 같다.
| 키 | 설명 |
|---|---|
b | sync/unmount 없이 즉시 재부팅 |
o | 시스템 전원 종료 (power off) |
s | 마운트된 파일시스템 sync 시도 |
u | 마운트된 파일시스템을 읽기 전용으로 재마운트 시도 |
e | init을 제외한 모든 프로세스에 SIGTERM 전송 |
i | init을 제외한 모든 프로세스에 SIGKILL 전송 |
t | 현재 태스크 목록과 정보 덤프 |
m | 현재 메모리 정보 덤프 |
c | 강제 커널 크래시 (설정 시 crashdump 수행) |
h | 도움말 출력 |
w | uninterruptible(블로킹) 상태 태스크 덤프 |
l | 모든 활성 CPU의 스택 백트레이스 출력 |
r | 키보드 raw 모드 해제 (XLATE로 전환) |
k | SAK — 현재 가상 콘솔의 모든 프로그램 강제 종료 |
f | OOM Killer 호출 (안 죽여도 panic하지 않음) |
전체 키 목록은 커널 문서의 SysRq 페이지에 정리돼 있다.
사용 예제
시스템 재부팅
echo b > /proc/sysrq-trigger
강제 커널 크래시 (panic)
echo c > /proc/sysrq-trigger
kdump 등 crashdump 환경이 구성돼 있으면 이 명령으로 크래시 덤프 수집을 테스트할 수 있다.
디스크 상태 안전하게 저장 후 재부팅
echo s > /proc/sysrq-trigger
echo u > /proc/sysrq-trigger
echo b > /proc/sysrq-trigger
시리얼 콘솔에서의 SysRq
시리얼 콘솔에서는 키보드 대신 BREAK 시그널을 이용해 SysRq를 발동한다. BREAK를 보낸 뒤 1초 안에 명령 키를 전송하면 커널이 이를 SysRq 입력으로 인식한다.
Host (miniterm, cutecom 등)
-> BREAK
-> 'b' 입력 -> reboot
pyserial 예제 (send_break로 BREAK 전송)
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200)
ser.send_break()
ser.write(b'b')
정상적으로 인식되면 커널 로그에 SysRq : Resetting과 같은 메시지가 남는다. pyserial-miniterm에 SysRq용 send BREAK 기능을 추가하는 방법은 아래 글을 참고한다.
SysRq 프로그래밍 인터페이스
사용자 공간: /proc/sysrq-trigger
echo m > /proc/sysrq-trigger
커널 모듈에서 호출
#include
handle_sysrq('m'); // 메모리 정보 출력
사용자 정의 SysRq 등록
static void my_sysrq_handler(u8 key) {
printk(KERN_INFO "Custom SysRq key pressed!\n");
}
static struct sysrq_key_op my_op = {
.handler = my_sysrq_handler,
.help_msg = "x - Custom SysRq",
.action_msg = "SysRq custom",
.enable_mask = SYSRQ_ENABLE_ALWAYS,
};
register_sysrq_key('x', &my_op);
register_sysrq_key()는 이미 등록된 키에 다시 등록을 시도하면 음수를 반환하므로, 실제 코드에서는 반환값을 확인하는 것이 좋다.
문제 해결
| 증상 | 원인 | 해결책 |
|---|---|---|
| SysRq 키 입력 무반응 | 기능 비활성화 | /proc/sys/kernel/sysrq 확인 |
| 시리얼 BREAK 무반응 | 드라이버 미지원 | USB-UART 종류 변경 |
| reboot 실패 | udev/mount 진행 중 | s, u 후 b 실행 |
| 로그 누락 | 콘솔 버퍼 부족 | dmesg -w 또는 netconsole 활용 |
SysRq 작동 구조
키보드 입력은 인터럽트 처리 루틴을 거쳐 handle_sysrq(key)로 전달되고, 여기서 등록된 핸들러(sysrq_key_op)를 찾아 실제 명령(panic, reboot 등)을 실행한다.
