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