diff --git a/nixos/modules/tasks/filesystems/zfs.nix b/nixos/modules/tasks/filesystems/zfs.nix
index 1ac89c4c255..71054ff238e 100644
--- a/nixos/modules/tasks/filesystems/zfs.nix
+++ b/nixos/modules/tasks/filesystems/zfs.nix
@@ -12,6 +12,7 @@ let
cfgSpl = config.boot.spl;
cfgZfs = config.boot.zfs;
cfgSnapshots = config.services.zfs.autoSnapshot;
+ cfgSnapFlags = cfgSnapshots.flags;
inInitrd = any (fs: fs == "zfs") config.boot.initrd.supportedFilesystems;
inSystem = any (fs: fs == "zfs") config.boot.supportedFilesystems;
@@ -137,6 +138,25 @@ in
'';
};
+ flags = mkOption {
+ default = "-k -p";
+ example = "-k -p --utc";
+ type = types.str;
+ description = ''
+ Flags to pass to the zfs-auto-snapshot command.
+
+ Run zfs-auto-snapshot (without any arguments) to
+ see available flags.
+
+ If it's not too inconvenient for snapshots to have timestamps in UTC,
+ it is suggested that you append --utc to the list
+ of default options (see example).
+
+ Otherwise, snapshot names can cause name conflicts or apparent time
+ reversals due to daylight savings, timezone or other date/time changes.
+ '';
+ };
+
frequent = mkOption {
default = 4;
type = types.int;
@@ -232,7 +252,9 @@ in
environment.etc."zfs/zed.d".source = "${zfsUserPkg}/etc/zfs/zed.d/*";
system.fsPackages = [ zfsUserPkg ]; # XXX: needed? zfs doesn't have (need) a fsck
- environment.systemPackages = [ zfsUserPkg ];
+ environment.systemPackages = [ zfsUserPkg ]
+ ++ optional enableAutoSnapshots autosnapPkg; # so the user can run the command to see flags
+
services.udev.packages = [ zfsUserPkg ]; # to hook zvol naming, etc.
systemd.packages = [ zfsUserPkg ];
@@ -289,7 +311,7 @@ in
after = [ "zfs-import.target" ];
serviceConfig = {
Type = "oneshot";
- ExecStart = "${zfsAutoSnap} frequent ${toString cfgSnapshots.frequent}";
+ ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} frequent ${toString cfgSnapshots.frequent}";
};
restartIfChanged = false;
startAt = "*:15,30,45";
@@ -300,7 +322,7 @@ in
after = [ "zfs-import.target" ];
serviceConfig = {
Type = "oneshot";
- ExecStart = "${zfsAutoSnap} hourly ${toString cfgSnapshots.hourly}";
+ ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} hourly ${toString cfgSnapshots.hourly}";
};
restartIfChanged = false;
startAt = "hourly";
@@ -311,7 +333,7 @@ in
after = [ "zfs-import.target" ];
serviceConfig = {
Type = "oneshot";
- ExecStart = "${zfsAutoSnap} daily ${toString cfgSnapshots.daily}";
+ ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} daily ${toString cfgSnapshots.daily}";
};
restartIfChanged = false;
startAt = "daily";
@@ -322,7 +344,7 @@ in
after = [ "zfs-import.target" ];
serviceConfig = {
Type = "oneshot";
- ExecStart = "${zfsAutoSnap} weekly ${toString cfgSnapshots.weekly}";
+ ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} weekly ${toString cfgSnapshots.weekly}";
};
restartIfChanged = false;
startAt = "weekly";
@@ -333,7 +355,7 @@ in
after = [ "zfs-import.target" ];
serviceConfig = {
Type = "oneshot";
- ExecStart = "${zfsAutoSnap} monthly ${toString cfgSnapshots.monthly}";
+ ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} monthly ${toString cfgSnapshots.monthly}";
};
restartIfChanged = false;
startAt = "monthly";