|
@@ -1,6 +1,6 @@
|
|
|
Linux Magic System Request Key Hacks
|
|
|
-Documentation for sysrq.c version 1.15
|
|
|
-Last update: $Date: 2001/01/28 10:15:59 $
|
|
|
+Documentation for sysrq.c
|
|
|
+Last update: 2007-JAN-06
|
|
|
|
|
|
* What is the magic SysRq key?
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
@@ -35,7 +35,7 @@ You can set the value in the file by the following command:
|
|
|
|
|
|
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.
|
|
|
+allowed (by a user with admin privileges).
|
|
|
|
|
|
* How do I use the magic SysRq key?
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
@@ -58,7 +58,7 @@ On PowerPC - Press 'ALT - Print Screen (or F13) - <command key>,
|
|
|
On other - If you know of the key combos for other architectures, please
|
|
|
let me know so I can add them to this section.
|
|
|
|
|
|
-On all - write a character to /proc/sysrq-trigger. eg:
|
|
|
+On all - write a character to /proc/sysrq-trigger. e.g.:
|
|
|
|
|
|
echo t > /proc/sysrq-trigger
|
|
|
|
|
@@ -74,6 +74,8 @@ On all - write a character to /proc/sysrq-trigger. eg:
|
|
|
|
|
|
'c' - Will perform a kexec reboot in order to take a crashdump.
|
|
|
|
|
|
+'d' - Shows all locks that are held.
|
|
|
+
|
|
|
'o' - Will shut your system off (if configured and supported).
|
|
|
|
|
|
's' - Will attempt to sync all mounted filesystems.
|
|
@@ -87,38 +89,43 @@ On all - write a character to /proc/sysrq-trigger. eg:
|
|
|
|
|
|
'm' - Will dump current memory info to your console.
|
|
|
|
|
|
+'n' - Used to make RT tasks nice-able
|
|
|
+
|
|
|
'v' - Dumps Voyager SMP processor info to your console.
|
|
|
|
|
|
+'w' - Dumps tasks that are in uninterruptable (blocked) state.
|
|
|
+
|
|
|
+'x' - Used by xmon interface on ppc/powerpc platforms.
|
|
|
+
|
|
|
'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.)
|
|
|
|
|
|
-'f' - Will call oom_kill to kill a memory hog process
|
|
|
+'f' - Will call oom_kill to kill a memory hog process.
|
|
|
|
|
|
'e' - Send a SIGTERM to all processes, except for init.
|
|
|
|
|
|
-'i' - Send a SIGKILL to all processes, except for init.
|
|
|
+'g' - Used by kgdb on ppc platforms.
|
|
|
|
|
|
-'l' - Send a SIGKILL to all processes, INCLUDING init. (Your system
|
|
|
- will be non-functional after this.)
|
|
|
+'i' - Send a SIGKILL to all processes, except for init.
|
|
|
|
|
|
-'h' - Will display help ( actually any other key than those listed
|
|
|
+'h' - Will display help (actually any other key than those listed
|
|
|
above will display help. but 'h' is easy to remember :-)
|
|
|
|
|
|
* Okay, so what can I use them for?
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
Well, un'R'aw is very handy when your X server or a svgalib program crashes.
|
|
|
|
|
|
-sa'K' (Secure Access Key) is useful when you want to be sure there are no
|
|
|
-trojan program is running at console and which could grab your password
|
|
|
-when you would try to login. It will kill all programs on given console
|
|
|
-and thus letting you make sure that the login prompt you see is actually
|
|
|
+sa'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 :IMPORTANT
|
|
|
IMPORTANT: c2 compliant system, and it should not be mistaken as :IMPORTANT
|
|
|
IMPORTANT: such. :IMPORTANT
|
|
|
- It seems other find it useful as (System Attention Key) which is
|
|
|
+ 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.)
|
|
|
|
|
@@ -139,8 +146,8 @@ OK or Done message...)
|
|
|
Again, the unmount (remount read-only) hasn't taken place until you see the
|
|
|
"OK" and "Done" message appear on the screen.
|
|
|
|
|
|
-The loglevel'0'-'9' is useful when your console is being flooded with
|
|
|
-kernel messages you do not want to see. Setting '0' will prevent all but
|
|
|
+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.)
|
|
|
|
|
@@ -152,7 +159,7 @@ processes.
|
|
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
|
|
That happens to me, also. I've found that tapping shift, alt, and control
|
|
|
on both sides of the keyboard, and hitting an invalid sysrq sequence again
|
|
|
-will fix the problem. (ie, something like alt-sysrq-z). Switching to another
|
|
|
+will fix the problem. (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?
|
|
@@ -174,11 +181,11 @@ 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 macro
|
|
|
-register_sysrq_key(int key, struct sysrq_key_op *op_p) that is defined in
|
|
|
-sysrq.h, 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 macro unregister_sysrq_key(int key, struct sysrq_key_op *op_p), which
|
|
|
+After the sysrq_key_op is created, you can call the kernel function
|
|
|
+register_sysrq_key(int key, 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, 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.
|
|
@@ -186,15 +193,12 @@ 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/char/sysrq.c'. This key table has
|
|
|
a number of operations registered into it at compile time, but is mutable,
|
|
|
-and 4 functions are exported for interface to it: __sysrq_lock_table,
|
|
|
-__sysrq_unlock_table, __sysrq_get_key_op, and __sysrq_put_key_op. The
|
|
|
-functions __sysrq_swap_key_ops and __sysrq_swap_key_ops_nolock are defined
|
|
|
-in the header itself, and the REGISTER and UNREGISTER macros are built from
|
|
|
-these. More complex (and dangerous!) manipulations of the table are possible
|
|
|
-using these functions, but you must be careful to always lock the table before
|
|
|
-you read or write from it, and to unlock it again when you are done. (And of
|
|
|
-course, to never ever leave an invalid pointer in the table). Null pointers in
|
|
|
-the table are always safe :)
|
|
|
+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
|