nixos/etc: make re-mounting /etc overlay idempotent

nikstur 5df8cace 1e1efbcf

Changed files
+25 -11
nixos
modules
system
etc
tests
+3 -1
nixos/modules/system/etc/etc.nix
···
# this should not run because /etc is mounted via a systemd mount unit
# instead. To a large extent this mimics what composefs does. Because
# it's relatively simple, however, we avoid the composefs dependency.
-
if [[ ! $IN_NIXOS_SYSTEMD_STAGE1 ]]; then
+
# Since this script is not idempotent, it should not run when etc hasn't
+
# changed.
+
if [[ ! $IN_NIXOS_SYSTEMD_STAGE1 ]] && [[ "${config.system.build.etc}/etc" != "$(readlink -f /run/current-system/etc)" ]]; then
echo "remounting /etc..."
tmpMetadataMount=$(mktemp --directory)
+10 -4
nixos/tests/activation/etc-overlay-immutable.nix
···
};
testScript = ''
-
machine.succeed("findmnt --kernel --type overlay /etc")
-
machine.fail("stat /etc/newgen")
+
with subtest("/etc is mounted as an overlay"):
+
machine.succeed("findmnt --kernel --type overlay /etc")
-
machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
+
with subtest("switching to the same generation"):
+
machine.succeed("/run/current-system/bin/switch-to-configuration test")
-
assert machine.succeed("cat /etc/newgen") == "newgen"
+
with subtest("switching to a new generation"):
+
machine.fail("stat /etc/newgen")
+
+
machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
+
+
assert machine.succeed("cat /etc/newgen") == "newgen"
'';
}
+12 -6
nixos/tests/activation/etc-overlay-mutable.nix
···
};
testScript = ''
-
machine.succeed("findmnt --kernel --type overlay /etc")
-
machine.fail("stat /etc/newgen")
-
machine.succeed("echo -n 'mutable' > /etc/mutable")
+
with subtest("/etc is mounted as an overlay"):
+
machine.succeed("findmnt --kernel --type overlay /etc")
-
machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
+
with subtest("switching to the same generation"):
+
machine.succeed("/run/current-system/bin/switch-to-configuration test")
-
assert machine.succeed("cat /etc/newgen") == "newgen"
-
assert machine.succeed("cat /etc/mutable") == "mutable"
+
with subtest("switching to a new generation"):
+
machine.fail("stat /etc/newgen")
+
machine.succeed("echo -n 'mutable' > /etc/mutable")
+
+
machine.succeed("/run/current-system/specialisation/new-generation/bin/switch-to-configuration switch")
+
+
assert machine.succeed("cat /etc/newgen") == "newgen"
+
assert machine.succeed("cat /etc/mutable") == "mutable"
'';
}