diskimage-builder/diskimage_builder/elements/simple-init/post-install.d/80-simple-init
Clark Boylan 5b5b78bf59 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
2019-07-10 08:33:17 -07:00

53 lines
1.7 KiB
Bash
Executable File

#!/bin/bash
if [ "${DIB_DEBUG_TRACE:-0}" -gt 0 ]; then
set -x
fi
set -eu
set -o pipefail
case "$DIB_INIT_SYSTEM" in
upstart)
# nothing to do
exit 0
;;
systemd)
if [[ ${DISTRO_NAME} =~ (centos|rhel7|fedora) ]]; then
if [[ ${DIB_SIMPLE_INIT_NETWORKMANAGER} != 1 ]]; then
# NOTE(pabelanger): Glean requires network.service for
# these platforms when not using networkmanager
systemctl enable network.service
fi
elif [[ ${DISTRO_NAME} =~ (opensuse) ]]; then
# on suse, this is named wicked.service, but it's the same
# as network.service.
systemctl enable wicked.service
fi
;;
openrc)
# let dib-init-system's postinstall handle enabling init scripts
exit 0
;;
sysv)
# nothing to do
exit 0
;;
*)
echo "Unsupported init system $DIB_INIT_SYSTEM"
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