**SysRq(System Request)**는 리눅스 커널에 내장된 긴급 제어 백도어이다. 커널이 응답하지 않거나 시스템이 매우 불안정할 때도, SysRq 키 조합을 통해 시스템을 진단하거나 복구할 수 있도록 도와주는 기능을 한다.
이 글에서는 SysRq의 개념부터 시작해 활성화 방법, 각 명령어의 사용법, 시리얼 터미널 및 프로그래밍적으로 사용하는 방법등에 대해 알아본다.
SysRq ?
SysRq는 리눅스 커널에 탑재된 긴급 커널 제어 명령 도구이다. 사용자나 개발자가 커널이 반응하지 않는 상황에서도 시스템을 복구하거나 상태를 덤프하는 명령을 실행할 수 있게 한다.
커널 패닉, 디스크 I/O 중단, 커널 히스 등에서도
Alt + SysRq + <key>
입력으로 명령을 실행할 수 있음.
SysRq 사용 환경
구분 | 설명 |
---|---|
GUI 환경 | 일반 키보드에서 Alt + SysRq + <키> |
시리얼 콘솔 | BREAK 시그널 후 SysRq 키 입력 |
프로그램에서 호출 | /proc/sysrq-trigger 사용 또는 커널 API |
SysRq 활성화 방법
1. 일시적으로 활성화
echo 1 > /proc/sys/kernel/sysrq
기본값은
0
(비활성화),1
이면 전체 기능 활성화.
2. sysctl.conf
에 등록 (재부팅 후 유지)
echo "kernel.sysrq = 1" >> /etc/sysctl.conf
sudo sysctl -p
3. 설정 값 의미
값 | 설명 |
---|---|
0 | 비활성화 |
1 | 전체 기능 사용 가능 |
2~255 | 특정 기능만 허용 (비트 조합) |
예:
echo 16 > /proc/sys/kernel/sysrq
→ crash dump (c
)만 허용됨.
SysRq 명령어 종류 및 설명
SysRq 명령은 다음과 같은 키 조합으로 실행된다.
Alt
+SysRq
+키
키 | 설명 |
---|---|
b | 즉시 재부팅 (reboot) |
o | 시스템 전원 종료 (power off) |
s | 디스크 sync (flush) |
u | 마운트 해제 (read-only remount) |
e | 모든 프로세스 SIGTERM 전송 |
i | 모든 프로세스 SIGKILL 전송 |
t | 프로세스 트리 덤프 |
m | 메모리 상태 출력 |
c | 강제 커널 크래시 (panic) |
h | 도움말 출력 |
w | 블로킹된 태스크 출력 |
l | 현재 CPU 백트레이스 출력 |
r | 키보드 Raw 모드 해제 |
k | 현재 콘솔 강제 종료 |
f | OOM Killer 실행 |
사용 예제
1. 시스템 재부팅
echo b > /proc/sysrq-trigger
2. 강제 커널 크래시 (panic)
echo c > /proc/sysrq-trigger
crashdump 환경에서 사용
3. 디스크 상태 안전하게 저장 후 재부팅
echo s > /proc/sysrq-trigger
echo u > /proc/sysrq-trigger
echo b > /proc/sysrq-trigger
시리얼 콘솔에서의 SysRq
원리
- BREAK 시그널 전송
- 1초 내 SysRq 명령 키 전송
실행 흐름
Host (miniterm, cutecom 등)
└─> BREAK
└─> 'b' 입력 → reboot
pyserial 예제 (Ctrl+B로 BREAK 전송)
import serial
ser = serial.Serial('/dev/ttyUSB0', 115200)
ser.send_break()
ser.write(b'b')
커널 로그:
SysRq : Resetting
pyserial-miniterm 에 SysRq를 위한 send BREAK를 추가하는 방법은 아래 글을 참고한다.
SysRq 프로그래밍 인터페이스
1. 사용자 공간: /proc/sysrq-trigger
echo m > /proc/sysrq-trigger
2. 커널 모듈에서 호출
#include <linux/sysrq.h>
handle_sysrq('m'); // 메모리 정보 출력
3. 사용자 정의 SysRq 등록
static void my_sysrq_handler(int 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);
문제 해결
증상 | 원인 | 해결책 |
---|---|---|
SysRq 키 입력 무반응 | 기능 비활성화 | /proc/sys/kernel/sysrq 확인 |
시리얼 BREAK 무반응 | 드라이버 미지원 | USB-UART 종류 변경 |
reboot 실패 | udev/mount 진행 중 | s , u 후 b 실행 |
로그 누락 | 콘솔 버퍼 부족 | dmesg -w 또는 netconsole 활용 |
SysRq 작동 구조
