diff options
author | Jonathan Bauer | 2018-02-15 13:20:33 +0100 |
---|---|---|
committer | Jonathan Bauer | 2018-02-15 13:20:33 +0100 |
commit | 510ae767a5abe5812ceab620ed6c5748cecaf36b (patch) | |
tree | f22caa34cb605f1116ca6a60a1b6e07d19d47c6c /core/modules/kexec-reboot | |
parent | [run-virt] relax /tmp mount detection regex (diff) | |
download | mltk-510ae767a5abe5812ceab620ed6c5748cecaf36b.tar.gz mltk-510ae767a5abe5812ceab620ed6c5748cecaf36b.tar.xz mltk-510ae767a5abe5812ceab620ed6c5748cecaf36b.zip |
[kexec-reboot] fast reboot via kexec
bound to ctrl-alt-del on ttys
TODO enable Xorg support
Diffstat (limited to 'core/modules/kexec-reboot')
9 files changed, 124 insertions, 0 deletions
diff --git a/core/modules/kexec-reboot/data/etc/systemd/system/ctrl-alt-del.target b/core/modules/kexec-reboot/data/etc/systemd/system/ctrl-alt-del.target new file mode 120000 index 00000000..b1da000b --- /dev/null +++ b/core/modules/kexec-reboot/data/etc/systemd/system/ctrl-alt-del.target @@ -0,0 +1 @@ +kexec.target
\ No newline at end of file diff --git a/core/modules/kexec-reboot/data/etc/systemd/system/kexec-load.service b/core/modules/kexec-reboot/data/etc/systemd/system/kexec-load.service new file mode 100644 index 00000000..4fcebd66 --- /dev/null +++ b/core/modules/kexec-reboot/data/etc/systemd/system/kexec-load.service @@ -0,0 +1,12 @@ +[Unit] +Description=Reload the kernel/initramfs via kexec +Documentation=man:kexec(8) +DefaultDependencies=no +Before=shutdown.target final.target + +[Service] +Type=oneshot +ExecStart=/opt/openslx/scripts/systemd-kexec_load + +[Install] +WantedBy=kexec.target diff --git a/core/modules/kexec-reboot/data/etc/systemd/system/kexec.service b/core/modules/kexec-reboot/data/etc/systemd/system/kexec.service new file mode 100644 index 00000000..45c117ad --- /dev/null +++ b/core/modules/kexec-reboot/data/etc/systemd/system/kexec.service @@ -0,0 +1,15 @@ +[Unit] +Description=Reboot via kexec +Documentation=man:kexec(8) +DefaultDependencies=no +Wants=kexec-load.service +After=kexec-load.service +Requires=shutdown.target final.target +Before=shutdown.target final.target + +[Service] +Type=oneshot +ExecStart=/opt/openslx/scripts/systemd-kexec_exec + +[Install] +WantedBy=kexec.target diff --git a/core/modules/kexec-reboot/data/etc/systemd/system/kexec.target b/core/modules/kexec-reboot/data/etc/systemd/system/kexec.target new file mode 100644 index 00000000..5be5b8c5 --- /dev/null +++ b/core/modules/kexec-reboot/data/etc/systemd/system/kexec.target @@ -0,0 +1,19 @@ +# SPDX-License-Identifier: LGPL-2.1+ +# +# This file is part of systemd. +# +# systemd is free software; you can redistribute it and/or modify it +# under the terms of the GNU Lesser General Public License as published by +# the Free Software Foundation; either version 2.1 of the License, or +# (at your option) any later version. + +[Unit] +Description=Reboot via kexec +Documentation=man:systemd.special(7) +DefaultDependencies=no +Requires=kexec.service +After=kexec.service +AllowIsolate=yes + +[Install] +Alias=ctrl-alt-del.target diff --git a/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_exec b/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_exec new file mode 100755 index 00000000..d5ff3e57 --- /dev/null +++ b/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_exec @@ -0,0 +1,12 @@ +#!/bin/ash + +# check if kernel sees a preloaded kernel for kexec +if which kexec 2>/dev/null && [ "x$(cat /sys/kernel/kexec_loaded)" = "x1" ]; then + kexec -e +fi + +# enable sysrq and trigger reboot +echo 1 > /proc/sys/kernel/sysrq +echo b > /proc/sysrq-trigger + +# TODO start fbsplash or something diff --git a/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_load b/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_load new file mode 100755 index 00000000..ca092b3e --- /dev/null +++ b/core/modules/kexec-reboot/data/opt/openslx/scripts/systemd-kexec_load @@ -0,0 +1,40 @@ +#!/bin/ash + +kexec=$(which kexec 2>/dev/null) +if [ -z "$kexec" ]; then + echo "Failed to find kexec binary in PATH. Exiting." + exit 1 +fi + +# download_retry <url> <path> +download_retry() { + [ $# -ne 2 ] && return 1 + for TIMEOUT in 1 1 2 3 END; do + [ "x$TIMEOUT" = "xEND" ] && break + if wget -T 2 -O "$2" "$1"; then + return 0 + break + fi + sleep $TIMEOUT + done + return 1 +} + +kexec_load() { + . /opt/openslx/config + local DIR="$(mktemp -d)" + + for FILE in kernel initramfs-stage31; do + if ! download_retry "http://${SLX_KCL_SERVERS}/${SLX_BASE_PATH}/${FILE}" "${DIR}/${FILE}" ; then + echo "Failed to download ${FILE}." + exit 1 + fi + done + + if ! kexec -l "${DIR}/kernel" --initrd "${DIR}/initramfs-stage31" --reuse-cmdline; then + echo "Failed to load kernel/initrd from ${DIR}" + exit 1 + fi +} + +kexec_load diff --git a/core/modules/kexec-reboot/module.build b/core/modules/kexec-reboot/module.build new file mode 100644 index 00000000..fa7038b8 --- /dev/null +++ b/core/modules/kexec-reboot/module.build @@ -0,0 +1,19 @@ +#!/bin/bash +fetch_source() { + : +} + +build() { + + local BIN_LOCATION="$(which kexec)" + [ ! -z "${BIN_LOCATION}" ] && BIN_LOCATION=$(readlink -f "$BIN_LOCATION") + if [ ! -z "${BIN_LOCATION}" -a -e "${BIN_LOCATION}" ]; then + tarcopy "${BIN_LOCATION}" "${MODULE_BUILD_DIR}" + else + perror "'kexec' not found on the system! Please install it." + fi +} + +post_copy() { + : +} diff --git a/core/modules/kexec-reboot/module.conf b/core/modules/kexec-reboot/module.conf new file mode 100644 index 00000000..d6ea23f4 --- /dev/null +++ b/core/modules/kexec-reboot/module.conf @@ -0,0 +1,3 @@ +REQUIRED_BINARIES=" + kexec +" diff --git a/core/modules/kexec-reboot/module.conf.ubuntu b/core/modules/kexec-reboot/module.conf.ubuntu new file mode 100644 index 00000000..efc88ea8 --- /dev/null +++ b/core/modules/kexec-reboot/module.conf.ubuntu @@ -0,0 +1,3 @@ +REQUIRED_INSTALLED_PACKAGES=" + kexec-tools +" |