[pve-devel] [PATCH qemu-server 4/4] implement a 'real' reboot for vms

Dominik Csapak d.csapak at proxmox.com
Tue Oct 16 12:07:06 CEST 2018


instead of letting qemu handle a reset, add '-no-reboot' by default
(>= qemu 3.0) and use our cleanup to start the vm again

this has the advantage that pending changes will be applied
on a reboot from within the guest, starts with a new qemu version
and enables us to have a 'reboot' button in the future
(more work for this is needed)

it still respects the 'reboot' config we had

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 PVE/CLI/qm.pm     | 22 ++++++++++++++++++++++
 PVE/QemuServer.pm |  7 ++++++-
 2 files changed, 28 insertions(+), 1 deletion(-)

diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
index 6a14c12..8772e8c 100755
--- a/PVE/CLI/qm.pm
+++ b/PVE/CLI/qm.pm
@@ -758,6 +758,8 @@ __PACKAGE__->register_method({
 	my $guest = $param->{'guest-requested'};
 	my $reset = $param->{'was-reset'};
 
+	my $needs_reset = 0;
+
 	my $storecfg = PVE::Storage::config();
 
 	PVE::QemuConfig->lock_config($vmid, sub {
@@ -780,8 +782,28 @@ __PACKAGE__->register_method({
 		# vm was shutdown from inside the guest or crashed, doing api cleanup
 		PVE::QemuServer::vm_stop_cleanup($storecfg, $vmid, $conf, 0, 0);
 	    }
+
+	    if ((!defined($conf->{reboot}) || $conf->{reboot}) && $reset) {
+		$needs_reset = 1;
+	    }
 	});
 
+	if ($needs_reset) {
+	    my $rpcenv = PVE::RPCEnvironment::get();
+	    my $authuser = $rpcenv->get_user();
+	    # got reset parameter, we should start the vm again
+	    my $realcmd = sub {
+		my $upid = shift;
+
+		syslog('info', "restart VM $vmid: $upid\n");
+
+		PVE::QemuServer::vm_start($storecfg, $vmid);
+		return;
+	    };
+
+	    $rpcenv->fork_worker('qmrestart', $vmid, $authuser, $realcmd);
+	}
+
 	return undef;
     }});
 
diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
index 4838e79..7dad560 100644
--- a/PVE/QemuServer.pm
+++ b/PVE/QemuServer.pm
@@ -3402,7 +3402,12 @@ sub config_to_command {
 
     push @$cmd, '-no-acpi' if defined($conf->{acpi}) && $conf->{acpi} == 0;
 
-    push @$cmd, '-no-reboot' if  defined($conf->{reboot}) && $conf->{reboot} == 0;
+    # we add it by default and check in the cleanup call if we want to start
+    # it again
+    if ((defined($conf->{reboot}) && $conf->{reboot} == 0) ||
+	qemu_machine_feature_enabled($machine_type, $kvmver, 3, 0)) {
+	push @$cmd, '-no-reboot' if  defined($conf->{reboot}) && $conf->{reboot} == 0;
+    }
 
     push @$cmd, '-vga', $vga if $vga && $vga !~ m/^serial\d+$/; # for kvm 77 and later
 
-- 
2.11.0





More information about the pve-devel mailing list