forked from mirrors/nixpkgs
d67caf3c89
When initializing a system (e.g. first boot / livecd) we have no good reference source for time. systemd-timesyncd however would revert back to its configured fallback time (in our case 01.01.1980). Since we probably don't want to hardcode a specific date as fallback we are now using the current system time (wherever that might have come from) to initialize the reference clock file. The only systems that might be remotely affected by this change are machines that have highly unreliable RTCs or those where the battery that backs the RTC is running empty. Historically these systems always had a tough time with anything time related and likely required manual intervention. For stateless systems (those that wipe / between reboots or our installer CDs) this has the consequence that time will always be reset to whatever the system comes up with on boot. This is likely the correct time coming from an RTC. No harm done here the situation is likely unchanged for them. For stateful systems (those that retain the / partition across reboots) there shouldn't be a change at all. They'll provide an initial clock value once on their lifetime (during first boot / after installation). From then onwards systemd-timesyncd will update the file with the newer fallback time (that will be picked up on the next boot).
87 lines
2.8 KiB
Nix
87 lines
2.8 KiB
Nix
{ config, lib, ... }:
|
|
|
|
with lib;
|
|
|
|
{
|
|
|
|
options = {
|
|
|
|
services.timesyncd = {
|
|
enable = mkOption {
|
|
default = !config.boot.isContainer;
|
|
defaultText = literalExpression "!config.boot.isContainer";
|
|
type = types.bool;
|
|
description = ''
|
|
Enables the systemd NTP client daemon.
|
|
'';
|
|
};
|
|
servers = mkOption {
|
|
default = config.networking.timeServers;
|
|
defaultText = literalExpression "config.networking.timeServers";
|
|
type = types.listOf types.str;
|
|
description = ''
|
|
The set of NTP servers from which to synchronise.
|
|
'';
|
|
};
|
|
extraConfig = mkOption {
|
|
default = "";
|
|
type = types.lines;
|
|
example = ''
|
|
PollIntervalMaxSec=180
|
|
'';
|
|
description = ''
|
|
Extra config options for systemd-timesyncd. See
|
|
<link xlink:href="https://www.freedesktop.org/software/systemd/man/timesyncd.conf.html">
|
|
timesyncd.conf(5)</link> for available options.
|
|
'';
|
|
};
|
|
};
|
|
};
|
|
|
|
config = mkIf config.services.timesyncd.enable {
|
|
|
|
systemd.additionalUpstreamSystemUnits = [ "systemd-timesyncd.service" ];
|
|
|
|
systemd.services.systemd-timesyncd = {
|
|
wantedBy = [ "sysinit.target" ];
|
|
aliases = [ "dbus-org.freedesktop.timesync1.service" ];
|
|
restartTriggers = [ config.environment.etc."systemd/timesyncd.conf".source ];
|
|
};
|
|
|
|
environment.etc."systemd/timesyncd.conf".text = ''
|
|
[Time]
|
|
NTP=${concatStringsSep " " config.services.timesyncd.servers}
|
|
${config.services.timesyncd.extraConfig}
|
|
'';
|
|
|
|
users.users.systemd-timesync = {
|
|
uid = config.ids.uids.systemd-timesync;
|
|
group = "systemd-timesync";
|
|
};
|
|
users.groups.systemd-timesync.gid = config.ids.gids.systemd-timesync;
|
|
|
|
system.activationScripts.systemd-timesyncd-migration =
|
|
# 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
|
|
mkIf (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
|
|
'';
|
|
system.activationScripts.systemd-timesyncd-init-clock =
|
|
# 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
|
|
fi
|
|
'';
|
|
};
|
|
|
|
}
|