diff --git a/.gitignore b/.gitignore index eff0e18cb..bf962c8ab 100644 --- a/.gitignore +++ b/.gitignore @@ -84,6 +84,9 @@ test-*.trs /data/org.freedesktop.NetworkManager.policy.in /data/nm-sudo.service /data/nm-priv-helper.service +/data/NetworkManager-config-initrd.service +/data/NetworkManager-initrd.service +/data/NetworkManager-wait-online-initrd.service /docs/api/version.xml /docs/api/settings-spec.html diff --git a/NEWS b/NEWS index 3ae8c6416..92be861df 100644 --- a/NEWS +++ b/NEWS @@ -8,6 +8,8 @@ subject to change and not guaranteed to be compatible with the later release. USE AT YOUR OWN RISK. NOT RECOMMENDED FOR PRODUCTION USE! +* Added systemd services to provide networking in the initrd. + ============================================= NetworkManager-1.52 Overview of changes since NetworkManager-1.50 diff --git a/contrib/fedora/rpm/NetworkManager.spec b/contrib/fedora/rpm/NetworkManager.spec index 2af0f4460..45e3057fd 100644 --- a/contrib/fedora/rpm/NetworkManager.spec +++ b/contrib/fedora/rpm/NetworkManager.spec @@ -43,7 +43,7 @@ %global real_version_major %(printf '%s' '%{real_version}' | sed -n 's/^\\([1-9][0-9]*\\.[0-9][0-9]*\\)\\.[0-9][0-9]*$/\\1/p') -%global systemd_units NetworkManager.service NetworkManager-wait-online.service NetworkManager-dispatcher.service nm-priv-helper.service +%global systemd_units NetworkManager.service NetworkManager-wait-online.service NetworkManager-dispatcher.service nm-priv-helper.service NetworkManager-config-initrd.service NetworkManager-initrd.service NetworkManager-wait-online-initrd.service %global systemd_units_cloud_setup nm-cloud-setup.service nm-cloud-setup.timer @@ -829,7 +829,7 @@ if [ $1 -eq 0 ]; then # Don't kill networking entirely just on package remove #/bin/systemctl stop NetworkManager.service >/dev/null 2>&1 || : fi -%systemd_preun NetworkManager-wait-online.service NetworkManager-dispatcher.service nm-priv-helper.service +%systemd_preun NetworkManager-wait-online.service NetworkManager-dispatcher.service nm-priv-helper.service NetworkManager-config-initrd.service NetworkManager-initrd.service NetworkManager-wait-online-initrd.service %if %{with ifcfg_rh} @@ -927,6 +927,9 @@ fi %{_unitdir}/NetworkManager-wait-online.service %{_unitdir}/NetworkManager-dispatcher.service %{_unitdir}/nm-priv-helper.service +%{_unitdir}/NetworkManager-config-initrd.service +%{_unitdir}/NetworkManager-initrd.service +%{_unitdir}/NetworkManager-wait-online-initrd.service %dir %{_datadir}/doc/NetworkManager/examples %{_datadir}/doc/NetworkManager/examples/server.conf %if %{with ifcfg_warning} || %{with ifcfg_migrate} diff --git a/data/NetworkManager-config-initrd.service.in b/data/NetworkManager-config-initrd.service.in new file mode 100644 index 000000000..4baf0f648 --- /dev/null +++ b/data/NetworkManager-config-initrd.service.in @@ -0,0 +1,27 @@ +[Unit] +Description=NetworkManager Configuration (initrd) +DefaultDependencies=no +Wants=systemd-journald.socket +After=systemd-journald.socket +Before=systemd-udevd.service systemd-udev-trigger.service +ConditionPathExists=/etc/initrd-release + +[Service] +Type=oneshot +ExecStartPre=/bin/sh -c "rm -f /run/NetworkManager/system-connections/*" +ExecStart=/bin/sh -c "@libexecdir@/nm-initrd-generator -- $(cat /proc/cmdline)" +ExecStartPost=/bin/sh -c ' \ + for i in /{usr/lib,run,etc}/NetworkManager/system-connections/*; do \ + [ -f "$i" ] || continue; \ + mkdir -p /run/NetworkManager/initrd; \ + : > /run/NetworkManager/initrd/neednet; \ + break; \ + done; \ + if [ -s /run/NetworkManager/initrd/hostname ]; then \ + cat /run/NetworkManager/initrd/hostname > /proc/sys/kernel/hostname; \ + fi \ +' +RemainAfterExit=yes + +[Install] +WantedBy=initrd.target diff --git a/data/NetworkManager-initrd.service.in b/data/NetworkManager-initrd.service.in new file mode 100644 index 000000000..aef73a571 --- /dev/null +++ b/data/NetworkManager-initrd.service.in @@ -0,0 +1,32 @@ +[Unit] +Description=NetworkManager (initrd) +DefaultDependencies=no +Wants=systemd-udev-trigger.service network.target +After=systemd-udev-trigger.service network-pre.target dbus.service NetworkManager-config-initrd.service +Before=network.target +BindsTo=dbus.service +ConditionPathExists=/etc/initrd-release +ConditionPathExists=/run/NetworkManager/initrd/neednet +ConditionPathExistsGlob=|/usr/lib/NetworkManager/system-connections/* +ConditionPathExistsGlob=|/run/NetworkManager/system-connections/* +ConditionPathExistsGlob=|/etc/NetworkManager/system-connections/* + +[Service] +Type=dbus +BusName=org.freedesktop.NetworkManager +ExecReload=/usr/bin/busctl call org.freedesktop.NetworkManager /org/freedesktop/NetworkManager org.freedesktop.NetworkManager Reload u 0 +ExecStart=@sbindir@/NetworkManager +# NM doesn't want systemd to kill its children for it +KillMode=process +Environment=NM_CONFIG_ENABLE_TAG=initrd +Restart=on-failure +ProtectSystem=true +ProtectHome=read-only + +[Install] +WantedBy=initrd.target +# We want to enable NetworkManager-wait-online-initrd.service whenever this +# service is enabled. NetworkManager-wait-online-initrd.service has +# WantedBy=network-online.target, so enabling it only has an effect if +# network-online.target itself is enabled or pulled in by some other unit. +Also=NetworkManager-config-initrd.service NetworkManager-wait-online-initrd.service diff --git a/data/NetworkManager-wait-online-initrd.service.in b/data/NetworkManager-wait-online-initrd.service.in new file mode 100644 index 000000000..da4a25223 --- /dev/null +++ b/data/NetworkManager-wait-online-initrd.service.in @@ -0,0 +1,26 @@ +[Unit] +Description=NetworkManager Wait Online (initrd) +DefaultDependencies=no +Requires=NetworkManager-initrd.service +After=NetworkManager-initrd.service +Before=network-online.target +ConditionPathExists=/etc/initrd-release +ConditionPathExists=/run/NetworkManager/initrd/neednet + +[Service] +# `nm-online -s` waits until the point when NetworkManager logs +# "startup complete". That is when startup actions are settled and +# devices and profiles reached a conclusive activated or deactivated +# state. It depends on which profiles are configured to autoconnect and +# also depends on profile settings like ipv4.may-fail/ipv6.may-fail, +# which affect when a profile is considered fully activated. +# Check NetworkManager logs to find out why wait-online takes a certain +# time. + +Type=oneshot +ExecStart=@bindir@/nm-online -s -q +RemainAfterExit=yes +Environment=NM_ONLINE_TIMEOUT=3600 + +[Install] +WantedBy=initrd.target network-online.target diff --git a/data/meson.build b/data/meson.build index facdab8d3..b77bf4340 100644 --- a/data/meson.build +++ b/data/meson.build @@ -13,6 +13,9 @@ if install_systemdunitdir 'NetworkManager.service', 'nm-priv-helper.service', 'NetworkManager-wait-online.service', + 'NetworkManager-config-initrd.service', + 'NetworkManager-initrd.service', + 'NetworkManager-wait-online-initrd.service', ] foreach service: services