diff --git a/nixos/modules/system/boot/stage-2-init.sh b/nixos/modules/system/boot/stage-2-init.sh
index f827e530f877..7a54bb03e297 100644
--- a/nixos/modules/system/boot/stage-2-init.sh
+++ b/nixos/modules/system/boot/stage-2-init.sh
@@ -34,20 +34,24 @@ if [ -z "$container" ]; then
 fi
 
 
-# Likewise, stage 1 mounts /proc, /dev and /sys, so if we don't have a
+# Likewise, stage 1 mounts /proc, /dev, /sys and /run, so if we don't have a
 # stage 1, we need to do that here.
-if [ ! -e /proc/1 ]; then
-    specialMount() {
-        local device="$1"
-        local mountPoint="$2"
-        local options="$3"
-        local fsType="$4"
+# We check for each mountpoint separately to avoid esoteric failure modes
+# if only a subset was mounted by whatever called us.
+specialMount() {
+    local device="$1"
+    local mountPoint="$2"
+    local options="$3"
+    local fsType="$4"
 
-        mkdir -m 0755 -p "$mountPoint"
-        mount -n -t "$fsType" -o "$options" "$device" "$mountPoint"
-    }
-    source @earlyMountScript@
-fi
+    if mountpoint -q "$mountpoint"; then
+        return 0
+    fi
+
+    mkdir -m 0755 -p "$mountPoint"
+    mount -n -t "$fsType" -o "$options" "$device" "$mountPoint"
+}
+source @earlyMountScript@
 
 
 echo "booting system configuration $systemConfig" > /dev/kmsg