nixos/zfs: Refactor auto-snapshots and make them persistent
If you power off your machine frequently, you could miss the execution of some snapshots. This is more troublesome the more infrequently the snapshots are triggered. For example, monthly snapshots only execute at exactly midnight on the first day of the month. If you only have your machine powered on at that time with probability 50%, then half the snapshots won't be triggered. This means that if you wanted to keep 3 monthly snapshots, then instead of keeping 3 months' worth of snapshotted data as you expected, you would end up with snapshots spanning back 6 months. Adding the "Persistent = yes" option to auto-snapshot timer units makes a missed snapshot execute when booting up the machine.
This commit is contained in:
parent
b0a51de6c1
commit
6197fdc02d
@ -46,6 +46,8 @@ let
|
||||
|
||||
dataPools = unique (filter (pool: !(elem pool rootPools)) allPools);
|
||||
|
||||
snapshotNames = [ "frequent" "hourly" "daily" "weekly" "monthly" ];
|
||||
|
||||
in
|
||||
|
||||
{
|
||||
@ -306,60 +308,41 @@ in
|
||||
})
|
||||
|
||||
(mkIf enableAutoSnapshots {
|
||||
systemd.services."zfs-snapshot-frequent" = {
|
||||
description = "ZFS auto-snapshotting every 15 mins";
|
||||
after = [ "zfs-import.target" ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} frequent ${toString cfgSnapshots.frequent}";
|
||||
};
|
||||
restartIfChanged = false;
|
||||
startAt = "*:15,30,45";
|
||||
};
|
||||
systemd.services = let
|
||||
descr = name: if name == "frequent" then "15 mins"
|
||||
else if name == "hourly" then "hour"
|
||||
else if name == "daily" then "day"
|
||||
else if name == "weekly" then "week"
|
||||
else if name == "monthly" then "month"
|
||||
else throw "unknown snapshot name";
|
||||
numSnapshots = name: builtins.getAttr name cfgSnapshots;
|
||||
in builtins.listToAttrs (map (snapName:
|
||||
{
|
||||
name = "zfs-snapshot-${snapName}";
|
||||
value = {
|
||||
description = "ZFS auto-snapshotting every ${descr snapName}";
|
||||
after = [ "zfs-import.target" ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} ${snapName} ${toString (numSnapshots snapName)}";
|
||||
};
|
||||
restartIfChanged = false;
|
||||
};
|
||||
}) snapshotNames);
|
||||
|
||||
systemd.services."zfs-snapshot-hourly" = {
|
||||
description = "ZFS auto-snapshotting every hour";
|
||||
after = [ "zfs-import.target" ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} hourly ${toString cfgSnapshots.hourly}";
|
||||
};
|
||||
restartIfChanged = false;
|
||||
startAt = "hourly";
|
||||
};
|
||||
|
||||
systemd.services."zfs-snapshot-daily" = {
|
||||
description = "ZFS auto-snapshotting every day";
|
||||
after = [ "zfs-import.target" ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} daily ${toString cfgSnapshots.daily}";
|
||||
};
|
||||
restartIfChanged = false;
|
||||
startAt = "daily";
|
||||
};
|
||||
|
||||
systemd.services."zfs-snapshot-weekly" = {
|
||||
description = "ZFS auto-snapshotting every week";
|
||||
after = [ "zfs-import.target" ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} weekly ${toString cfgSnapshots.weekly}";
|
||||
};
|
||||
restartIfChanged = false;
|
||||
startAt = "weekly";
|
||||
};
|
||||
|
||||
systemd.services."zfs-snapshot-monthly" = {
|
||||
description = "ZFS auto-snapshotting every month";
|
||||
after = [ "zfs-import.target" ];
|
||||
serviceConfig = {
|
||||
Type = "oneshot";
|
||||
ExecStart = "${zfsAutoSnap} ${cfgSnapFlags} monthly ${toString cfgSnapshots.monthly}";
|
||||
};
|
||||
restartIfChanged = false;
|
||||
startAt = "monthly";
|
||||
};
|
||||
systemd.timers = let
|
||||
timer = name: if name == "frequent" then "*:15,30,45" else name;
|
||||
in builtins.listToAttrs (map (snapName:
|
||||
{
|
||||
name = "zfs-snapshot-${snapName}";
|
||||
value = {
|
||||
wantedBy = [ "timers.target" ];
|
||||
timerConfig = {
|
||||
OnCalendar = timer snapName;
|
||||
Persistent = "yes";
|
||||
};
|
||||
};
|
||||
}) snapshotNames);
|
||||
})
|
||||
];
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user