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.

+23 -4
+4 -2
nixos/modules/system/boot/stage-1-init.sh
··· 210 210 # Create device nodes in /dev. 211 211 @preDeviceCommands@ 212 212 echo "running udev..." 213 + mkdir -p /etc/systemd 214 + ln -sfn @linkUnits@ /etc/systemd/network 213 215 mkdir -p /etc/udev 214 216 ln -sfn @udevRules@ /etc/udev/rules.d 215 217 mkdir -p /dev/.mdadm ··· 266 268 return 0 267 269 fi 268 270 269 - # Device might be already mounted manually 271 + # Device might be already mounted manually 270 272 # e.g. NBD-device or the host filesystem of the file which contains encrypted root fs 271 273 if mount | grep -q "^$device on "; then 272 274 echo "skip checking already mounted $device" ··· 351 353 elif [ "$fsType" = f2fs ]; then 352 354 echo "resizing $device..." 353 355 fsck.f2fs -fp "$device" 354 - resize.f2fs "$device" 356 + resize.f2fs "$device" 355 357 fi 356 358 ;; 357 359 esac
+13 -2
nixos/modules/system/boot/stage-1.nix
··· 120 120 121 121 # Copy udev. 122 122 copy_bin_and_libs ${udev}/lib/systemd/systemd-udevd 123 + copy_bin_and_libs ${udev}/lib/systemd/systemd-sysctl 123 124 copy_bin_and_libs ${udev}/bin/udevadm 124 125 for BIN in ${udev}/lib/udev/*_id; do 125 126 copy_bin_and_libs $BIN ··· 198 199 ''; # */ 199 200 200 201 202 + linkUnits = pkgs.runCommand "link-units" { 203 + allowedReferences = [ extraUtils ]; 204 + preferLocalBuild = true; 205 + } '' 206 + mkdir -p $out 207 + cp -v ${udev}/lib/systemd/network/*.link $out/ 208 + ''; 209 + 201 210 udevRules = pkgs.runCommand "udev-rules" { 202 211 allowedReferences = [ extraUtils ]; 203 212 preferLocalBuild = true; ··· 208 217 209 218 cp -v ${udev}/lib/udev/rules.d/60-cdrom_id.rules $out/ 210 219 cp -v ${udev}/lib/udev/rules.d/60-persistent-storage.rules $out/ 220 + cp -v ${udev}/lib/udev/rules.d/75-net-description.rules $out/ 211 221 cp -v ${udev}/lib/udev/rules.d/80-drivers.rules $out/ 222 + cp -v ${udev}/lib/udev/rules.d/80-net-setup-link.rules $out/ 212 223 cp -v ${pkgs.lvm2}/lib/udev/rules.d/*.rules $out/ 213 224 ${config.boot.initrd.extraUdevRulesCommands} 214 225 ··· 222 233 --replace ${pkgs.lvm2}/sbin ${extraUtils}/bin \ 223 234 --replace ${pkgs.mdadm}/sbin ${extraUtils}/sbin \ 224 235 --replace ${pkgs.bash}/bin/sh ${extraUtils}/bin/sh \ 225 - --replace ${udev}/bin/udevadm ${extraUtils}/bin/udevadm 236 + --replace ${udev} ${extraUtils} 226 237 done 227 238 228 239 # Work around a bug in QEMU, which doesn't implement the "READ ··· 257 268 ${pkgs.buildPackages.busybox}/bin/ash -n $target 258 269 ''; 259 270 260 - inherit udevRules extraUtils modulesClosure; 271 + inherit linkUnits udevRules extraUtils modulesClosure; 261 272 262 273 inherit (config.boot) resumeDevice; 263 274
+6
nixos/tests/predictable-interface-names.nix
··· 17 17 networking.useNetworkd = withNetworkd; 18 18 networking.dhcpcd.enable = !withNetworkd; 19 19 networking.useDHCP = !withNetworkd; 20 + 21 + # Check if predictable interface names are working in stage-1 22 + boot.initrd.postDeviceCommands = '' 23 + ip link 24 + ip link show eth0 ${if predictable then "&&" else "||"} exit 1 25 + ''; 20 26 }; 21 27 22 28 testScript = ''