nixos/stage-1: fix predictable interfaces names

This makes predictable interfaces names available as soon as possible
with udev by adding the default network link units to initrd which are read
by udev. Also adds some udev rules that are needed but which would normally
loaded from the udev store path which is not included in the initrd.
This commit is contained in:
Franz Pletz 2019-09-22 17:14:47 +02:00
parent cfd4d4557a
commit 44e289f93b
No known key found for this signature in database
GPG key ID: 846FDED7792617B4
3 changed files with 23 additions and 4 deletions

View file

@ -210,6 +210,8 @@ done
# Create device nodes in /dev. # Create device nodes in /dev.
@preDeviceCommands@ @preDeviceCommands@
echo "running udev..." echo "running udev..."
mkdir -p /etc/systemd
ln -sfn @linkUnits@ /etc/systemd/network
mkdir -p /etc/udev mkdir -p /etc/udev
ln -sfn @udevRules@ /etc/udev/rules.d ln -sfn @udevRules@ /etc/udev/rules.d
mkdir -p /dev/.mdadm mkdir -p /dev/.mdadm
@ -266,7 +268,7 @@ checkFS() {
return 0 return 0
fi fi
# Device might be already mounted manually # Device might be already mounted manually
# e.g. NBD-device or the host filesystem of the file which contains encrypted root fs # e.g. NBD-device or the host filesystem of the file which contains encrypted root fs
if mount | grep -q "^$device on "; then if mount | grep -q "^$device on "; then
echo "skip checking already mounted $device" echo "skip checking already mounted $device"
@ -351,7 +353,7 @@ mountFS() {
elif [ "$fsType" = f2fs ]; then elif [ "$fsType" = f2fs ]; then
echo "resizing $device..." echo "resizing $device..."
fsck.f2fs -fp "$device" fsck.f2fs -fp "$device"
resize.f2fs "$device" resize.f2fs "$device"
fi fi
;; ;;
esac esac

View file

@ -120,6 +120,7 @@ let
# Copy udev. # Copy udev.
copy_bin_and_libs ${udev}/lib/systemd/systemd-udevd copy_bin_and_libs ${udev}/lib/systemd/systemd-udevd
copy_bin_and_libs ${udev}/lib/systemd/systemd-sysctl
copy_bin_and_libs ${udev}/bin/udevadm copy_bin_and_libs ${udev}/bin/udevadm
for BIN in ${udev}/lib/udev/*_id; do for BIN in ${udev}/lib/udev/*_id; do
copy_bin_and_libs $BIN copy_bin_and_libs $BIN
@ -198,6 +199,14 @@ let
''; # */ ''; # */
linkUnits = pkgs.runCommand "link-units" {
allowedReferences = [ extraUtils ];
preferLocalBuild = true;
} ''
mkdir -p $out
cp -v ${udev}/lib/systemd/network/*.link $out/
'';
udevRules = pkgs.runCommand "udev-rules" { udevRules = pkgs.runCommand "udev-rules" {
allowedReferences = [ extraUtils ]; allowedReferences = [ extraUtils ];
preferLocalBuild = true; preferLocalBuild = true;
@ -208,7 +217,9 @@ let
cp -v ${udev}/lib/udev/rules.d/60-cdrom_id.rules $out/ cp -v ${udev}/lib/udev/rules.d/60-cdrom_id.rules $out/
cp -v ${udev}/lib/udev/rules.d/60-persistent-storage.rules $out/ cp -v ${udev}/lib/udev/rules.d/60-persistent-storage.rules $out/
cp -v ${udev}/lib/udev/rules.d/75-net-description.rules $out/
cp -v ${udev}/lib/udev/rules.d/80-drivers.rules $out/ cp -v ${udev}/lib/udev/rules.d/80-drivers.rules $out/
cp -v ${udev}/lib/udev/rules.d/80-net-setup-link.rules $out/
cp -v ${pkgs.lvm2}/lib/udev/rules.d/*.rules $out/ cp -v ${pkgs.lvm2}/lib/udev/rules.d/*.rules $out/
${config.boot.initrd.extraUdevRulesCommands} ${config.boot.initrd.extraUdevRulesCommands}
@ -222,7 +233,7 @@ let
--replace ${pkgs.lvm2}/sbin ${extraUtils}/bin \ --replace ${pkgs.lvm2}/sbin ${extraUtils}/bin \
--replace ${pkgs.mdadm}/sbin ${extraUtils}/sbin \ --replace ${pkgs.mdadm}/sbin ${extraUtils}/sbin \
--replace ${pkgs.bash}/bin/sh ${extraUtils}/bin/sh \ --replace ${pkgs.bash}/bin/sh ${extraUtils}/bin/sh \
--replace ${udev}/bin/udevadm ${extraUtils}/bin/udevadm --replace ${udev} ${extraUtils}
done done
# Work around a bug in QEMU, which doesn't implement the "READ # Work around a bug in QEMU, which doesn't implement the "READ
@ -257,7 +268,7 @@ let
${pkgs.buildPackages.busybox}/bin/ash -n $target ${pkgs.buildPackages.busybox}/bin/ash -n $target
''; '';
inherit udevRules extraUtils modulesClosure; inherit linkUnits udevRules extraUtils modulesClosure;
inherit (config.boot) resumeDevice; inherit (config.boot) resumeDevice;

View file

@ -17,6 +17,12 @@ in pkgs.lib.listToAttrs (pkgs.lib.crossLists (predictable: withNetworkd: {
networking.useNetworkd = withNetworkd; networking.useNetworkd = withNetworkd;
networking.dhcpcd.enable = !withNetworkd; networking.dhcpcd.enable = !withNetworkd;
networking.useDHCP = !withNetworkd; networking.useDHCP = !withNetworkd;
# Check if predictable interface names are working in stage-1
boot.initrd.postDeviceCommands = ''
ip link
ip link show eth0 ${if predictable then "&&" else "||"} exit 1
'';
}; };
testScript = '' testScript = ''