From 1e1fad999fceb33125954b2a5cb461ef15e3745f Mon Sep 17 00:00:00 2001 From: Wolfgang Bumiller Date: Fri, 10 Mar 2017 11:25:41 +0100 Subject: [PATCH] poststop: use a reboot trigger file Since the STOPPED state is set before cgroup cleanup we need a better way to restart a container: We now install an ExecStopPost snippet into the lxc@.service which when encountering a reboot trigger file (/var/lib/lxc/$vmid/reboot) performs a systemctl restart. --- debian/triggers | 1 + src/Makefile | 5 +++++ src/lxc-pve-poststop-hook | 7 +++++-- src/lxc-pve-prestart-hook | 3 +++ src/lxc-pve-reboot-trigger | 10 ++++++++++ src/pve-reboot.conf | 2 ++ 6 files changed, 26 insertions(+), 2 deletions(-) create mode 100755 src/lxc-pve-reboot-trigger create mode 100644 src/pve-reboot.conf diff --git a/debian/triggers b/debian/triggers index 59dd688..b469b72 100644 --- a/debian/triggers +++ b/debian/triggers @@ -1 +1,2 @@ activate-noawait pve-api-updates +activate-noawait /etc/init.d diff --git a/src/Makefile b/src/Makefile index 7ffb593..928db5e 100644 --- a/src/Makefile +++ b/src/Makefile @@ -2,6 +2,7 @@ PACKAGE=pve-container PREFIX=${DESTDIR}/usr BINDIR=${PREFIX}/bin +LIBDIR=${PREFIX}/lib SBINDIR=${PREFIX}/sbin MANDIR=${PREFIX}/share/man DOCDIR=${PREFIX}/share/doc/${PACKAGE} @@ -9,6 +10,7 @@ LXC_SCRIPT_DIR=${PREFIX}/share/lxc LXC_TMPL_DIR=${LXC_SCRIPT_DIR}/templates LXC_HOOK_DIR=${LXC_SCRIPT_DIR}/hooks LXC_COMMON_CONFIG_DIR=${LXC_SCRIPT_DIR}/config/common.conf.d +SERVICEDIR=$(LIBDIR)/systemd/system PODDIR=${DOCDIR}/pod MAN1DIR=${MANDIR}/man1/ MAN5DIR=${MANDIR}/man5/ @@ -33,6 +35,9 @@ install: pct lxc-pve.conf lxc-pve-prestart-hook lxc-pve-autodev-hook lxc-pve-pos install -m 0755 pve-update-lxc-config ${SBINDIR} install -d ${LXC_SCRIPT_DIR} install -m 0755 lxcnetaddbr ${LXC_SCRIPT_DIR} + install -m 0755 lxc-pve-reboot-trigger ${LXC_SCRIPT_DIR} + install -d -m0755 ${SERVICEDIR}/lxc@.service.d + install -m0644 pve-reboot.conf ${SERVICEDIR}/lxc@.service.d/ install -d ${LXC_HOOK_DIR} install -m 0755 lxc-pve-prestart-hook ${LXC_HOOK_DIR} install -m 0755 lxc-pve-autodev-hook ${LXC_HOOK_DIR} diff --git a/src/lxc-pve-poststop-hook b/src/lxc-pve-poststop-hook index a4302d6..0396739 100755 --- a/src/lxc-pve-poststop-hook +++ b/src/lxc-pve-poststop-hook @@ -81,9 +81,12 @@ __PACKAGE__->register_method ({ # that we must not block because we're part of the service cgroup # systemd waits for to die before issuing the new lxc-start command. PVE::LXC::update_lxc_config($vmid, $conf); - PVE::Tools::run_command(['systemctl', '--no-block', 'restart', "lxc\@$vmid"]); + # Tell the post-stop hook we want to be restarted. + open(my $fh, '>', "/var/lib/lxc/$vmid/reboot") + or die "failed to create reboot trigger file: $!\n"; + close($fh); # cause lxc to stop instead of rebooting - POSIX::_exit(1); + exit(1); } return undef; diff --git a/src/lxc-pve-prestart-hook b/src/lxc-pve-prestart-hook index 9835b1c..fd29423 100755 --- a/src/lxc-pve-prestart-hook +++ b/src/lxc-pve-prestart-hook @@ -76,6 +76,9 @@ __PACKAGE__->register_method ({ my $rootdir = $param->{rootfs}; + # Delete any leftover reboot-trigger file + unlink("/var/lib/lxc/$vmid/reboot"); + my $devlist_file = "/var/lib/lxc/$vmid/devices"; unlink $devlist_file; my $devices = []; diff --git a/src/lxc-pve-reboot-trigger b/src/lxc-pve-reboot-trigger new file mode 100755 index 0000000..95c3ac8 --- /dev/null +++ b/src/lxc-pve-reboot-trigger @@ -0,0 +1,10 @@ +#!/usr/bin/perl + +use strict; +use warnings; + +my $vmid = $ARGV[0] or exit(1); +exit(0) if $vmid !~ /^\d+$/; # check for a PVE ID +exit(0) if !-e "/etc/pve/lxc/${vmid}.conf"; +exit(0) if !unlink("/var/lib/lxc/$vmid/reboot"); +exec {'systemctl'} 'systemctl', '--no-block', 'restart', "lxc\@${vmid}.service"; diff --git a/src/pve-reboot.conf b/src/pve-reboot.conf new file mode 100644 index 0000000..8a0539c --- /dev/null +++ b/src/pve-reboot.conf @@ -0,0 +1,2 @@ +[Service] +ExecStopPost=/usr/share/lxc/lxc-pve-reboot-trigger %i -- 2.39.2