This post documents my adventures of getting the SysRQ key working on my Mac Mini and Macbook (both running Arch Linux). The suggestions of
keyfuzz that are the first search entries don’t work for me, so some more sophisticated black magic was necessary.
Remapping the Fn keys
This step is technically optional, but I did it because the function keys are a pain anyways. Normally on Apple keyboards one needs to use the
Fn key to get the normal Fn keys to behave as a
F<n> keystroke. I prefer to reverse this behavior, so that the SysRq combinations is
Alt+F13+F rather than
For this, the advice on the Arch Wiki worked, although it is not thorough on some points that I think should’ve been said. On newer kernels, one does this by creating the file
/etc/modprobe.d/hid_apple.conf and writing
options hid_apple fnmode=2
Then I edited the file
/etc/mkinitcpio.conf to include the new file:
... BINARIES="" # FILES # This setting is similar to BINARIES above, however, files are added # as-is and are not parsed in any way. This is useful for config files. FILES="/etc/modprobe.d/hid_apple.conf" # HOOKS ...
Finally, recompile the kernel for this change to take effect. On Arch Linux one can just do this by issuing the command
$ sudo pacman -S linux
which will reinstall the entire kernel.
Obtaining the keystroke
Next, I needed to get the scancode of the key I wanted to turn into the SysRQ key. For me attempting
showkey -s did not work so I instead had to use evtest, as described in this Arch Wiki.
$ sudo pacman -S evtest $ sudo evtest No device specified, trying to scan all of /dev/input/event* Available devices: /dev/input/event0: Logitech USB Receiver /dev/input/event1: Logitech USB Receiver /dev/input/event2: Apple, Inc Apple Keyboard /dev/input/event3: Apple, Inc Apple Keyboard /dev/input/event4: Apple Computer, Inc. IR Receiver /dev/input/event5: HDA NVidia Headphone /dev/input/event6: HDA NVidia HDMI/DP,pcm=3 /dev/input/event7: Power Button /dev/input/event8: Sleep Button /dev/input/event9: Power Button /dev/input/event10: Video Bus /dev/input/event11: PC Speaker /dev/input/event12: HDA NVidia HDMI/DP,pcm=7 /dev/input/event13: HDA NVidia HDMI/DP,pcm=8 Select the device event number [0-13]: 2 Input driver version is 1.0.1 Input device ID: bus 0x3 vendor 0x5ac product 0x220 version 0x111 Input device name: "Apple, Inc Apple Keyboard"
This is on my Mac Mini; the list of devices looks different on my laptop. After this pressing the desired key yields something which looked like
Event: time 1456870457.844237, -------------- SYN_REPORT ------------ Event: time 1456870457.924097, type 4 (EV_MSC), code 4 (MSC_SCAN), value 70068 Event: time 1456870457.924097, type 1 (EV_KEY), code 183 (KEY_F13), value 1
This is the F13 key which I want to map into a SysRq — the keycode 70068 above (which is in fact a hex code) is the one I wanted.
Now that I had the scancode, I cd’ed to
/etc/udev/hwdb.d and added a file
90-keyboard-sysrq.hwdb with the content
One then updates
hwdb.bin by running the command
$ sudo udevadm hwdb --update $ sudo udevadm trigger
The latter command makes the changes take effect immediately. You should be able to test this by running
sudo evtest again;
evtest should now report the new keycode (but the same scancode).
One can test the SysRQ key by running Alt+SysRq+H, and then checking the
dmesg output to see if anything happened:
$ dmesg | tail -n 1 [ 283.001240] sysrq: SysRq : HELP : loglevel(0-9) reboot(b) crash(c) ...
It remains to actually enable SysRQ, according to the bitmask described here. My system default was apparently 16:
$ sysctl kernel.sysrq kernel.sysrq = 16
For my purposes, I then edited
/etc/sysctl.d/99-sysctl.conf and added the line
This gave me everything except the nicing of real-time tasks. Of course the choice of value here is just personal preference.
Personally, my main use for this is killing Chromium, which has a bad habit of freezing up my computer (especially if Firefox is open too). I remedy the situation by repeatedly running Alt+SysRq+F to kill off the memory hogs. If this doesn’t work, just Alt+SysRq+K kills off all the processes in the current TTY.