How to enable all SysRq functions on Linux

Objective

Learn how to enable the SysRq functions, and how to use invoke them by using command keys.

Requirements

  • Root permissions
  • Linux Kernel compiled with the “CONFIG_MAGIC_SYSRQ” option enabled

Conventions

  • # – requires given linux commands to be executed with root privileges either
    directly as a root user or by use of sudo command
  • $ – requires given linux commands to be executed as a regular non-privileged user

Introduction

The SysRq key combination can be used to send commands directly to the Linux kernel in some specific circumstances: the kernel will respond to commands sent with command keys immediately, unless it is completely locked. Various command keys achieve specific tasks, and they can be combined to restore the system to a safe state, or to obtain a clean reboot when nothing else works: this is what we can obtain with the reisub sequence.

In this tutorial we will see how to enable all SysRq functions using a standard installation of Ubuntu 18.04 - Bionic Beaver as a base.

The SysRq magic key

The SysRq key combination consists of three keys to be pressed together: ALT + SysRq + command key. You may be wondering what is the SysRq key on your keyboard. Assuming you are using a QWERTY keyboard, the SysRq key corresponds to the print key.

Finally, a command key is a key on the keyboard that when pressed on this special mode, will immediately send a command to the kernel. We will see some of these keys and the functions associated with them in a moment, but before proceeding we must be sure that the kernel we are using has been compiled with the needed option enabled.



The CONFIG_MAGIC_SYSRQ kernel option

As said above, for the SysRq key combination to work, the kernel must have been built with the CONFIG_MAGIC_SYSRQ option enabled. This is usually the case in all major distributions, nonetheless it can be useful to know how to check its state. Here is how we can do it. The first thing we want to know is the version and the name of the kernel we are using. Obtaining this information is very easy, we just run:

$ uname -r
4.13.0-25-generic

As you probably know, the uname command is used to retrieve some system information. In this case we used it with the -r flag, as we only wanted to know about the kernel release.The result of the command has been 4.13.0-25-generic: that is the name of the kernel used by our system. We can now look inside the /boot directory for the corresponding configuration file: this file contains all the options the kernel has been compiled with. We can search for the value used for CONFIG_MAGIC_SYSRQ in it:

$ ls /boot
abi-4.13.0-25-generic     initrd.img-4.13.0-25-generic  memtest86+_multiboot.bin
config-4.13.0-25-generic  memtest86+.bin                System.map-4.13.0-25-generic
grub                      memtest86+.elf                vmlinuz-4.13.0-25-generic

As expected the file is present: config-4.13.0.25-generic is what we are looking for. We now have everything we need, let’s do the check:

$ grep -i CONFIG_MAGIC_SYSRQ /boot/config-4.13.0-25-generic
CONFIG_MAGIC_SYSRQ=y
CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE=0x01b6
CONFIG_MAGIC_SYSRQ_SERIAL=y

As you can see in the first line, the option CONFIG_MAGIC_SYSRQ has y as its value, meaning that it was set as built-in when the kernel was configured. What does the other lines stands for? The CONFIG_MAGIC_SYSRQ_DEFAULT_ENABLE option does specify the default functions enabled: the value is expressed in hexadecimal form, in this case 0x01b6 which does correspond to 438 in decimal form.

As we will see later in this tutorial, this value means that most of the functionalities are enabled by default. However most distributions disable their invocation via key combination for for security reasons. The third option is not very important for us now: it is about enabling the SysRq key over serial.



Checking the current SysRq value

The majority of distributions disable the access to some of SysRq functions via key combinations for security reasons (all functionalities are however always available if invoked via /proc/sysrq-trigger with root privileges). To check what are the available functions in our system we can just run:

$ cat /proc/sys/kernel/sysrq
176

The command returned a value of 176. How this value is obtained, and what does it stands for? Every value corresponds to a certain function, As you can see in the list below:

0 - disable sysrq completely
1 - enable all functions of sysrq
2 - enable control of console logging level
4 - enable control of keyboard (SAK, unraw)
8 - enable debugging dumps of processes etc.
16 - enable sync command
32 - enable remount read-only
64 - enable signaling of processes (term, kill, oom-kill)
128 - allow reboot/poweroff
256 - allow nicing of all RT tasks

While a value of 0 disables all SysRq functions and a value of 1 enables all of them, providing values bigger than 1, we can enable the specific ones. As verified above, we have a SysRq value of 176. This is obtained from the sum of 128 (which allows reboot and poweroff) + 32 (ability to remount filesystems in read-only mode) + 16, which enables sync command. In the same way, the value of 438 is obtained from the sum of 2 + 4 + 16 + 32 + 128 + 256, so all the corresponding functions are enabled.

How to change the SysRq value

We now know what the SysRq value is, but how can we change it? To immediately change this value we just have to write the wanted one to the /proc/sys/kernel/sysrq file, by running:

# echo "1" > /proc/sys/kernel/sysrq

This way, the change will be immediately effective but it will not survive a reboot. How to make it persistent? That is very simple. A generic solution, which works in all linux distributions, is to put the value of kernel.sysrq in the /etc/sysctl.d/99-sysctl.conf file:

# echo "kernel.sysrq = 1" >> /etc/sysctl.d/99-sysctl.conf

Please notice how we used the >> redirection operator: this will append the text to the file and will not override other settings it could already contain.



The reisub sequence

Of all command key sequences, reisub is probably the most famous. To better remember this sequence, it is often used as an acronym for “raising elephants is so utterly boring”. What does this sequence accomplishes? Holding alt+sysrq key, we proceed pressing the command keys in sequence, and this is what happens:

First of all r switches the keyboard from raw to XLATE mode, then, e sends a SIGTERM signal to all processes, so that they can be closed in a graceful way if possibile. After that we send a SIGKILL signal by pressing i, to terminate remaining process which didn’t respond to the previous signal. With s we try to sync all mounted filesystems and flush all changes from cache to the disk immediately. By using u we remount all filesystems in read only mode, and finally by pressing b, we perform a system reboot.

The reisub sequence can be used in certain situations when the system becomes very unresponsive, and other solutions are not enough to fix things. The command keys composing this sequence are, however, only a subset of the available ones: for a complete list, you can take a look at the SysRq kernel documentation.



Comments and Discussions
Linux Forum