diff options
Diffstat (limited to 'src/linux:manual_restart_with_sysrq-trigger.adoc')
-rw-r--r-- | src/linux:manual_restart_with_sysrq-trigger.adoc | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/src/linux:manual_restart_with_sysrq-trigger.adoc b/src/linux:manual_restart_with_sysrq-trigger.adoc new file mode 100644 index 0000000..29526bf --- /dev/null +++ b/src/linux:manual_restart_with_sysrq-trigger.adoc @@ -0,0 +1,107 @@ +Linux:Manual Restart with sysrq-trigger +======================================= +:author: Aaron Ball +:email: nullspoon@oper.io +:revdate: February 15, 2016 + + +== {doctitle} + +A little over a week ago I decided it would be fun to try to write my own +multi-threaded init system in c. Without going into too much detail (I'll write +a blog post that introduces it once it's further along), I needed to find a way +to shutdown and restart my system from c (init 0 and 6, respectively). + +I looked around the internet and had a surprisingly difficult time finding what +I was looking for. Every post I found indicated I should use the system +function to call "shutdown -h -P now". While not a wrong or a bad answer, it +wasn't the answer I was looking for. I wanted to know how the shutdown and +reboot commands worked, or how my current init system executed runlevels 0 and +6, respectively. + +Remembering something I found a ways back about kernel triggers found in and +/sys/power/ for controlling acpi states, I started searching for something +similar. After a bit of time, I found */proc/sysrq-trigger*. For further +reading beyond this post, please see the +https://en.wikipedia.org/wiki/Magic_SysRq_key[Wikipedia Article]. + + + +Simple Usage +------------ + +The usage of sysrq-trigger is fairly simple. Before we get into exact usage for +the purposes of shutting down or rebooting though, please note that output from +/proc/sysrq-trigger can only be seen from an actual tty, and not from within a +terminal emulator. + +That said, execute the following command to find out all of the options +available to you from sysrq. + + # echo h > /proc/sysrq-trigger + +If you don't see output from that, either sysrq isn't enabled, or you aren't +executing from within a tty. + +To check if it is enabled, ensure that the following command yields a *1*. + + # cat /proc/sys/kernel/sysrq + + + +Reboot and Shutdown Sequences +----------------------------- + +If you executed the _echo h_ statement above, you likely saw the output of +supported commands. Among them you should havE seen *b* and *o*, for reboot and +poweroff, respectively. _Note that it is a bad idea to execute either of these +right now._ + +If you read around the internet for what these two do, you'll see that both +cause a hard stop. Neither polietly asks processes to exit. They are roughly +equivelant to the hardware reset and power buttons. If rebooting or powering +off, *we want b or o to be the last command sent* to have as graceful a stop as +possible. + + +Here is the list of commands that should be sent to sysrq-trigger, in order, +for both a shutdown and a reboot. + +echo r > /proc/sysrq-trigger:: (un*R*aw) Takes back control of keyboard from X + +echo e > /proc/sysrq-trigger:: (t*E*rminate) Send SIGTERM to all processes. If + you aren't familiar with process signals, this + is basically a friendly kill command for every + process. + +echo i > /proc/sysrq-trigger:: (k*I*ll) Send SIGKILL to all processes. If you + aren't familiar with process signals, this is + basically a kill -9 command for every remaining + process. + +echo s > /proc/sysrq-trigger:: (*S*nc) Sync all cached disk operations to disk + +echo u > /proc/sysrq-trigger:: (*U*mount) Umounts all mounted partitions + + +The previous commands all get us to a ready to shutdown or reboot state. To +shutdown or reboot, execute one of the following. + +echo o > /proc/sysrq-trigger:: (p*O*weroff) Powers off the system + +echo b > /proc/sysrq-trigger:: (re*B*oot) Reboots the system + + +The entire list in order, using the reboot command... + + # echo r > /proc/sysrq-trigger + # echo e > /proc/sysrq-trigger + # echo i > /proc/sysrq-trigger + # echo s > /proc/sysrq-trigger + # echo u > /proc/sysrq-trigger + # echo b > /proc/sysrq-trigger + + +[role="datelastedit"] +Last edited: {revdate} +// vim: set syntax=asciidoc: |