2007. 11. 20. 11:19 Unix/Linux
Magic SysRq Key Setting
o Magic SysRq Key란 무엇인가?
- magic system request key 의 줄임말.
- magical key combo를 말하는 것으로 해당 키를 누르게되면 커널이 무엇을
하고 있던간에 커널이 완전히 죽은 경우가 아니라면, 바로 응답을 준다.
o 커널 컴파일옵션
make menuconfig -> Kernel Hacking -> Kernel Debugging 체크 -> Magic Sysrq Key 체크
* 일반적으로 배포되는 리눅스에는 위 옵션이 기본적으로 체크되어 있다. 따라서
설치된 커널은 이미 sysrq 를 지원하도록 준비가 되어있는 셈이다.
o sysrq 활성화/비활성화
sysrq 를 run-time 에 enable / disable 할 수 있는데, 다음 명령을 사용한다.
enable : # echo 1 > /proc/sys/kernel/sysrq
disable : # echo 0 > /proc/sys/kernel/sysrq
o sysrq 사용
콘솔에서 <alt>-<sysrq>-"magic key" 를 누르면 된다.
o magic key 종류와 기능
magic key 에 해당하는 키와 그 기능을 살펴보면 다음과 같다.
(아래 내용은 커널 소스의 Documents/sysrq.txt 를 참조하였다.)
'r' - 키보드 raw mode를 끄고 XLATE모드로 설정
(상당히 제한적이며, 상/하 키 이벤트를 탐지할 수 없다. 모든 키에 대해 Ctrl/Alt/Shift를 처리할 수 없다)
(* Quite limited, cannot detect key up/key down events. Doesn't handle ctrl/alt/shift for all keys.)
-> X 서버 또는 svgalib 프로그램 Crash의 경우 편리함
'k' - Secure Access Key (SAK), 현재 가상 콘솔 상의 모든 프로그램을 종료한다.
(로그인시에 패스워드를 갈취하는 트로이목마 프로그램이 없기를 원할 때 유용하다.
현재 가상 콘솔상의 모든 프로그램을 종료하여 트로이목마 프로그램이 실행한 것이 아닌 init에 의해
실행된 로그인 프롬프트를 원할 경우)
'b' - sync나 디스크의 마운트해제(unmount)없이 시스템을 즉시 reboot
'c' - sync나 디스크의 마운트해제없이 의도적으로 시스템 crash를 일으킨다.
이 키는 NETDUMP 클라이언트 패키지 또는 DISKDUMP 패키지가 설치되었다면 가장 유용하다
'o' - 시스템을 끈다.(설정이 되어 있고 지원한다면).
's' - 모든 마운트된 파일 시스템에 대해 sync 시도
'u' - 모든 마운트된 파일 시스템을 읽기전용으로 마운트 시도
'p' - 콘솔상에 현재 레지스터(register)와 플래그(flag)를 뿌려준다.
't' - 콘솔상에 현재 작업 목록과 그 정보를 뿌려준다.
'm' - 콘솔상에 현재 메모리 정보를 뿌려준다.
'v' - Dumps Voyager SMP processor info to your console.
(Voyager SMP Processor가 뭔지.. 암튼 그 프로세서 정보를 콘솔에 뿌려준단다.)
'0'-'9' - 어떤 커널 메세지를 콘솔에 뿌려줄지 제어하는 콘솔 로그 레벨을 설정한다.
('0'의 경우 매우 긴급한 메시지만 콘솔상에 뿌려준다. syslogd/klogd가
실행중이라면 계속 로그를 생성한다.(파일시스템에..))
'e' - init 프로세스를 제외한 모든 프로세스에 SIGTERM 시그널을 보낸다.
'i' - init 프로세스를 제외한 모든 프로세스에 SIGKILL 시그널을 보낸다.
'l' - 모든 프로세스(init 포함)에 SIGKILL 시그널을 보낸다.(이를 수행한 후에 시스템은 동작하지 않음)
'h' - 도움말을 표시한다.(실제로 위의 목록에 없는 key들은 도움말을 보여준다. 하지만 'h'가 기억하기 쉬움)
위에서 run-time 으로 sysrq ON/OFF 를 할 수 있는 방법을 얘기하였다. 하지만 이것은 reboot 후에는 적용되지
않는다. reboot 후에 적용되도록 하려면, 다음과 같은 방법을 사용한다.
1. /etc/sysctl.conf 파일을 직접 수정한다.
# vi /etc/sysctl.conf
kernel.sysrq = 1 입력
# reboot
위와 같이 하면 reboot 후 항상 sysrq 가 enable 상태로 reboot 된다.
2. sysctl 명령어를 사용한다.
# sysctl -w kernel.sysrq=1
위 명령은 결국 /etc/sysctl.conf 에 kernel.sysrq=1 옵션을 기록해준다. 따라서 reboot 후에 적용된다.
만일 서버에 접속할 수는 있어도 콘솔은 없는 경우에 sysrq 를 사용하고 싶다면, 다음 파일을 사용하여 가능하다.
/proc/sysrq-trigger
말 그대로 sysrq-trigger 이다. 해당 파일의 permission 은 --w------ 이다. 즉 root 권한으로 쓰기만 가능하다.
echo b > /proc/sysrq-trigger 라고 하면 콘솔에서 <alt>-<sysrq>-"b" 를 누른것과 동일한 효과를 나타낸다. 즉 reboot 된다. 즉 sysrq-trigger 파일에 원하는 명령어를 써주면 바로 해당하는 sysrq 명령이 수행된다.
** 상기 내용은 http://blog.naver.com/pinocc/120037594446의 내용에 리눅스 커널문서중 sysrq.txt의 내용을
첨가하여 정리한 것임
** 더 상세한 내용은 sysrq.txt 내용을 보시기 바람.