Merge pull request #107382 from rnhmjoj/no-udev-settle
nixos/{networkd,dhcpcd}: remove udev-settle hack
This commit is contained in:
commit
19d715c573
@ -15,5 +15,6 @@
|
|||||||
<xi:include href="firewall.xml" />
|
<xi:include href="firewall.xml" />
|
||||||
<xi:include href="wireless.xml" />
|
<xi:include href="wireless.xml" />
|
||||||
<xi:include href="ad-hoc-network-config.xml" />
|
<xi:include href="ad-hoc-network-config.xml" />
|
||||||
|
<xi:include href="renaming-interfaces.xml" />
|
||||||
<!-- TODO: OpenVPN, NAT -->
|
<!-- TODO: OpenVPN, NAT -->
|
||||||
</chapter>
|
</chapter>
|
||||||
|
67
nixos/doc/manual/configuration/renaming-interfaces.xml
Normal file
67
nixos/doc/manual/configuration/renaming-interfaces.xml
Normal file
@ -0,0 +1,67 @@
|
|||||||
|
<section xmlns="http://docbook.org/ns/docbook"
|
||||||
|
xmlns:xlink="http://www.w3.org/1999/xlink"
|
||||||
|
xmlns:xi="http://www.w3.org/2001/XInclude"
|
||||||
|
version="5.0"
|
||||||
|
xml:id="sec-rename-ifs">
|
||||||
|
<title>Renaming network interfaces</title>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
NixOS uses the udev
|
||||||
|
<link xlink:href="https://systemd.io/PREDICTABLE_INTERFACE_NAMES/">predictable naming scheme</link>
|
||||||
|
to assign names to network interfaces. This means that by default
|
||||||
|
cards are not given the traditional names like
|
||||||
|
<literal>eth0</literal> or <literal>eth1</literal>, whose order can
|
||||||
|
change unpredictably across reboots. Instead, relying on physical
|
||||||
|
locations and firmware information, the scheme produces names like
|
||||||
|
<literal>ens1</literal>, <literal>enp2s0</literal>, etc.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>
|
||||||
|
These names are predictable but less memorable and not necessarily
|
||||||
|
stable: for example installing new hardware or changing firmware
|
||||||
|
settings can result in a
|
||||||
|
<link xlink:href="https://github.com/systemd/systemd/issues/3715#issue-165347602">name change</link>.
|
||||||
|
If this is undesirable, for example if you have a single ethernet
|
||||||
|
card, you can revert to the traditional scheme by setting
|
||||||
|
<xref linkend="opt-networking.usePredictableInterfaceNames"/> to
|
||||||
|
<literal>false</literal>.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<section xml:id="sec-custom-ifnames">
|
||||||
|
<title>Assigning custom names</title>
|
||||||
|
<para>
|
||||||
|
In case there are multiple interfaces of the same type, it’s better to
|
||||||
|
assign custom names based on the device hardware address. For
|
||||||
|
example, we assign the name <literal>wan</literal> to the interface
|
||||||
|
with MAC address <literal>52:54:00:12:01:01</literal> using a
|
||||||
|
netword link unit:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
<link linkend="opt-systemd.network.links">systemd.network.links."10-wan"</link> = {
|
||||||
|
matchConfig.MACAddress = "52:54:00:12:01:01";
|
||||||
|
linkConfig.Name = "wan";
|
||||||
|
};
|
||||||
|
</programlisting>
|
||||||
|
<para>
|
||||||
|
Note that links are directly read by udev, <emphasis>not networkd</emphasis>,
|
||||||
|
and will work even if networkd is disabled.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
Alternatively, we can use a plain old udev rule:
|
||||||
|
</para>
|
||||||
|
<programlisting>
|
||||||
|
<link linkend="opt-services.udev.initrdRules">services.udev.initrdRules</link> = ''
|
||||||
|
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", \
|
||||||
|
ATTR{address}=="52:54:00:12:01:01", KERNEL=="eth*", NAME="wan"
|
||||||
|
'';
|
||||||
|
</programlisting>
|
||||||
|
|
||||||
|
<warning><para>
|
||||||
|
The rule must be installed in the initrd using
|
||||||
|
<literal>services.udev.initrdRules</literal>, not the usual
|
||||||
|
<literal>services.udev.extraRules</literal> option. This is to avoid race
|
||||||
|
conditions with other programs controlling the interface.
|
||||||
|
</para></warning>
|
||||||
|
</section>
|
||||||
|
|
||||||
|
</section>
|
@ -91,6 +91,16 @@
|
|||||||
</para>
|
</para>
|
||||||
|
|
||||||
<itemizedlist>
|
<itemizedlist>
|
||||||
|
<listitem>
|
||||||
|
<para>
|
||||||
|
If you are using <option>services.udev.extraRules</option> to assign
|
||||||
|
custom names to network interfaces, this may stop working due to a change
|
||||||
|
in the initialisation of dhcpcd and systemd networkd. To avoid this, either
|
||||||
|
move them to <option>services.udev.initrdRules</option> or see the new
|
||||||
|
<link linkend="sec-custom-ifnames">Assigning custom names</link> section
|
||||||
|
of the NixOS manual for an example using networkd links.
|
||||||
|
</para>
|
||||||
|
</listitem>
|
||||||
<listitem>
|
<listitem>
|
||||||
<para>
|
<para>
|
||||||
The <literal>systemConfig</literal> kernel parameter is no longer added to boot loader entries. It has been unused since September 2010, but if do have a system generation from that era, you will now be unable to boot into them.
|
The <literal>systemConfig</literal> kernel parameter is no longer added to boot loader entries. It has been unused since September 2010, but if do have a system generation from that era, you will now be unable to boot into them.
|
||||||
|
@ -202,12 +202,26 @@ in
|
|||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
|
||||||
extraRules = mkOption {
|
initrdRules = mkOption {
|
||||||
default = "";
|
default = "";
|
||||||
example = ''
|
example = ''
|
||||||
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1D:60:B9:6D:4F", KERNEL=="eth*", NAME="my_fast_network_card"
|
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="00:1D:60:B9:6D:4F", KERNEL=="eth*", NAME="my_fast_network_card"
|
||||||
'';
|
'';
|
||||||
type = types.lines;
|
type = types.lines;
|
||||||
|
description = ''
|
||||||
|
<command>udev</command> rules to include in the initrd
|
||||||
|
<emphasis>only</emphasis>. They'll be written into file
|
||||||
|
<filename>99-local.rules</filename>. Thus they are read and applied
|
||||||
|
after the essential initrd rules.
|
||||||
|
'';
|
||||||
|
};
|
||||||
|
|
||||||
|
extraRules = mkOption {
|
||||||
|
default = "";
|
||||||
|
example = ''
|
||||||
|
ENV{ID_VENDOR_ID}=="046d", ENV{ID_MODEL_ID}=="0825", ENV{PULSE_IGNORE}="1"
|
||||||
|
'';
|
||||||
|
type = types.lines;
|
||||||
description = ''
|
description = ''
|
||||||
Additional <command>udev</command> rules. They'll be written
|
Additional <command>udev</command> rules. They'll be written
|
||||||
into file <filename>99-local.rules</filename>. Thus they are
|
into file <filename>99-local.rules</filename>. Thus they are
|
||||||
@ -284,6 +298,13 @@ in
|
|||||||
|
|
||||||
boot.kernelParams = mkIf (!config.networking.usePredictableInterfaceNames) [ "net.ifnames=0" ];
|
boot.kernelParams = mkIf (!config.networking.usePredictableInterfaceNames) [ "net.ifnames=0" ];
|
||||||
|
|
||||||
|
boot.initrd.extraUdevRulesCommands = optionalString (cfg.initrdRules != "")
|
||||||
|
''
|
||||||
|
cat <<'EOF' > $out/99-local.rules
|
||||||
|
${cfg.initrdRules}
|
||||||
|
EOF
|
||||||
|
'';
|
||||||
|
|
||||||
environment.etc =
|
environment.etc =
|
||||||
{
|
{
|
||||||
"udev/rules.d".source = udevRules;
|
"udev/rules.d".source = udevRules;
|
||||||
|
@ -191,9 +191,8 @@ in
|
|||||||
{ description = "DHCP Client";
|
{ description = "DHCP Client";
|
||||||
|
|
||||||
wantedBy = [ "multi-user.target" ] ++ optional (!hasDefaultGatewaySet) "network-online.target";
|
wantedBy = [ "multi-user.target" ] ++ optional (!hasDefaultGatewaySet) "network-online.target";
|
||||||
wants = [ "network.target" "systemd-udev-settle.service" ];
|
wants = [ "network.target" ];
|
||||||
before = [ "network-online.target" ];
|
before = [ "network-online.target" ];
|
||||||
after = [ "systemd-udev-settle.service" ];
|
|
||||||
|
|
||||||
restartTriggers = [ exitHook ];
|
restartTriggers = [ exitHook ];
|
||||||
|
|
||||||
|
@ -1553,9 +1553,6 @@ in
|
|||||||
wantedBy = [ "multi-user.target" ];
|
wantedBy = [ "multi-user.target" ];
|
||||||
aliases = [ "dbus-org.freedesktop.network1.service" ];
|
aliases = [ "dbus-org.freedesktop.network1.service" ];
|
||||||
restartTriggers = map (x: x.source) (attrValues unitFiles);
|
restartTriggers = map (x: x.source) (attrValues unitFiles);
|
||||||
# prevent race condition with interface renaming (#39069)
|
|
||||||
requires = [ "systemd-udev-settle.service" ];
|
|
||||||
after = [ "systemd-udev-settle.service" ];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
systemd.services.systemd-networkd-wait-online = {
|
systemd.services.systemd-networkd-wait-online = {
|
||||||
|
@ -205,13 +205,22 @@ let
|
|||||||
''; # */
|
''; # */
|
||||||
|
|
||||||
|
|
||||||
|
# Networkd link files are used early by udev to set up interfaces early.
|
||||||
|
# This must be done in stage 1 to avoid race conditions between udev and
|
||||||
|
# network daemons.
|
||||||
linkUnits = pkgs.runCommand "link-units" {
|
linkUnits = pkgs.runCommand "link-units" {
|
||||||
allowedReferences = [ extraUtils ];
|
allowedReferences = [ extraUtils ];
|
||||||
preferLocalBuild = true;
|
preferLocalBuild = true;
|
||||||
} ''
|
} (''
|
||||||
mkdir -p $out
|
mkdir -p $out
|
||||||
cp -v ${udev}/lib/systemd/network/*.link $out/
|
cp -v ${udev}/lib/systemd/network/*.link $out/
|
||||||
'';
|
'' + (
|
||||||
|
let
|
||||||
|
links = filterAttrs (n: v: hasSuffix ".link" n) config.systemd.network.units;
|
||||||
|
files = mapAttrsToList (n: v: "${v.unit}/${n}") links;
|
||||||
|
in
|
||||||
|
concatMapStringsSep "\n" (file: "cp -v ${file} $out/") files
|
||||||
|
));
|
||||||
|
|
||||||
udevRules = pkgs.runCommand "udev-rules" {
|
udevRules = pkgs.runCommand "udev-rules" {
|
||||||
allowedReferences = [ extraUtils ];
|
allowedReferences = [ extraUtils ];
|
||||||
|
@ -672,6 +672,30 @@ let
|
|||||||
), "The IPv6 routing table has not been properly cleaned:\n{}".format(ipv6Residue)
|
), "The IPv6 routing table has not been properly cleaned:\n{}".format(ipv6Residue)
|
||||||
'';
|
'';
|
||||||
};
|
};
|
||||||
|
rename = {
|
||||||
|
name = "RenameInterface";
|
||||||
|
machine = { pkgs, ... }: {
|
||||||
|
virtualisation.vlans = [ 1 ];
|
||||||
|
networking = {
|
||||||
|
useNetworkd = networkd;
|
||||||
|
useDHCP = false;
|
||||||
|
};
|
||||||
|
} //
|
||||||
|
(if networkd
|
||||||
|
then { systemd.network.links."10-custom_name" = {
|
||||||
|
matchConfig.MACAddress = "52:54:00:12:01:01";
|
||||||
|
linkConfig.Name = "custom_name";
|
||||||
|
};
|
||||||
|
}
|
||||||
|
else { services.udev.initrdRules = ''
|
||||||
|
SUBSYSTEM=="net", ACTION=="add", DRIVERS=="?*", ATTR{address}=="52:54:00:12:01:01", KERNEL=="eth*", NAME="custom_name"
|
||||||
|
'';
|
||||||
|
});
|
||||||
|
testScript = ''
|
||||||
|
machine.succeed("udevadm settle")
|
||||||
|
print(machine.succeed("ip link show dev custom_name"))
|
||||||
|
'';
|
||||||
|
};
|
||||||
# even with disabled networkd, systemd.network.links should work
|
# even with disabled networkd, systemd.network.links should work
|
||||||
# (as it's handled by udev, not networkd)
|
# (as it's handled by udev, not networkd)
|
||||||
link = {
|
link = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user