[pve-devel] [PATCH qemu-server 4/4] implement a 'real' reboot for vms
Wolfgang Bumiller
w.bumiller at proxmox.com
Wed Oct 17 11:18:26 CEST 2018
On Tue, Oct 16, 2018 at 12:07:06PM +0200, Dominik Csapak wrote:
> 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)) {
I see no way to get back to the old behavior on a newer qemu now?
reboot: 0 => --no-reboot
reboot: 1 => --no-reboot
> + 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