요약·해설과 원문, 전문 번역을 서로 분리했습니다. API 이름, symbol, source path는 원문 표기를 사용합니다.
1. 요약·해설
원문의 핵심 논리와 kernel programming 관점의 보충 설명입니다. 아래의 전문 번역과는 별도로 작성했습니다.
2. 영어 원문 전체
번역 기준이 된 Linux v6.18.37 원문입니다. 줄 번호는 이 버전의 파일 좌표입니다.
원문 전체 펼치기
Linux Magic System Request Key Hacks
====================================
Documentation for sysrq.c
What is the magic SysRq key?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
It is a 'magical' key combo you can hit which the kernel will respond to
regardless of whatever else it is doing, unless it is completely locked up.
How do I enable the magic SysRq key?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You need to say "yes" to 'Magic SysRq key (CONFIG_MAGIC_SYSRQ)' when
configuring the kernel. When running a kernel with SysRq compiled in,
/proc/sys/kernel/sysrq controls the functions allowed to be invoked via
the SysRq key. The default value in this file is set by the
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE config symbol, which itself defaults
to 1. Here is the list of possible values in /proc/sys/kernel/sysrq:
- 0 - disable sysrq completely
- 1 - enable all functions of sysrq
- >1 - bitmask of allowed sysrq functions (see below for detailed function
description)::
2 = 0x2 - enable control of console logging level
4 = 0x4 - enable control of keyboard (SAK, unraw)
8 = 0x8 - enable debugging dumps of processes etc.
16 = 0x10 - enable sync command
32 = 0x20 - enable remount read-only
64 = 0x40 - enable signalling of processes (term, kill, oom-kill)
128 = 0x80 - allow reboot/poweroff
256 = 0x100 - allow nicing of all RT tasks
You can set the value in the file by the following command::
echo "number" >/proc/sys/kernel/sysrq
The number may be written here either as decimal or as hexadecimal
with the 0x prefix. CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE must always be
written in hexadecimal.
Note that the value of ``/proc/sys/kernel/sysrq`` influences only the invocation
via a keyboard. Invocation of any operation via ``/proc/sysrq-trigger`` is
always allowed (by a user with admin privileges).
How do I use the magic SysRq key?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
On x86
You press the key combo `ALT-SysRq-<command key>`.
.. note::
Some
keyboards may not have a key labeled 'SysRq'. The 'SysRq' key is
also known as the 'Print Screen' key. Also some keyboards cannot
handle so many keys being pressed at the same time, so you might
have better luck with press `Alt`, press `SysRq`,
release `SysRq`, press `<command key>`, release everything.
On SPARC
You press `ALT-STOP-<command key>`, I believe.
On the serial console (PC style standard serial ports only)
You send a ``BREAK``, then within 5 seconds a command key. Sending
``BREAK`` twice is interpreted as a normal BREAK.
On PowerPC
Press `ALT - Print Screen` (or `F13`) - `<command key>`.
`Print Screen` (or `F13`) - `<command key>` may suffice.
On other
If you know of the key combos for other architectures, please
submit a patch to be included in this section.
On all
Write a single character to /proc/sysrq-trigger.
Only the first character is processed, the rest of the string is
ignored. However, it is not recommended to write any extra characters
as the behavior is undefined and might change in the future versions.
E.g.::
echo t > /proc/sysrq-trigger
Alternatively, write multiple characters prepended by underscore.
This way, all characters will be processed. E.g.::
echo _reisub > /proc/sysrq-trigger
The `<command key>` is case sensitive.
What are the 'command' keys?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
=========== ===================================================================
Command Function
=========== ===================================================================
``b`` Will immediately reboot the system without syncing or unmounting
your disks.
``c`` Will perform a system crash and a crashdump will be taken
if configured.
``d`` Shows all locks that are held.
``e`` Send a SIGTERM to all processes, except for init.
``f`` Will call the oom killer to kill a memory hog process, but do not
panic if nothing can be killed.
``g`` Used by kgdb (kernel debugger)
``h`` Will display help (actually any other key than those listed
here will display help. but ``h`` is easy to remember :-)
``i`` Send a SIGKILL to all processes, except for init.
``j`` Forcibly "Just thaw it" - filesystems frozen by the FIFREEZE ioctl.
``k`` Secure Access Key (SAK) Kills all programs on the current virtual
console. NOTE: See important comments below in SAK section.
``l`` Shows a stack backtrace for all active CPUs.
``m`` Will dump current memory info to your console.
``n`` Used to make RT tasks nice-able
``o`` Will shut your system off (if configured and supported).
``p`` Will dump the current registers and flags to your console.
``q`` Will dump per CPU lists of all armed hrtimers (but NOT regular
timer_list timers) and detailed information about all
clockevent devices.
``r`` Turns off keyboard raw mode and sets it to XLATE.
``s`` Will attempt to sync all mounted filesystems.
``t`` Will dump a list of current tasks and their information to your
console.
``u`` Will attempt to remount all mounted filesystems read-only.
``v`` Forcefully restores framebuffer console
``v`` Causes ETM buffer dump [ARM-specific]
``w`` Dumps tasks that are in uninterruptible (blocked) state.
``x`` Used by xmon interface on ppc/powerpc platforms.
Show global PMU Registers on sparc64.
Dump all TLB entries on MIPS.
``y`` Show global CPU Registers [SPARC-64 specific]
``z`` Dump the ftrace buffer
``0``-``9`` Sets the console log level, controlling which kernel messages
will be printed to your console. (``0``, for example would make
it so that only emergency messages like PANICs or OOPSes would
make it to your console.)
``R`` Replay the kernel log messages on consoles.
=========== ===================================================================
Okay, so what can I use them for?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Well, unraw(r) is very handy when your X server or a svgalib program crashes.
sak(k) (Secure Access Key) is useful when you want to be sure there is no
trojan program running at console which could grab your password
when you would try to login. It will kill all programs on given console,
thus letting you make sure that the login prompt you see is actually
the one from init, not some trojan program.
.. important::
In its true form it is not a true SAK like the one in a
c2 compliant system, and it should not be mistaken as
such.
It seems others find it useful as (System Attention Key) which is
useful when you want to exit a program that will not let you switch consoles.
(For example, X or a svgalib program.)
``reboot(b)`` is good when you're unable to shut down, it is an equivalent
of pressing the "reset" button.
``crash(c)`` can be used to manually trigger a crashdump when the system is hung.
Note that this just triggers a crash if there is no dump mechanism available.
``sync(s)`` is handy before yanking removable medium or after using a rescue
shell that provides no graceful shutdown -- it will ensure your data is
safely written to the disk. Note that the sync hasn't taken place until you see
the "OK" and "Done" appear on the screen.
``umount(u)`` can be used to mark filesystems as properly unmounted. From the
running system's point of view, they will be remounted read-only. The remount
isn't complete until you see the "OK" and "Done" message appear on the screen.
The loglevels ``0``-``9`` are useful when your console is being flooded with
kernel messages you do not want to see. Selecting ``0`` will prevent all but
the most urgent kernel messages from reaching your console. (They will
still be logged if syslogd/klogd are alive, though.)
``term(e)`` and ``kill(i)`` are useful if you have some sort of runaway process
you are unable to kill any other way, especially if it's spawning other
processes.
"just thaw ``it(j)``" is useful if your system becomes unresponsive due to a
frozen (probably root) filesystem via the FIFREEZE ioctl.
``Replay logs(R)`` is useful to view the kernel log messages when system is hung
or you are not able to use dmesg command to view the messages in printk buffer.
User may have to press the key combination multiple times if console system is
busy. If it is completely locked up, then messages won't be printed. Output
messages depend on current console loglevel, which can be modified using
sysrq[0-9] (see above).
Sometimes SysRq seems to get 'stuck' after using it, what can I do?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
When this happens, try tapping shift, alt and control on both sides of the
keyboard, and hitting an invalid sysrq sequence again. (i.e., something like
`alt-sysrq-z`).
Switching to another virtual console (`ALT+Fn`) and then back again
should also help.
I hit SysRq, but nothing seems to happen, what's wrong?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
There are some keyboards that produce a different keycode for SysRq than the
pre-defined value of 99
(see ``KEY_SYSRQ`` in ``include/uapi/linux/input-event-codes.h``), or
which don't have a SysRq key at all. In these cases, run ``showkey -s`` to find
an appropriate scancode sequence, and use ``setkeycodes <sequence> 99`` to map
this sequence to the usual SysRq code (e.g., ``setkeycodes e05b 99``). It's
probably best to put this command in a boot script. Oh, and by the way, you
exit ``showkey`` by not typing anything for ten seconds.
I want to add SysRQ key events to a module, how does it work?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
In order to register a basic function with the table, you must first include
the header ``include/linux/sysrq.h``, this will define everything else you need.
Next, you must create a ``sysrq_key_op`` struct, and populate it with A) the key
handler function you will use, B) a help_msg string, that will print when SysRQ
prints help, and C) an action_msg string, that will print right before your
handler is called. Your handler must conform to the prototype in 'sysrq.h'.
After the ``sysrq_key_op`` is created, you can call the kernel function
``register_sysrq_key(int key, const struct sysrq_key_op *op_p);`` this will
register the operation pointed to by ``op_p`` at table key 'key',
if that slot in the table is blank. At module unload time, you must call
the function ``unregister_sysrq_key(int key, const struct sysrq_key_op *op_p)``,
which will remove the key op pointed to by 'op_p' from the key 'key', if and
only if it is currently registered in that slot. This is in case the slot has
been overwritten since you registered it.
The Magic SysRQ system works by registering key operations against a key op
lookup table, which is defined in 'drivers/tty/sysrq.c'. This key table has
a number of operations registered into it at compile time, but is mutable,
and 2 functions are exported for interface to it::
register_sysrq_key and unregister_sysrq_key.
Of course, never ever leave an invalid pointer in the table. I.e., when
your module that called register_sysrq_key() exits, it must call
unregister_sysrq_key() to clean up the sysrq key table entry that it used.
Null pointers in the table are always safe. :)
If for some reason you feel the need to call the handle_sysrq function from
within a function called by handle_sysrq, you must be aware that you are in
a lock (you are also in an interrupt handler, which means don't sleep!), so
you must call ``__handle_sysrq_nolock`` instead.
When I hit a SysRq key combination only the header appears on the console?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Sysrq output is subject to the same console loglevel control as all
other console output. This means that if the kernel was booted 'quiet'
as is common on distro kernels the output may not appear on the actual
console, even though it will appear in the dmesg buffer, and be accessible
via the dmesg command and to the consumers of ``/proc/kmsg``. As a specific
exception the header line from the sysrq command is passed to all console
consumers as if the current loglevel was maximum. If only the header
is emitted it is almost certain that the kernel loglevel is too low.
Should you require the output on the console channel then you will need
to temporarily up the console loglevel using `alt-sysrq-8` or::
echo 8 > /proc/sysrq-trigger
Remember to return the loglevel to normal after triggering the sysrq
command you are interested in.
I have more questions, who can I ask?
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Just ask them on the linux-kernel mailing list:
linux-kernel@vger.kernel.org
Credits
~~~~~~~
- Written by Mydraal <vulpyne@vulpyne.net>
- Updated by Adam Sulmicki <adam@cfar.umd.edu>
- Updated by Jeremy M. Dolan <jmd@turbogeek.org> 2001/01/28 10:15:59
- Added to by Crutcher Dunnavant <crutcher+kernel@datastacks.com>
3. 한국어 전문 번역
영어 원문의 문단 순서와 의미를 유지한 전체 번역입니다. 코드, 함수명, symbol과 URL은 원문 표기를 유지합니다.
Linux Magic System Request Key Hacks
1-5`sysrq.c`에 대한 Magic SysRq 사용 설명서입니다.
What is the magic SysRq key?
6-11system이 완전히 lock up된 경우를 제외하면 kernel이 다른 어떤 작업 중이더라도 응답하는 특별한 key combination입니다.
How do I enable the magic SysRq key?
12-47kernel 구성에서 `Magic SysRq key (CONFIG_MAGIC_SYSRQ)`를 활성화해야 합니다. SysRq가 compile된 kernel에서는 `/proc/sys/kernel/sysrq`가 keyboard로 호출할 수 있는 기능을 제어합니다. 기본값은 기본적으로 `1`인 `CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE` symbol이 정합니다.
| 값 | 허용 기능 |
|---|---|
| `0` | SysRq 완전 비활성화 |
| `1` | 모든 SysRq 기능 활성화 |
| `>1` | 아래 bitmask로 기능을 선택 |
2 = 0x2 - enable control of console logging level
4 = 0x4 - enable control of keyboard (SAK, unraw)
8 = 0x8 - enable debugging dumps of processes etc.
16 = 0x10 - enable sync command
32 = 0x20 - enable remount read-only
64 = 0x40 - enable signalling of processes (term, kill, oom-kill)
128 = 0x80 - allow reboot/poweroff
256 = 0x100 - allow nicing of all RT tasks
다음 명령으로 값을 설정합니다.
echo "number" >/proc/sys/kernel/sysrq
값은 decimal 또는 `0x` prefix가 붙은 hexadecimal로 쓸 수 있습니다. `CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE`은 항상 hexadecimal로 작성해야 합니다.
`/proc/sys/kernel/sysrq` 값은 keyboard 호출에만 영향을 줍니다. admin privilege가 있는 사용자가 `/proc/sysrq-trigger`로 호출하는 operation은 항상 허용됩니다.
How do I use the magic SysRq key?
48-92| 환경 | 호출 방법 |
|---|---|
| x86 | `ALT-SysRq-<command key>`. SysRq는 Print Screen으로도 표시되며, 동시 key 입력이 안 되면 Alt 누름, SysRq 누름·놓음, command key 누름 순서 사용 |
| SPARC | `ALT-STOP-<command key>` |
| PC 표준 serial console | `BREAK`를 보낸 뒤 5초 안에 command key. `BREAK` 두 번은 normal BREAK |
| PowerPC | `ALT - Print Screen` 또는 `F13` 뒤 `<command key>`. 경우에 따라 Alt 없이도 가능 |
| 기타 architecture | 알려진 key combination을 이 절에 추가하는 patch 제출 |
모든 환경에서 `/proc/sysrq-trigger`에 문자 하나를 쓸 수 있습니다. 첫 문자만 처리되고 나머지는 무시되지만 추가 문자의 동작은 undefined이며 미래에 바뀔 수 있으므로 권장하지 않습니다.
echo t > /proc/sysrq-trigger
underscore를 앞에 붙이면 여러 문자를 모두 처리합니다.
echo _reisub > /proc/sysrq-trigger
`<command key>`는 대소문자를 구분합니다.
What are the 'command' keys?
93-167| command | 기능 |
|---|---|
| `b` | disk sync나 unmount 없이 즉시 reboot |
| `c` | system crash 수행. 구성되어 있으면 crashdump 생성 |
| `d` | 현재 held lock 모두 표시 |
| `e` | init을 제외한 모든 process에 SIGTERM |
| `f` | OOM killer로 memory hog process 종료. 종료할 대상이 없어도 panic하지 않음 |
| `g` | kgdb(kernel debugger) |
| `h` | help 표시. 목록에 없는 다른 key도 help 표시 |
| `i` | init을 제외한 모든 process에 SIGKILL |
| `j` | FIFREEZE ioctl로 freeze된 filesystem을 강제로 thaw |
| `k` | Secure Access Key(SAK). 현재 virtual console의 모든 program 종료 |
| `l` | 모든 active CPU의 stack backtrace |
| `m` | 현재 memory 정보 dump |
| `n` | RT task를 nice 가능하게 변경 |
| `o` | 구성과 지원 여부에 따라 system power off |
| `p` | 현재 register와 flag dump |
| `q` | CPU별 armed hrtimer 목록과 clockevent device 상세 정보 dump. 일반 `timer_list` timer 제외 |
| `r` | keyboard raw mode를 끄고 XLATE로 설정 |
| `s` | mount된 모든 filesystem sync 시도 |
| `t` | 현재 task 목록과 정보 dump |
| `u` | mount된 모든 filesystem을 read-only로 remount 시도 |
| `v` | framebuffer console 강제 복원. ARM에서는 ETM buffer dump |
| `w` | uninterruptible(blocked) 상태 task dump |
| `x` | ppc/powerpc의 xmon, sparc64의 global PMU register, MIPS의 모든 TLB entry dump |
| `y` | SPARC-64 global CPU register 표시 |
| `z` | ftrace buffer dump |
| `0`-`9` | console log level 설정. `0`은 PANIC·OOPS 같은 emergency message만 console에 출력 |
| `R` | kernel log message를 console에 replay |
Okay, so what can I use them for?
168-222`unraw(r)`는 X server나 svgalib program crash 뒤 keyboard를 복구하는 데 유용합니다. `sak(k)`는 password를 가로챌 console trojan이 없는지 확인하려고 해당 console의 모든 program을 종료하지만, C2 compliant system의 진정한 SAK는 아닙니다. console 전환을 막는 X나 svgalib program에서 빠져나오는 System Attention Key로도 쓰입니다.
`reboot(b)`는 reset button과 같고 정상 shutdown이 불가능할 때 사용합니다. `crash(c)`는 hung system에서 crashdump를 수동 trigger하며 dump mechanism이 없으면 crash만 일으킵니다.
`sync(s)`는 removable medium 제거 전이나 graceful shutdown이 없는 rescue shell 사용 뒤 data를 disk에 기록합니다. 화면에 `OK`와 `Done`이 나타나기 전에는 완료된 것이 아닙니다. `umount(u)`는 filesystem을 read-only로 remount하며 역시 해당 message를 기다려야 합니다.
loglevel `0`-`9`는 console이 원치 않는 kernel message로 넘칠 때 사용합니다. `0`은 가장 긴급한 message 외에는 console 출력을 막지만 syslogd/klogd가 살아 있으면 log에는 남습니다.
`term(e)`과 `kill(i)`은 다른 방법으로 종료할 수 없고 child를 계속 만드는 runaway process에 유용합니다. `it(j)`는 FIFREEZE ioctl로 freeze된 root filesystem 때문에 system이 응답하지 않을 때 thaw합니다.
`Replay logs(R)`는 hung system이거나 dmesg로 printk buffer를 볼 수 없을 때 kernel log를 확인합니다. console이 바쁘면 여러 번 눌러야 할 수 있고 완전히 lock up되면 출력되지 않습니다. 출력은 `sysrq[0-9]`로 바꿀 수 있는 현재 console loglevel에 의존합니다.
Sometimes SysRq seems to get 'stuck' after using it, what can I do?
223-232keyboard 양쪽의 Shift, Alt, Control을 눌러 보고 `alt-sysrq-z` 같은 invalid SysRq sequence를 다시 입력합니다. 다른 virtual console로 `ALT+Fn` 전환했다가 돌아오는 방법도 도움이 됩니다.
I hit SysRq, but nothing seems to happen, what's wrong?
233-244일부 keyboard는 미리 정한 SysRq keycode `99`와 다른 값을 내거나 SysRq key가 없습니다. `include/uapi/linux/input-event-codes.h`의 `KEY_SYSRQ`를 참조하십시오.
`showkey -s`로 적절한 scancode sequence를 찾고 `setkeycodes <sequence> 99`, 예를 들어 `setkeycodes e05b 99`로 usual SysRq code에 map합니다. boot script에 넣는 것이 좋습니다. `showkey`는 10초 동안 아무것도 입력하지 않으면 종료됩니다.
I want to add SysRQ key events to a module, how does it work?
245-280key table에 기본 function을 등록하려면 `include/linux/sysrq.h`를 include합니다. `sysrq_key_op` struct를 만들고 key handler function, help 출력용 `help_msg`, handler 호출 직전 출력할 `action_msg`를 채웁니다. handler는 `sysrq.h`의 prototype을 따라야 합니다.
`register_sysrq_key(int key, const struct sysrq_key_op *op_p);`는 table slot이 비어 있을 때 `op_p` operation을 key에 등록합니다. module unload 시 `unregister_sysrq_key(int key, const struct sysrq_key_op *op_p)`를 호출하면 해당 slot에 여전히 같은 operation이 있을 때만 제거합니다.
Magic SysRq는 `drivers/tty/sysrq.c`의 mutable key operation lookup table을 사용합니다. compile time에 여러 operation이 등록되고 다음 두 function이 interface로 export됩니다.
register_sysrq_key and unregister_sysrq_key.
`register_sysrq_key()`를 호출한 module은 종료할 때 반드시 `unregister_sysrq_key()`로 entry를 정리해야 하며 invalid pointer를 남기면 안 됩니다. null pointer는 안전합니다.
`handle_sysrq`가 호출한 function 안에서 다시 handle function이 필요하면 lock과 interrupt handler context에 있어 sleep할 수 없으므로 `__handle_sysrq_nolock`을 호출해야 합니다.
When I hit a SysRq key combination only the header appears on the console?
281-299SysRq output도 다른 console output과 같은 loglevel 제어를 받습니다. distro kernel처럼 `quiet`로 boot하면 실제 console에 보이지 않아도 dmesg buffer, dmesg command, `/proc/kmsg` consumer에는 나타납니다.
예외적으로 SysRq command header는 현재 loglevel이 최대인 것처럼 모든 console consumer에 전달됩니다. header만 나오면 kernel loglevel이 너무 낮을 가능성이 큽니다. console 출력이 필요하면 `alt-sysrq-8` 또는 다음 명령으로 임시로 높입니다.
echo 8 > /proc/sysrq-trigger
원하는 SysRq command를 실행한 뒤 loglevel을 정상값으로 되돌리십시오.
I have more questions, who can I ask?
300-305질문은 `linux-kernel@vger.kernel.org` mailing list에 보냅니다.
Credits
306-312Mydraal이 작성했고 Adam Sulmicki, Jeremy M. Dolan, Crutcher Dunnavant가 갱신·추가했습니다.
요약과 해설
sysrq.rst:1-312Magic SysRq는 userspace가 응답하지 않아도 kernel이 살아 있으면 진단·sync·read-only remount·process 종료·reboot 같은 긴급 동작을 수행하는 경로입니다. `b`처럼 sync 없이 즉시 reboot하는 command도 있으므로 복구 순서와 data 손실 위험을 이해한 뒤 사용해야 합니다.