use PVE::QemuServer;
sub commit_cloudinit_disk {
- my ($vmid, $conf, $drive, $volname, $storeid, $files, $label) = @_;
+ my ($conf, $vmid, $drive, $volname, $storeid, $files, $label) = @_;
my $path = "/run/pve/cloudinit/$vmid/";
mkpath $path;
my $storecfg = PVE::Storage::config();
my $iso_path = PVE::Storage::path($storecfg, $drive->{file});
my $scfg = PVE::Storage::storage_config($storecfg, $storeid);
+ my $plugin = PVE::Storage::Plugin->lookup($scfg->{type});
+ $plugin->activate_volume($storeid, $scfg, $volname);
my $format = PVE::QemuServer::qemu_img_format($scfg, $volname);
my $size = PVE::Storage::file_size_info($iso_path);
eval {
run_command([['genisoimage', '-R', '-V', $label, $path],
- ['qemu-img', 'dd', '-f', 'raw', '-O', $format,
+ ['qemu-img', 'dd', '-n', '-f', 'raw', '-O', $format,
'isize=0', "osize=$size", "of=$iso_path"]]);
};
my $err = $@;
my $content = "#cloud-config\n";
$content .= "hostname: $hostname\n";
+ $content .= "manage_etc_hosts: true\n";
$content .= "fqdn: $fqdn\n" if defined($fqdn);
my $username = $conf->{ciuser};
return $content;
}
+sub split_ip4 {
+ my ($ip) = @_;
+ my ($addr, $mask) = split('/', $ip);
+ die "not a CIDR: $ip\n" if !defined $mask;
+ return ($addr, $PVE::Network::ipv4_reverse_mask->[$mask]);
+}
+
sub configdrive2_network {
my ($conf) = @_;
if ($net->{ip} eq 'dhcp') {
$content .= "iface $id inet dhcp\n";
} else {
- my ($addr, $mask) = split('/', $net->{ip});
+ my ($addr, $mask) = split_ip4($net->{ip});
$content .= "iface $id inet static\n";
$content .= " address $addr\n";
- $content .= " netmask $PVE::Network::ipv4_reverse_mask->[$mask]\n";
+ $content .= " netmask $mask\n";
$content .= " gateway $net->{gw}\n" if $net->{gw};
}
}
'/openstack/content/0000' => $network_data,
'/openstack/latest/meta_data.json' => $meta_data
};
- commit_cloudinit_disk($vmid, $conf, $drive, $volname, $storeid, $files, 'config-2');
+ commit_cloudinit_disk($conf, $vmid, $drive, $volname, $storeid, $files, 'config-2');
}
sub nocloud_network_v2 {
my $net = PVE::QemuServer::parse_net($conf->{$iface});
my $ipconfig = PVE::QemuServer::parse_ipconfig($conf->{"ipconfig$id"});
- my $mac = $net->{macaddr}
+ my $mac = lc($net->{macaddr})
or die "network interface '$iface' has no mac address\n";
$content .= "${i}- type: physical\n"
if ($ip eq 'dhcp') {
$content .= "${i}- type: dhcp4\n";
} else {
+ my ($addr, $mask) = split_ip4($ip);
$content .= "${i}- type: static\n"
- . "${i} address: $ip\n";
+ . "${i} address: $addr\n"
+ . "${i} netmask: $mask\n";
if (defined(my $gw = $ipconfig->{gw})) {
$content .= "${i} gateway: $gw\n";
}
if (defined(my $ip = $ipconfig->{ip6})) {
if ($ip eq 'dhcp') {
$content .= "${i}- type: dhcp6\n";
+ } elsif ($ip eq 'auto') {
+ # SLAAC is not supported by cloud-init, this fallback should work with an up-to-date netplan at least
+ $content .= "${i}- type: dhcp6\n";
} else {
- $content .= "${i}- type: static6\n"
+ $content .= "${i}- type: static\n"
. "${i} address: $ip\n";
if (defined(my $gw = $ipconfig->{gw6})) {
$content .= "${i} gateway: $gw\n";
'/network-config' => $network_data,
'/meta-data' => $meta_data
};
- commit_cloudinit_disk($vmid, $conf, $drive, $volname, $storeid, $files, 'cidata');
+ commit_cloudinit_disk($conf, $vmid, $drive, $volname, $storeid, $files, 'cidata');
}
my $cloudinit_methods = {