From 5b5b78bf59ea0b11f08d235885048e9307a296f7 Mon Sep 17 00:00:00 2001 From: Clark Boylan Date: Wed, 10 Jul 2019 08:33:17 -0700 Subject: [PATCH] Set router solicitation delay with using NM The linux kernel and NetworkManager fight each other over control for interface management when router advertisements are in use. Long story short if the linux kernel configures a network interface for ipv6 before NetworkManager attempts to manage that interface then NM will ignore the interface and not configure ipv4 on it. This can happen because the kernel is configured to send router advertisements solicitations which result in router advertisements which the kernel uses to configure the interface(s). There is a default of a 1 second delay before sending the solicitation which in many cases is long enough that NM has started before then. However, in slower environments like those used for testing with qemu this isn't long enough. Some testing by hand indicates that 15 seconds is about right so increase the delay to 15 seconds via sysctl.conf. Note this may increase boot times in ipv6 only environments (though it is hard to be sure due to how systemd starts everything at once and does socket activation and the like). Change-Id: I475a253091cbaf63687b91c748c31a6753bb0f57 --- .../simple-init/post-install.d/80-simple-init | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/diskimage_builder/elements/simple-init/post-install.d/80-simple-init b/diskimage_builder/elements/simple-init/post-install.d/80-simple-init index 4c5a79ae..48913bc4 100755 --- a/diskimage_builder/elements/simple-init/post-install.d/80-simple-init +++ b/diskimage_builder/elements/simple-init/post-install.d/80-simple-init @@ -37,3 +37,16 @@ case "$DIB_INIT_SYSTEM" in exit 1 ;; esac + +if [[ ${DIB_SIMPLE_INIT_NETWORKMANAGER} != 0 ]]; then + # If we are using NetworkManager then we have to avoid having the kernel + # configure ipv6 addresses on an interface (via router advertisements) + # until NetworkManager starts. If the interface is configured by the + # kernel before NetworkManager then NetworkManager will ignore the + # interface and not configure ipv4 on it. It does this because it assumes + # some other entity is in control of the interface. + # Debian has a many year old long bug report detailing this behavior with + # the most interesting comment being at the end: + # https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=755202#331 + echo 'net.ipv6.conf.default.router_solicitation_delay=15' >> /etc/sysctl.conf +fi