[pve-devel] [PATCH qemu-server 1/2] create_disks: refactor out and improve uefidisk creation

Thomas Lamprecht t.lamprecht at proxmox.com
Mon Aug 28 07:04:45 CEST 2017


I saw some possible flaws and refactor potential, so this version can be
ignored as I'll send a v2.

On 08/25/2017 03:22 PM, Thomas Lamprecht wrote:
> factor out code in a new create_efidisk submethod, as else this is
> hardly readable, the efidisk0 case is a special case to, so refer
> from putting this specialised handling directly into the much shorter
> code for all other cases.
> 
> Also the disk was created with a specific format and then a format
> detection on the newly created disk was done, which is pretty
> useless.
> 
> Also combine setting drive->size and drive->file.
> 
> Signed-off-by: Thomas Lamprecht <t.lamprecht at proxmox.com>
> ---
>   PVE/API2/Qemu.pm  | 30 ++++++------------------------
>   PVE/QemuServer.pm | 17 +++++++++++++++++
>   2 files changed, 23 insertions(+), 24 deletions(-)
> 
> diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
> index aa7c832..e8bb4a9 100644
> --- a/PVE/API2/Qemu.pm
> +++ b/PVE/API2/Qemu.pm
> @@ -142,34 +142,16 @@ my $create_disks = sub {
>   
>   	    my $volid;
>   	    if ($ds eq 'efidisk0') {
> -		# handle efidisk
> -		my $ovmfvars = '/usr/share/kvm/OVMF_VARS-pure-efi.fd';
> -		die "uefi vars image not found\n" if ! -f $ovmfvars;
> -		$volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid,
> -						      $fmt, undef, 128);
> -		$disk->{file} = $volid;
> -		$disk->{size} = 128*1024;
> -		my ($storeid, $volname) = PVE::Storage::parse_volume_id($volid);
> -		my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
> -		my $qemufmt = PVE::QemuServer::qemu_img_format($scfg, $volname);
> -		my $path = PVE::Storage::path($storecfg, $volid);
> -		my $efidiskcmd = ['/usr/bin/qemu-img', 'convert', '-n', '-f', 'raw', '-O', $qemufmt];
> -		push @$efidiskcmd, $ovmfvars;
> -		push @$efidiskcmd, $path;
> -
> -		PVE::Storage::activate_volumes($storecfg, [$volid]);
> -
> -		eval { PVE::Tools::run_command($efidiskcmd); };
> -		my $err = $@;
> -		die "Copying of EFI Vars image failed: $err" if $err;
> +		($volid, $size) = PVE::QemuServer::create_uefidisk($vmid, $storeid, $fmt, $storecfg);
>   	    } else {
> -		$volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid,
> -						      $fmt, undef, $size*1024*1024);
> -		$disk->{file} = $volid;
> -		$disk->{size} = $size*1024*1024*1024;
> +		$volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $size<<20);
> +		$size <<= 30; # gigabytes to bytes
>   	    }
>   	    push @$vollist, $volid;
> +	    $disk->{file} = $volid;
> +	    $disk->{size} = $size;
>   	    delete $disk->{format}; # no longer needed
> +
>   	    $res->{$ds} = PVE::QemuServer::print_drive($vmid, $disk);
>   	} else {
>   
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index 2aafc42..7d9987e 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -6308,6 +6308,23 @@ sub qemu_use_old_bios_files {
>       return ($use_old_bios_files, $machine_type);
>   }
>   
> +sub create_uefidisk {
> +    my ($vmid, $storeid, $fmt, $storecfg) = @_;
> +
> +    die "uefi vars image not found\n" if ! -f $OVMF_VARS;
> +
> +    my $vars_size = -s $OVMF_VARS;
> +    my $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $vars_size>>10);
> +    PVE::Storage::activate_volumes($storecfg, [$volid]);
> +
> +    my $path = PVE::Storage::path($storecfg, $volid);
> +    eval {
> +	run_command(['/usr/bin/qemu-img', 'convert', '-n', '-O', $fmt, $OVMF_VARS, $path]);
> +    }; die "Copying of EFI Vars image failed: $@" if $@;
> +
> +    return ($volid, $vars_size);
> +}
> +
>   sub lspci {
>   
>       my $devices = {};
> 




More information about the pve-devel mailing list