Back to home page

OSCL-LXR

 
 

    


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>