SysRq 사용법

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 + 키 조합으로 실행되며, 자주 쓰는 키는 다음과 같다.

설명
bsync/unmount 없이 즉시 재부팅
o시스템 전원 종료 (power off)
s마운트된 파일시스템 sync 시도
u마운트된 파일시스템을 읽기 전용으로 재마운트 시도
einit을 제외한 모든 프로세스에 SIGTERM 전송
iinit을 제외한 모든 프로세스에 SIGKILL 전송
t현재 태스크 목록과 정보 덤프
m현재 메모리 정보 덤프
c강제 커널 크래시 (설정 시 crashdump 수행)
h도움말 출력
wuninterruptible(블로킹) 상태 태스크 덤프
l모든 활성 CPU의 스택 백트레이스 출력
r키보드 raw 모드 해제 (XLATE로 전환)
kSAK — 현재 가상 콘솔의 모든 프로그램 강제 종료
fOOM 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, ub 실행
로그 누락콘솔 버퍼 부족dmesg -w 또는 netconsole 활용

SysRq 작동 구조

키보드 입력은 인터럽트 처리 루틴을 거쳐 handle_sysrq(key)로 전달되고, 여기서 등록된 핸들러(sysrq_key_op)를 찾아 실제 명령(panic, reboot 등)을 실행한다.

참고

답글 남기기