Add first draft of ZFS auto-snaptshot code
This commit is contained in:
parent
4caf9672c5
commit
79d5469aa5
61
content/snippets/zfs-automatic-snapshots.md
Normal file
61
content/snippets/zfs-automatic-snapshots.md
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
---
|
||||||
|
title: "ZFS Automatic Snapshotting"
|
||||||
|
date: 2022-10-31T17:56:35Z
|
||||||
|
tags: ["archlinux", "linux", "zfs"]
|
||||||
|
draft: true
|
||||||
|
icon: backup
|
||||||
|
---
|
||||||
|
|
||||||
|
## Goal
|
||||||
|
|
||||||
|
## Solution
|
||||||
|
### Creating snapshots
|
||||||
|
{{< codegroup >}}
|
||||||
|
Systemd-timer
|
||||||
|
```
|
||||||
|
[Unit]
|
||||||
|
Description=Create a daily ZFS snapshot for %I
|
||||||
|
|
||||||
|
[Timer]
|
||||||
|
OnCalendar=daily
|
||||||
|
Persistent=true
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=timers.target
|
||||||
|
```
|
||||||
|
Systemd-service
|
||||||
|
```
|
||||||
|
[Unit]
|
||||||
|
Description=Create a ZFS snapshot for %I
|
||||||
|
DefaultDependencies=no
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=oneshot
|
||||||
|
RemainAfterExit=yes
|
||||||
|
ExecStart=/usr/bin/bash -c '/usr/bin/zfs snapshot "%I@daily-$(date "+%%Y-%%m-%%d")"'
|
||||||
|
```
|
||||||
|
{{< /codegroup >}}
|
||||||
|
|
||||||
|
### Cleaning up snapshots
|
||||||
|
Get all older snapshots
|
||||||
|
{{< codegroup >}}
|
||||||
|
bash
|
||||||
|
```
|
||||||
|
zfs list -t snapshot -o name | \
|
||||||
|
perl -e '
|
||||||
|
my $one_week_ago = `date --date "7 days ago" "+%s"`;
|
||||||
|
my %snapshots = ();
|
||||||
|
|
||||||
|
for (<>) {
|
||||||
|
if (my ($dataset, $snapshot, $date) = /([\w\/]+)@(daily-(\d+\-\d+\-\d+))/) {
|
||||||
|
if (`date --date "$date" "+%s"` < $one_week_ago) {
|
||||||
|
push(@{$snapshots{$dataset}}, $snapshot);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
while(my ($key, $value) = each %snapshots) {
|
||||||
|
print "$key@", join(",", @{$value}), "\n";
|
||||||
|
}'
|
||||||
|
```
|
||||||
|
{{< /codegroup >}}
|
||||||
Loading…
Reference in New Issue
Block a user