From 7ccd3bd8f43453c7b60cbc00a29e4fa3d40204da Mon Sep 17 00:00:00 2001 From: nikstur Date: Wed, 8 Oct 2025 14:43:19 +0200 Subject: [PATCH 1/2] nixos/timesyncd: remove unnecessary workaround This workardoung is now unnecessary because systemd and systemd-timesyncd will never actually revert to a time lower than the current system time. It will only *advance* the system time to the EPOCH if the system time is lower. This also makes systemd-timesyncd bashless as we remove the preStart script for any NixOS version newer than 19.09. --- nixos/modules/system/boot/timesyncd.nix | 30 ++++++++----------------- 1 file changed, 9 insertions(+), 21 deletions(-) diff --git a/nixos/modules/system/boot/timesyncd.nix b/nixos/modules/system/boot/timesyncd.nix index eed83af5715f..71f49a675b12 100644 --- a/nixos/modules/system/boot/timesyncd.nix +++ b/nixos/modules/system/boot/timesyncd.nix @@ -75,28 +75,16 @@ in # NSS module path so that systemd-timesyncd keeps using other NSS modules that are configured in the system. environment.LD_LIBRARY_PATH = config.system.nssModules.path; - preStart = ( - # Ensure that we have some stored time to prevent - # systemd-timesyncd to resort back to the fallback time. If - # the file doesn't exist we assume that our current system - # clock is good enough to provide an initial value. - '' - if ! [ -f /var/lib/systemd/timesync/clock ]; then - test -d /var/lib/systemd/timesync || mkdir -p /var/lib/systemd/timesync - touch /var/lib/systemd/timesync/clock + preStart = + # workaround an issue of systemd-timesyncd not starting due to upstream systemd reverting their dynamic users changes + # - https://github.com/NixOS/nixpkgs/pull/61321#issuecomment-492423742 + # - https://github.com/systemd/systemd/issues/12131 + lib.optionalString (versionOlder config.system.stateVersion "19.09") '' + if [ -L /var/lib/systemd/timesync ]; then + rm /var/lib/systemd/timesync + mv /var/lib/private/systemd/timesync /var/lib/systemd/timesync fi - '' - + - # workaround an issue of systemd-timesyncd not starting due to upstream systemd reverting their dynamic users changes - # - https://github.com/NixOS/nixpkgs/pull/61321#issuecomment-492423742 - # - https://github.com/systemd/systemd/issues/12131 - (lib.optionalString (versionOlder config.system.stateVersion "19.09") '' - if [ -L /var/lib/systemd/timesync ]; then - rm /var/lib/systemd/timesync - mv /var/lib/private/systemd/timesync /var/lib/systemd/timesync - fi - '') - ); + ''; }; environment.etc."systemd/timesyncd.conf".text = '' From ccf0b1426fcd5263cf01983841a76785ba514a2f Mon Sep 17 00:00:00 2001 From: nikstur Date: Wed, 8 Oct 2025 14:46:32 +0200 Subject: [PATCH 2/2] nixos/timesyncd: remove migration path dating back to 19.09 Also remove the test that only tested this migration and nothing else about systemd-timesyncd. --- nixos/modules/system/boot/timesyncd.nix | 11 ---- nixos/tests/all-tests.nix | 1 - nixos/tests/systemd-timesyncd.nix | 70 ------------------------- 3 files changed, 82 deletions(-) delete mode 100644 nixos/tests/systemd-timesyncd.nix diff --git a/nixos/modules/system/boot/timesyncd.nix b/nixos/modules/system/boot/timesyncd.nix index 71f49a675b12..b3913efc5cc1 100644 --- a/nixos/modules/system/boot/timesyncd.nix +++ b/nixos/modules/system/boot/timesyncd.nix @@ -74,17 +74,6 @@ in # This means that systemd-timesyncd needs to have NSS modules path in LD_LIBRARY_PATH. When systemd-resolved is disabled we still need to set # NSS module path so that systemd-timesyncd keeps using other NSS modules that are configured in the system. environment.LD_LIBRARY_PATH = config.system.nssModules.path; - - preStart = - # workaround an issue of systemd-timesyncd not starting due to upstream systemd reverting their dynamic users changes - # - https://github.com/NixOS/nixpkgs/pull/61321#issuecomment-492423742 - # - https://github.com/systemd/systemd/issues/12131 - lib.optionalString (versionOlder config.system.stateVersion "19.09") '' - if [ -L /var/lib/systemd/timesync ]; then - rm /var/lib/systemd/timesync - mv /var/lib/private/systemd/timesync /var/lib/systemd/timesync - fi - ''; }; environment.etc."systemd/timesyncd.conf".text = '' diff --git a/nixos/tests/all-tests.nix b/nixos/tests/all-tests.nix index a6c3ff57d737..de6cf5c0416c 100644 --- a/nixos/tests/all-tests.nix +++ b/nixos/tests/all-tests.nix @@ -1482,7 +1482,6 @@ in systemd-sysusers-immutable = runTest ./systemd-sysusers-immutable.nix; systemd-sysusers-mutable = runTest ./systemd-sysusers-mutable.nix; systemd-sysusers-password-option-override-ordering = runTest ./systemd-sysusers-password-option-override-ordering.nix; - systemd-timesyncd = runTest ./systemd-timesyncd.nix; systemd-timesyncd-nscd-dnssec = runTest ./systemd-timesyncd-nscd-dnssec.nix; systemd-user-linger = runTest ./systemd-user-linger.nix; systemd-user-tmpfiles-rules = runTest ./systemd-user-tmpfiles-rules.nix; diff --git a/nixos/tests/systemd-timesyncd.nix b/nixos/tests/systemd-timesyncd.nix deleted file mode 100644 index 83a3d820c50b..000000000000 --- a/nixos/tests/systemd-timesyncd.nix +++ /dev/null @@ -1,70 +0,0 @@ -# Regression test for systemd-timesync having moved the state directory without -# upstream providing a migration path. https://github.com/systemd/systemd/issues/12131 - -let - common = - { lib, ... }: - { - # override the `false` value from the qemu-vm base profile - services.timesyncd.enable = lib.mkForce true; - }; - mkVM = conf: { - imports = [ - conf - common - ]; - }; -in -{ - name = "systemd-timesyncd"; - nodes = { - current = mkVM { }; - pre1909 = mkVM ( - { lib, ... }: - { - # create the path that should be migrated by our activation script when - # upgrading to a newer nixos version - system.stateVersion = "19.03"; - systemd.services.old-timesync-state-dir = { - requiredBy = [ "sysinit.target" ]; - before = [ "systemd-timesyncd.service" ]; - after = [ "local-fs.target" ]; - unitConfig.DefaultDependencies = false; - serviceConfig.Type = "oneshot"; - script = '' - rm -rf /var/lib/systemd/timesync - mkdir -p /var/lib/systemd /var/lib/private/systemd/timesync - ln -s /var/lib/private/systemd/timesync /var/lib/systemd/timesync - chown systemd-timesync: /var/lib/private/systemd/timesync - ''; - }; - } - ); - }; - - testScript = '' - start_all() - current.succeed("systemctl status systemd-timesyncd.service") - # on a new install with a recent systemd there should not be any - # leftovers from the dynamic user mess - current.succeed("test -e /var/lib/systemd/timesync") - current.succeed("test ! -L /var/lib/systemd/timesync") - - # timesyncd should be running on the upgrading system since we fixed the - # file bits in the activation script - pre1909.succeed("systemctl status systemd-timesyncd.service") - - # the path should be gone after the migration - pre1909.succeed("test ! -e /var/lib/private/systemd/timesync") - - # and the new path should no longer be a symlink - pre1909.succeed("test -e /var/lib/systemd/timesync") - pre1909.succeed("test ! -L /var/lib/systemd/timesync") - - # after a restart things should still work and not fail in the activation - # scripts and cause the boot to fail.. - pre1909.shutdown() - pre1909.start() - pre1909.succeed("systemctl status systemd-timesyncd.service") - ''; -}