PVE 源码修改,解决cloudinit 自动设置IP dns ipv6D

61次阅读
没有评论

在Cloudinit.pm 文件中,PVE linux使用的是 nocloud 模块 ,windows使用的是configdrive2
当前针对PVE8版本其他版本未验证
IP 登录信息等自动设置不成功,需要修改以上文件

1、 修改文件 Qemu.pm 1022行
/usr/share/perl5/PVE/API2/Qemu.pm

if (defined(my $cipassword = $param->{cipassword})) {
# Same logic as in cloud-init (but with the regex fixed...)
$param->{cipassword} = PVE::Tools::encrypt_pw($cipassword)
if $cipassword !~ /^\$(?:[156]|2[ay])(\$.+){2}/;
}

修改为
my $conf = PVE::QemuConfig->load_config($vmid);
my $ostype = $conf->{ostype};
if (defined(my $cipassword = $param->{cipassword})) {
# Same logic as in cloud-init (but with the regex fixed...)
if (!(PVE::QemuServer::windows_version($ostype))) {
$param->{cipassword} = PVE::Tools::encrypt_pw($cipassword)
if $cipassword !~ /^\$(?:[156]|2[ay])(\$.+){2}/;
}
}

2、 修改文件 /usr/share/perl5/PVE/QemuServer/Cloudinit.pm 210行 替换 configdrive2_metadata 这个方法

sub configdrive2_metadata {
my ($conf, $vmid, $user, $network) = @_;
my $uuid = Digest::SHA::sha1_hex($user.$network);
my $password = $conf->{cipassword};
my ($hostname, $fqdn) = get_hostname_fqdn($conf, $vmid);
my $startConfig = <<"EOF"; { "hostname": "$hostname", "uuid": "$uuid", "admin_pass": "$password", EOF if (defined(my $keys = $conf->{sshkeys})) {
$startConfig .= " \"network_config\": { \"content_path\": \"/content/0000\" },\n";
$keys = URI::Escape::uri_unescape($keys);
$keys = [map { my $key = $_; chomp $key; $key } split(/\n/, $keys)];
$keys = [grep { /\S/ } @$keys];
$startConfig .= " \"keys\": [\n";
$startConfig .= " {\n";

my $keyCount = @$keys;
for (my $i=0; $i < $keyCount; $i++) { # $startConfig .= " $keyCount " if ($i == $keyCount-1){ $startConfig .= " \"key-$i\": \"".$keys->[$i]."\"\n";
} else {
$startConfig .= " \"key-$i\": \"".$keys->[$i]."\",\n";
}
}

$startConfig .= " }\n";
$startConfig .= " ]\n";

} else{
$startConfig .= " \"network_config\": { \"content_path\": \"/content/0000\" }\n";
}
$startConfig.= "}";
return $startConfig;

}

在 generate_configdrive2 这个方法中

if (!defined($meta_data)) {
$meta_data = configdrive2_gen_metadata($user_data, $network_data);
}

修改为
if (!defined($meta_data)) {
$meta_data = configdrive2_metadata($conf, $vmid, $user_data, $network_data);
}

这里的最后一步,在这个文件的第200和204行,在函数configdrive2_network 中,dns服务器和搜索域有一个小的拼写错误(搜索域还不工作,我很快就会回来)。将_更改为-,使其看起来如下:
if ($nameservers && @$nameservers) {
$nameservers = join(' ', @$nameservers);
$content .= " dns-nameservers $nameservers\n";
}
if ($searchdomains && @$searchdomains) {
$searchdomains = join(' ', @$searchdomains);
$content .= " dns-search $searchdomains\n";
}

如果还不工作
追加 $content .=” dns-nameservers $nameservers,1.1.1.1\n”;
强制设置dns

正文完
 
老杨
版权声明:本站原创文章,由 老杨 2024-04-15发表,共计958字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
评论(没有评论)