]> git.proxmox.com Git - qemu-server.git/blobdiff - PVE/QemuServer.pm
fix #1780: change datacenter.conf to datacenter.cfg
[qemu-server.git] / PVE / QemuServer.pm
index f1ed6b6bc97ef6404a5f19645775a60700116b83..9c4ac94c75a1e9a3164c2f0d47bca688fdb43a90 100644 (file)
@@ -38,8 +38,9 @@ use Time::HiRes qw(gettimeofday);
 use File::Copy qw(copy);
 use URI::Escape;
 
-my $OVMF_CODE = '/usr/share/kvm/OVMF_CODE-pure-efi.fd';
-my $OVMF_VARS = '/usr/share/kvm/OVMF_VARS-pure-efi.fd';
+my $EDK2_FW_BASE = '/usr/share/pve-edk2-firmware/';
+my $OVMF_CODE = "$EDK2_FW_BASE/OVMF_CODE.fd";
+my $OVMF_VARS = "$EDK2_FW_BASE/OVMF_VARS.fd";
 
 my $qemu_snap_storage = {rbd => 1, sheepdog => 1};
 
@@ -263,7 +264,7 @@ my $confdesc = {
     shares => {
         optional => 1,
         type => 'integer',
-        description => "Amount of memory shares for auto-ballooning. The larger the number is, the more memory this VM gets. Number is relative to weights of all other running VMs. Using zero disables auto-ballooning",
+        description => "Amount of memory shares for auto-ballooning. The larger the number is, the more memory this VM gets. Number is relative to weights of all other running VMs. Using zero disables auto-ballooning. Auto-ballooning is done by pvestatd.",
        minimum => 0,
        maximum => 50000,
        default => 1000,
@@ -271,7 +272,7 @@ my $confdesc = {
     keyboard => {
        optional => 1,
        type => 'string',
-       description => "Keybord layout for vnc server. Default is read from the '/etc/pve/datacenter.conf' configuration file.".
+       description => "Keybord layout for vnc server. Default is read from the '/etc/pve/datacenter.cfg' configuration file.".
                       "It should not be necessary to set it.",
        enum => PVE::Tools::kvmkeymaplist(),
        default => undef,
@@ -1688,6 +1689,12 @@ sub print_drivedevice_full {
 
     $device .= ",bootindex=$drive->{bootindex}" if $drive->{bootindex};
 
+    if (my $serial = $drive->{serial}) {
+       $serial = URI::Escape::uri_unescape($serial);
+       $device .= ",serial=$serial";
+    }
+
+
     return $device;
 }
 
@@ -1760,11 +1767,6 @@ sub print_drive_full {
        }
     }
 
-    if (my $serial = $drive->{serial}) {
-       $serial = URI::Escape::uri_unescape($serial);
-       $opts .= ",serial=$serial";
-    }
-
     $opts .= ",format=$format" if $format && !$drive->{format};
 
     my $cache_direct = 0;
@@ -3599,21 +3601,22 @@ sub vm_devices_list {
     my ($vmid) = @_;
 
     my $res = vm_mon_cmd($vmid, 'query-pci');
+    my $devices_to_check = [];
     my $devices = {};
     foreach my $pcibus (@$res) {
-       foreach my $device (@{$pcibus->{devices}}) {
-           next if !$device->{'qdev_id'};
-           if ($device->{'pci_bridge'}) {
-               $devices->{$device->{'qdev_id'}} = 1;
-               foreach my $bridge_device (@{$device->{'pci_bridge'}->{devices}}) {
-                   next if !$bridge_device->{'qdev_id'};
-                   $devices->{$bridge_device->{'qdev_id'}} = 1;
-                   $devices->{$device->{'qdev_id'}}++;
-               }
-           } else {
-               $devices->{$device->{'qdev_id'}} = 1;
-           }
+       push @$devices_to_check, @{$pcibus->{devices}},
+    }
+
+    while (@$devices_to_check) {
+       my $to_check = [];
+       for my $d (@$devices_to_check) {
+           $devices->{$d->{'qdev_id'}} = 1 if $d->{'qdev_id'};
+           next if !$d->{'pci_bridge'};
+
+           $devices->{$d->{'qdev_id'}} += scalar(@{$d->{'pci_bridge'}->{devices}});
+           push @$to_check, @{$d->{'pci_bridge'}->{devices}};
        }
+       $devices_to_check = $to_check;
     }
 
     my $resblock = vm_mon_cmd($vmid, 'query-block');
@@ -4294,7 +4297,10 @@ sub vmconfig_hotplug_pending {
                qemu_cpu_hotplug($vmid, $conf, undef);
             } elsif ($opt eq 'balloon') {
                # enable balloon device is not hotpluggable
-               die "skip\n" if !defined($conf->{balloon}) || $conf->{balloon};
+               die "skip\n" if defined($conf->{balloon}) && $conf->{balloon} == 0;
+               # here we reset the ballooning value to memory
+               my $balloon = $conf->{memory} || $defaults->{memory};
+               vm_mon_cmd($vmid, "balloon", value => $balloon*1024*1024);
            } elsif ($fast_plug_option->{$opt}) {
                # do nothing
            } elsif ($opt =~ m/^net(\d+)$/) {
@@ -4838,6 +4844,13 @@ sub vm_start {
        }
        $properties{timeout} = 10 if $statefile; # setting up the scope shoul be quick
 
+       my $run_qemu = sub {
+           PVE::Tools::run_fork sub {
+               PVE::Tools::enter_systemd_scope($vmid, "Proxmox VE VM $vmid", %properties);
+               run_command($cmd, %run_params);
+           };
+       };
+
        if ($conf->{hugepages}) {
 
            my $code = sub {
@@ -4847,11 +4860,7 @@ sub vm_start {
                PVE::QemuServer::Memory::hugepages_mount();
                PVE::QemuServer::Memory::hugepages_allocate($hugepages_topology, $hugepages_host_topology);
 
-               eval  {
-                   PVE::Tools::enter_systemd_scope($vmid, "Proxmox VE VM $vmid", %properties);
-                   run_command($cmd, %run_params);
-               };
-
+               eval { $run_qemu->() };
                if (my $err = $@) {
                    PVE::QemuServer::Memory::hugepages_reset($hugepages_host_topology);
                    die $err;
@@ -4862,10 +4871,7 @@ sub vm_start {
            eval { PVE::QemuServer::Memory::hugepages_update_locked($code); };
 
        } else {
-           eval  {
-               PVE::Tools::enter_systemd_scope($vmid, "Proxmox VE VM $vmid", %properties);
-               run_command($cmd, %run_params);
-           };
+           eval { $run_qemu->() };
        }
 
        if (my $err = $@) {
@@ -4916,10 +4922,8 @@ sub vm_start {
            }
 
        } else {
-           if (!$statefile && (!defined($conf->{balloon}) || $conf->{balloon})) {
-               vm_mon_cmd_nocheck($vmid, "balloon", value => $conf->{balloon}*1024*1024)
-                   if $conf->{balloon};
-           }
+           vm_mon_cmd_nocheck($vmid, "balloon", value => $conf->{balloon}*1024*1024)
+               if !$statefile && $conf->{balloon};
 
            foreach my $opt (keys %$conf) {
                next if $opt !~  m/^net\d+$/;
@@ -5662,10 +5666,7 @@ sub restore_vma_archive {
            my $readlimit = PVE::Storage::get_bandwidth_limit('restore', [$sid], $bwlimit);
            if ($readlimit) {
                print STDERR "applying read rate limit: $readlimit\n";
-               my $cstream = ['cstream', '-t', $readlimit*1024];
-               if ($readfrom ne '-') {
-                   push @$cstream, '--', $readfrom;
-               }
+               my $cstream = ['cstream', '-t', $readlimit*1024, '--', $readfrom];
                $add_pipe->($cstream);
            }
        }
@@ -6148,6 +6149,8 @@ sub qemu_img_convert {
        my $cmd = [];
        push @$cmd, '/usr/bin/qemu-img', 'convert', '-p', '-n';
        push @$cmd, '-s', $snapname if($snapname && $src_format eq "qcow2");
+       push @$cmd, '-t', 'none' if $dst_scfg->{type} eq 'zfspool';
+       push @$cmd, '-T', 'none' if $src_scfg->{type} eq 'zfspool';
        push @$cmd, '-f', $src_format, '-O', $dst_format, $src_path;
        if ($is_zero_initialized) {
            push @$cmd, "zeroinit:$dst_path";
@@ -6463,13 +6466,8 @@ sub qemu_machine_pxe {
 
     $machine =  PVE::QemuServer::get_current_qemu_machine($vmid) if !$machine;
 
-    foreach my $opt (keys %$conf) {
-       next if $opt !~ m/^net(\d+)$/;
-       my $net = PVE::QemuServer::parse_net($conf->{$opt});
-       next if !$net;
-       my $romfile = PVE::QemuServer::vm_mon_cmd_nocheck($vmid, 'qom-get', path => $opt, property => 'romfile');
-       return $machine.".pxe" if $romfile =~ m/pxe/;
-       last;
+    if ($conf->{machine} && $conf->{machine} =~ m/\.pxe$/) {
+       $machine .= '.pxe';
     }
 
     return $machine;
@@ -6724,4 +6722,10 @@ sub complete_storage {
     return $res;
 }
 
+sub nbd_stop {
+    my ($vmid) = @_;
+
+    vm_mon_cmd($vmid, 'nbd-server-stop');
+}
+
 1;