0001 Linux Magic System Request Key Hacks
0002 ====================================
0003
0004 Documentation for sysrq.c
0005
0006 What is the magic SysRq key?
0007 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0008
0009 It is a 'magical' key combo you can hit which the kernel will respond to
0010 regardless of whatever else it is doing, unless it is completely locked up.
0011
0012 How do I enable the magic SysRq key?
0013 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0014
0015 You need to say "yes" to 'Magic SysRq key (CONFIG_MAGIC_SYSRQ)' when
0016 configuring the kernel. When running a kernel with SysRq compiled in,
0017 /proc/sys/kernel/sysrq controls the functions allowed to be invoked via
0018 the SysRq key. The default value in this file is set by the
0019 CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE config symbol, which itself defaults
0020 to 1. Here is the list of possible values in /proc/sys/kernel/sysrq:
0021
0022 - 0 - disable sysrq completely
0023 - 1 - enable all functions of sysrq
0024 - >1 - bitmask of allowed sysrq functions (see below for detailed function
0025 description)::
0026
0027 2 = 0x2 - enable control of console logging level
0028 4 = 0x4 - enable control of keyboard (SAK, unraw)
0029 8 = 0x8 - enable debugging dumps of processes etc.
0030 16 = 0x10 - enable sync command
0031 32 = 0x20 - enable remount read-only
0032 64 = 0x40 - enable signalling of processes (term, kill, oom-kill)
0033 128 = 0x80 - allow reboot/poweroff
0034 256 = 0x100 - allow nicing of all RT tasks
0035
0036 You can set the value in the file by the following command::
0037
0038 echo "number" >/proc/sys/kernel/sysrq
0039
0040 The number may be written here either as decimal or as hexadecimal
0041 with the 0x prefix. CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE must always be
0042 written in hexadecimal.
0043
0044 Note that the value of ``/proc/sys/kernel/sysrq`` influences only the invocation
0045 via a keyboard. Invocation of any operation via ``/proc/sysrq-trigger`` is
0046 always allowed (by a user with admin privileges).
0047
0048 How do I use the magic SysRq key?
0049 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0050
0051 On x86
0052 You press the key combo :kbd:`ALT-SysRq-<command key>`.
0053
0054 .. note::
0055 Some
0056 keyboards may not have a key labeled 'SysRq'. The 'SysRq' key is
0057 also known as the 'Print Screen' key. Also some keyboards cannot
0058 handle so many keys being pressed at the same time, so you might
0059 have better luck with press :kbd:`Alt`, press :kbd:`SysRq`,
0060 release :kbd:`SysRq`, press :kbd:`<command key>`, release everything.
0061
0062 On SPARC
0063 You press :kbd:`ALT-STOP-<command key>`, I believe.
0064
0065 On the serial console (PC style standard serial ports only)
0066 You send a ``BREAK``, then within 5 seconds a command key. Sending
0067 ``BREAK`` twice is interpreted as a normal BREAK.
0068
0069 On PowerPC
0070 Press :kbd:`ALT - Print Screen` (or :kbd:`F13`) - :kbd:`<command key>`.
0071 :kbd:`Print Screen` (or :kbd:`F13`) - :kbd:`<command key>` may suffice.
0072
0073 On other
0074 If you know of the key combos for other architectures, please
0075 submit a patch to be included in this section.
0076
0077 On all
0078 Write a character to /proc/sysrq-trigger. e.g.::
0079
0080 echo t > /proc/sysrq-trigger
0081
0082 The :kbd:`<command key>` is case sensitive.
0083
0084 What are the 'command' keys?
0085 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0086
0087 =========== ===================================================================
0088 Command Function
0089 =========== ===================================================================
0090 ``b`` Will immediately reboot the system without syncing or unmounting
0091 your disks.
0092
0093 ``c`` Will perform a system crash and a crashdump will be taken
0094 if configured.
0095
0096 ``d`` Shows all locks that are held.
0097
0098 ``e`` Send a SIGTERM to all processes, except for init.
0099
0100 ``f`` Will call the oom killer to kill a memory hog process, but do not
0101 panic if nothing can be killed.
0102
0103 ``g`` Used by kgdb (kernel debugger)
0104
0105 ``h`` Will display help (actually any other key than those listed
0106 here will display help. but ``h`` is easy to remember :-)
0107
0108 ``i`` Send a SIGKILL to all processes, except for init.
0109
0110 ``j`` Forcibly "Just thaw it" - filesystems frozen by the FIFREEZE ioctl.
0111
0112 ``k`` Secure Access Key (SAK) Kills all programs on the current virtual
0113 console. NOTE: See important comments below in SAK section.
0114
0115 ``l`` Shows a stack backtrace for all active CPUs.
0116
0117 ``m`` Will dump current memory info to your console.
0118
0119 ``n`` Used to make RT tasks nice-able
0120
0121 ``o`` Will shut your system off (if configured and supported).
0122
0123 ``p`` Will dump the current registers and flags to your console.
0124
0125 ``q`` Will dump per CPU lists of all armed hrtimers (but NOT regular
0126 timer_list timers) and detailed information about all
0127 clockevent devices.
0128
0129 ``r`` Turns off keyboard raw mode and sets it to XLATE.
0130
0131 ``s`` Will attempt to sync all mounted filesystems.
0132
0133 ``t`` Will dump a list of current tasks and their information to your
0134 console.
0135
0136 ``u`` Will attempt to remount all mounted filesystems read-only.
0137
0138 ``v`` Forcefully restores framebuffer console
0139 ``v`` Causes ETM buffer dump [ARM-specific]
0140
0141 ``w`` Dumps tasks that are in uninterruptable (blocked) state.
0142
0143 ``x`` Used by xmon interface on ppc/powerpc platforms.
0144 Show global PMU Registers on sparc64.
0145 Dump all TLB entries on MIPS.
0146
0147 ``y`` Show global CPU Registers [SPARC-64 specific]
0148
0149 ``z`` Dump the ftrace buffer
0150
0151 ``0``-``9`` Sets the console log level, controlling which kernel messages
0152 will be printed to your console. (``0``, for example would make
0153 it so that only emergency messages like PANICs or OOPSes would
0154 make it to your console.)
0155 =========== ===================================================================
0156
0157 Okay, so what can I use them for?
0158 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0159
0160 Well, unraw(r) is very handy when your X server or a svgalib program crashes.
0161
0162 sak(k) (Secure Access Key) is useful when you want to be sure there is no
0163 trojan program running at console which could grab your password
0164 when you would try to login. It will kill all programs on given console,
0165 thus letting you make sure that the login prompt you see is actually
0166 the one from init, not some trojan program.
0167
0168 .. important::
0169
0170 In its true form it is not a true SAK like the one in a
0171 c2 compliant system, and it should not be mistaken as
0172 such.
0173
0174 It seems others find it useful as (System Attention Key) which is
0175 useful when you want to exit a program that will not let you switch consoles.
0176 (For example, X or a svgalib program.)
0177
0178 ``reboot(b)`` is good when you're unable to shut down, it is an equivalent
0179 of pressing the "reset" button.
0180
0181 ``crash(c)`` can be used to manually trigger a crashdump when the system is hung.
0182 Note that this just triggers a crash if there is no dump mechanism available.
0183
0184 ``sync(s)`` is handy before yanking removable medium or after using a rescue
0185 shell that provides no graceful shutdown -- it will ensure your data is
0186 safely written to the disk. Note that the sync hasn't taken place until you see
0187 the "OK" and "Done" appear on the screen.
0188
0189 ``umount(u)`` can be used to mark filesystems as properly unmounted. From the
0190 running system's point of view, they will be remounted read-only. The remount
0191 isn't complete until you see the "OK" and "Done" message appear on the screen.
0192
0193 The loglevels ``0``-``9`` are useful when your console is being flooded with
0194 kernel messages you do not want to see. Selecting ``0`` will prevent all but
0195 the most urgent kernel messages from reaching your console. (They will
0196 still be logged if syslogd/klogd are alive, though.)
0197
0198 ``term(e)`` and ``kill(i)`` are useful if you have some sort of runaway process
0199 you are unable to kill any other way, especially if it's spawning other
0200 processes.
0201
0202 "just thaw ``it(j)``" is useful if your system becomes unresponsive due to a
0203 frozen (probably root) filesystem via the FIFREEZE ioctl.
0204
0205 Sometimes SysRq seems to get 'stuck' after using it, what can I do?
0206 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0207
0208 When this happens, try tapping shift, alt and control on both sides of the
0209 keyboard, and hitting an invalid sysrq sequence again. (i.e., something like
0210 :kbd:`alt-sysrq-z`).
0211
0212 Switching to another virtual console (:kbd:`ALT+Fn`) and then back again
0213 should also help.
0214
0215 I hit SysRq, but nothing seems to happen, what's wrong?
0216 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0217
0218 There are some keyboards that produce a different keycode for SysRq than the
0219 pre-defined value of 99
0220 (see ``KEY_SYSRQ`` in ``include/uapi/linux/input-event-codes.h``), or
0221 which don't have a SysRq key at all. In these cases, run ``showkey -s`` to find
0222 an appropriate scancode sequence, and use ``setkeycodes <sequence> 99`` to map
0223 this sequence to the usual SysRq code (e.g., ``setkeycodes e05b 99``). It's
0224 probably best to put this command in a boot script. Oh, and by the way, you
0225 exit ``showkey`` by not typing anything for ten seconds.
0226
0227 I want to add SysRQ key events to a module, how does it work?
0228 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0229
0230 In order to register a basic function with the table, you must first include
0231 the header ``include/linux/sysrq.h``, this will define everything else you need.
0232 Next, you must create a ``sysrq_key_op`` struct, and populate it with A) the key
0233 handler function you will use, B) a help_msg string, that will print when SysRQ
0234 prints help, and C) an action_msg string, that will print right before your
0235 handler is called. Your handler must conform to the prototype in 'sysrq.h'.
0236
0237 After the ``sysrq_key_op`` is created, you can call the kernel function
0238 ``register_sysrq_key(int key, const struct sysrq_key_op *op_p);`` this will
0239 register the operation pointed to by ``op_p`` at table key 'key',
0240 if that slot in the table is blank. At module unload time, you must call
0241 the function ``unregister_sysrq_key(int key, const struct sysrq_key_op *op_p)``,
0242 which will remove the key op pointed to by 'op_p' from the key 'key', if and
0243 only if it is currently registered in that slot. This is in case the slot has
0244 been overwritten since you registered it.
0245
0246 The Magic SysRQ system works by registering key operations against a key op
0247 lookup table, which is defined in 'drivers/tty/sysrq.c'. This key table has
0248 a number of operations registered into it at compile time, but is mutable,
0249 and 2 functions are exported for interface to it::
0250
0251 register_sysrq_key and unregister_sysrq_key.
0252
0253 Of course, never ever leave an invalid pointer in the table. I.e., when
0254 your module that called register_sysrq_key() exits, it must call
0255 unregister_sysrq_key() to clean up the sysrq key table entry that it used.
0256 Null pointers in the table are always safe. :)
0257
0258 If for some reason you feel the need to call the handle_sysrq function from
0259 within a function called by handle_sysrq, you must be aware that you are in
0260 a lock (you are also in an interrupt handler, which means don't sleep!), so
0261 you must call ``__handle_sysrq_nolock`` instead.
0262
0263 When I hit a SysRq key combination only the header appears on the console?
0264 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0265
0266 Sysrq output is subject to the same console loglevel control as all
0267 other console output. This means that if the kernel was booted 'quiet'
0268 as is common on distro kernels the output may not appear on the actual
0269 console, even though it will appear in the dmesg buffer, and be accessible
0270 via the dmesg command and to the consumers of ``/proc/kmsg``. As a specific
0271 exception the header line from the sysrq command is passed to all console
0272 consumers as if the current loglevel was maximum. If only the header
0273 is emitted it is almost certain that the kernel loglevel is too low.
0274 Should you require the output on the console channel then you will need
0275 to temporarily up the console loglevel using :kbd:`alt-sysrq-8` or::
0276
0277 echo 8 > /proc/sysrq-trigger
0278
0279 Remember to return the loglevel to normal after triggering the sysrq
0280 command you are interested in.
0281
0282 I have more questions, who can I ask?
0283 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
0284
0285 Just ask them on the linux-kernel mailing list:
0286 linux-kernel@vger.kernel.org
0287
0288 Credits
0289 ~~~~~~~
0290
0291 - Written by Mydraal <vulpyne@vulpyne.net>
0292 - Updated by Adam Sulmicki <adam@cfar.umd.edu>
0293 - Updated by Jeremy M. Dolan <jmd@turbogeek.org> 2001/01/28 10:15:59
0294 - Added to by Crutcher Dunnavant <crutcher+kernel@datastacks.com>