use AAVMF for arm

Signed-off-by: Wolfgang Bumiller <w.bumiller@proxmox.com>
This commit is contained in:
Wolfgang Bumiller 2018-11-12 14:10:36 +01:00 committed by Thomas Lamprecht
parent 40c3bcf876
commit 96ed3574d4
2 changed files with 35 additions and 14 deletions

View File

@ -130,7 +130,7 @@ my $check_storage_access_clone = sub {
# Note: $pool is only needed when creating a VM, because pool permissions
# are automatically inherited if VM already exists inside a pool.
my $create_disks = sub {
my ($rpcenv, $authuser, $conf, $storecfg, $vmid, $pool, $settings, $default_storage) = @_;
my ($rpcenv, $authuser, $conf, $arch, $storecfg, $vmid, $pool, $settings, $default_storage) = @_;
my $vollist = [];
@ -175,7 +175,7 @@ my $create_disks = sub {
my $volid;
if ($ds eq 'efidisk0') {
($volid, $size) = PVE::QemuServer::create_efidisk($storecfg, $storeid, $vmid, $fmt);
($volid, $size) = PVE::QemuServer::create_efidisk($storecfg, $storeid, $vmid, $fmt, $arch);
} else {
$volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $size);
}
@ -589,7 +589,7 @@ __PACKAGE__->register_method({
eval {
$vollist = &$create_disks($rpcenv, $authuser, $conf, $storecfg, $vmid, $pool, $param, $storage);
$vollist = &$create_disks($rpcenv, $authuser, $conf, $arch, $storecfg, $vmid, $pool, $param, $storage);
if (!$conf->{bootdisk}) {
my $firstdisk = PVE::QemuServer::resolve_first_disk($conf);
@ -1180,6 +1180,8 @@ my $update_vm_api = sub {
$conf = PVE::QemuConfig->load_config($vmid); # update/reload
next if defined($conf->{pending}->{$opt}) && ($param->{$opt} eq $conf->{pending}->{$opt}); # skip if nothing changed
my ($arch, undef) = PVE::QemuServer::get_basic_machine_info($conf);
if (PVE::QemuServer::is_valid_drivename($opt)) {
my $drive = PVE::QemuServer::parse_drive($opt, $param->{$opt});
# FIXME: cloudinit: CDROM or Disk?
@ -1191,7 +1193,7 @@ my $update_vm_api = sub {
PVE::QemuServer::vmconfig_register_unused_drive($storecfg, $vmid, $conf, PVE::QemuServer::parse_drive($opt, $conf->{pending}->{$opt}))
if defined($conf->{pending}->{$opt});
&$create_disks($rpcenv, $authuser, $conf->{pending}, $storecfg, $vmid, undef, {$opt => $param->{$opt}});
&$create_disks($rpcenv, $authuser, $conf->{pending}, $arch, $storecfg, $vmid, undef, {$opt => $param->{$opt}});
} else {
$conf->{pending}->{$opt} = $param->{$opt};
}

View File

@ -40,8 +40,16 @@ use File::Copy qw(copy);
use URI::Escape;
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 $OVMF = {
x86_64 => [
"$EDK2_FW_BASE/OVMF_CODE.fd",
"$EDK2_FW_BASE/OVMF_VARS.fd"
],
aarch64 => [
"$EDK2_FW_BASE/AAVMF_CODE.fd",
"$EDK2_FW_BASE/AAVMF_VARS.fd"
],
};
my $qemu_snap_storage = {rbd => 1, sheepdog => 1};
@ -3275,6 +3283,15 @@ sub get_basic_machine_info {
return ($arch, $machine);
}
sub get_ovmf_files($) {
my ($arch) = @_;
my $ovmf = $OVMF->{$arch}
or die "no OVMF images known for architecture '$arch'\n";
return @$ovmf;
}
sub config_to_command {
my ($storecfg, $vmid, $conf, $defaults, $forcemachine) = @_;
@ -3350,8 +3367,9 @@ sub config_to_command {
push @$devices, '-device', 'vmgenid,guid='.$conf->{vmgenid};
}
my ($ovmf_code, $ovmf_vars) = get_ovmf_files($arch);
if ($conf->{bios} && $conf->{bios} eq 'ovmf') {
die "uefi base image not found\n" if ! -f $OVMF_CODE;
die "uefi base image not found\n" if ! -f $ovmf_code;
my $path;
my $format;
@ -3373,11 +3391,11 @@ sub config_to_command {
} else {
warn "no efidisk configured! Using temporary efivars disk.\n";
$path = "/tmp/$vmid-ovmf.fd";
PVE::Tools::file_copy($OVMF_VARS, $path, -s $OVMF_VARS);
PVE::Tools::file_copy($ovmf_vars, $path, -s $ovmf_vars);
$format = 'raw';
}
push @$cmd, '-drive', "if=pflash,unit=0,format=raw,readonly,file=$OVMF_CODE";
push @$cmd, '-drive', "if=pflash,unit=0,format=raw,readonly,file=$ovmf_code";
push @$cmd, '-drive', "if=pflash,unit=1,format=$format,id=drive-efidisk0,file=$path";
}
@ -6775,18 +6793,19 @@ sub qemu_use_old_bios_files {
return ($use_old_bios_files, $machine_type);
}
sub create_efidisk {
my ($storecfg, $storeid, $vmid, $fmt) = @_;
sub create_efidisk($$$$$) {
my ($storecfg, $storeid, $vmid, $fmt, $arch) = @_;
die "EFI vars default image not found\n" if ! -f $OVMF_VARS;
my (undef, $ovmf_vars) = get_ovmf_files($arch);
die "EFI vars default image not found\n" if ! -f $ovmf_vars;
my $vars_size = PVE::Tools::convert_size(-s $OVMF_VARS, 'b' => 'kb');
my $vars_size = PVE::Tools::convert_size(-s $ovmf_vars, 'b' => 'kb');
my $volid = PVE::Storage::vdisk_alloc($storecfg, $storeid, $vmid, $fmt, undef, $vars_size);
PVE::Storage::activate_volumes($storecfg, [$volid]);
my $path = PVE::Storage::path($storecfg, $volid);
eval {
run_command(['/usr/bin/qemu-img', 'convert', '-n', '-f', 'raw', '-O', $fmt, $OVMF_VARS, $path]);
run_command(['/usr/bin/qemu-img', 'convert', '-n', '-f', 'raw', '-O', $fmt, $ovmf_vars, $path]);
};
die "Copying EFI vars image failed: $@" if $@;