When a container uses the default `/sbin/init` entrypoint, network interface configuration is usually managed by processes within the container. However, containers with a different entrypoint might not have any internal network management process. Consequently, IP addresses might not be assigned.
This change ensures that a static IP address is explicitly set in the LXC config for the container. Signed-off-by: Filip Schauer <f.scha...@proxmox.com> --- Changed since v2: * rebase onto newest master (5a8b3f962f16) and re-format with proxmox-perltidy * add an "ipmanagehost" property to pct.conf to control whether network interface IP configuration should be handled by the host. src/PVE/API2/LXC.pm | 4 ++++ src/PVE/LXC.pm | 15 +++++++++++++++ src/PVE/LXC/Config.pm | 14 ++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/src/PVE/API2/LXC.pm b/src/PVE/API2/LXC.pm index c3d0037..096dfb8 100644 --- a/src/PVE/API2/LXC.pm +++ b/src/PVE/API2/LXC.pm @@ -587,6 +587,10 @@ __PACKAGE__->register_method({ # An entrypoint other than /sbin/init breaks the tty console mode. # This is fixed by setting cmode: console $conf->{cmode} = 'console'; + + # Manage the IP configuration for the container. A container with a + # custom entrypoint likely lacks internal network management. + $conf->{ipmanagehost} = 1; } } diff --git a/src/PVE/LXC.pm b/src/PVE/LXC.pm index 37ff8e1..7c9caf6 100644 --- a/src/PVE/LXC.pm +++ b/src/PVE/LXC.pm @@ -835,6 +835,21 @@ sub update_lxc_config { if ($lxc_major >= 4) { $raw .= "lxc.net.$ind.script.up = /usr/share/lxc/lxcnetaddbr\n"; } + + if ((!defined($d->{link_down}) || $d->{link_down} != 1) && $conf->{ipmanagehost}) { + if (defined($d->{ip})) { + die "$k: DHCP is not supported with a custom entrypoint\n" if $d->{ip} eq 'dhcp'; + $raw .= "lxc.net.$ind.ipv4.address = $d->{ip}\n" if $d->{ip} ne 'manual'; + } + $raw .= "lxc.net.$ind.ipv4.gateway = $d->{gw}\n" if defined($d->{gw}); + if (defined($d->{ip6})) { + die "$k: DHCPv6 and SLAAC are not supported with a custom entrypoint\n" + if $d->{ip6} =~ /^(auto|dhcp)$/; + $raw .= "lxc.net.$ind.ipv6.address = $d->{ip6}\n" if $d->{ip6} ne 'manual'; + } + $raw .= "lxc.net.$ind.ipv6.gateway = $d->{gw6}\n" if defined($d->{gw6}); + $raw .= "lxc.net.$ind.flags = up\n"; + } } my $had_cpuset = 0; diff --git a/src/PVE/LXC/Config.pm b/src/PVE/LXC/Config.pm index fb370cf..c2f56e4 100644 --- a/src/PVE/LXC/Config.pm +++ b/src/PVE/LXC/Config.pm @@ -594,6 +594,12 @@ my $confdesc = { . " This is saved as comment inside the configuration file.", maxLength => 1024 * 8, }, + ipmanagehost => { + type => 'boolean', + description => + "Whether this interface's IP configuration should be managed by the host.", + optional => 1, + }, searchdomain => { optional => 1, type => 'string', @@ -1284,6 +1290,14 @@ sub update_pct_config { die "$opt: MTU size '$mtu' is bigger than bridge MTU '$bridge_mtu'\n" if ($mtu > $bridge_mtu); } + + if ((!defined($res->{link_down}) || $res->{link_down} != 1) && $conf->{ipmanagehost}) { + die "$opt: DHCP is not supported with a custom entrypoint\n" + if defined($res->{ip}) && $res->{ip} eq 'dhcp'; + + die "$opt: DHCPv6 and SLAAC are not supported with a custom entrypoint\n" + if defined($res->{ip6}) && $res->{ip6} =~ /^(auto|dhcp)$/; + } } elsif ($opt =~ m/^dev(\d+)$/) { my $device = $class->parse_device($value); -- 2.47.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel