Discussion:
Nur neuesten Snapshot finden und auf 2. Platte kopieren?
(zu alt für eine Antwort)
Michael Hagedorn
2019-09-27 14:25:25 UTC
Permalink
Hi.
Ich habe einen kleinen Server, der mit ZFS-Dateisystemen ausgestattet
ist. Dazu nutze ich zfs-auto-snapshot, um regelmäßig Snapshots erstellen
zu lassen. In dem Server hängt eine zweite Platte, die als Backup
gedacht ist. Dorthin würde ich gerne per Script die neuesten Snapshots
automatisch kopieren lassen (den Rest regelt ZFS dann selbst).

Meine Idee dazu war:

zfs list -r -t snapshot -o name

liefert eine Liste wie diese:

rpool/vm-901-disk-***@zfs-auto-snap_daily-2019-09-25-0425
rpool/vm-901-disk-***@zfs-auto-snap_daily-2019-09-26-0425
rpool/vm-901-disk-***@zfs-auto-snap_daily-2019-09-27-0425
.
rpool/vm-902-disk-***@zfs-auto-snap_daily-2019-09-25-0425
rpool/vm-902-disk-***@zfs-auto-snap_daily-2019-09-26-0425
rpool/vm-902-disk-***@zfs-auto-snap_daily-2019-09-27-0425

Da wurde also täglich ein Snapshot von den hier dargestellten zwei virt
HDDs erstellt. Ich benötige aber für das Senden zum zweiten ZFS-Pool
*nur* den Namen des neuesten; in diesem Fall also den vom 27.09.
Eigentlich hatte ich gehofft, dass das mit zfs-Bordmitteln geht -- finde
aber bisher nichts.

Eine Alternative mit awk, die hier aus der Gruppe stammt, war:
zfs list -t snapshot -o name |
awk -F- '{if(m[$3]<$0)m[$3]=$0;}
END {for(x in m){print x " " m[x];}}'

aber das funktioniert auch nicht, da es nur von der letzten Datei die
letzte Fassung ausspuckt. Hat jemand eine gute Idee, wie ich von allen
VMs jeweils nur den letzten Snapshot ausspucken lassen kann? Danach
ginge es dann weiter mit:
zfs send -Rv
rpool/data/vm-902-disk-***@zfs-auto-snap_daily-2019-neuester-Zeitstempel|
zfs receive -Fdus tank
... das funktioniert einwandfrei.

Danke für einen guten Tipp.
Michael
Ulli Horlacher
2019-09-27 18:55:24 UTC
Permalink
Post by Michael Hagedorn
zfs list -r -t snapshot -o name
.
Da wurde also täglich ein Snapshot von den hier dargestellten zwei virt
HDDs erstellt. Ich benötige aber für das Senden zum zweiten ZFS-Pool
*nur* den Namen des neuesten; in diesem Fall also den vom 27.09.
Eigentlich hatte ich gehofft, dass das mit zfs-Bordmitteln geht -- finde
aber bisher nichts.
letzte Fassung ausspuckt. Hat jemand eine gute Idee, wie ich von allen
VMs jeweils nur den letzten Snapshot ausspucken lassen kann? Danach
zfs send -Rv
zfs receive -Fdus tank
... das funktioniert einwandfrei.
Brauchst du also NUR
rpool/vm-902-disk-***@zfs-auto-snap_daily-2019-09-27-0425
?
Das ist doch trivial:

zfs list -r -t snapshot -o name | tail -1
--
Ullrich Horlacher Server und Virtualisierung
Rechenzentrum TIK
Universitaet Stuttgart E-Mail: ***@tik.uni-stuttgart.de
Allmandring 30a Tel: ++49-711-68565868
70569 Stuttgart (Germany) WWW: http://www.tik.uni-stuttgart.de/
Michael Hagedorn
2019-09-28 10:21:57 UTC
Permalink
Hi
Post by Ulli Horlacher
Brauchst du also NUR
Das wäre ja zu einfach -- aber ich brauche das natürlich von JEDER VM ...

Ich denke übrigens, dass ich mit zfs-backup von hier
https://github.com/adaugherity/zfs-backup
viel einfacher ans Ziel komme ...

Michael
Rupert Haselbeck
2019-09-28 11:50:07 UTC
Permalink
Post by Michael Hagedorn
Hi
Post by Ulli Horlacher
Brauchst du also NUR
Das wäre ja zu einfach -- aber ich brauche das natürlich von JEDER VM ...
Dann macht man halt sowas (ungeprüft):

| for i in vm-902-disk-0 vm-901-disk-1
| do
| zfs list -r -t snapshot -o name | grep "${i}" | tail -1
| done
Post by Michael Hagedorn
Ich denke übrigens, dass ich mit zfs-backup von hier
https://github.com/adaugherity/zfs-backup
viel einfacher ans Ziel komme ...
Tja. Die Qual der Wahl...

MfG
Rupert
Urs Janßen
2019-09-28 14:47:09 UTC
Permalink
Post by Michael Hagedorn
Das wäre ja zu einfach -- aber ich brauche das natürlich von JEDER VM ...
untested, kein zfs hier
zfs list -r -t snapshot -o name |\
awk -F@ '/rpool/{h[$1]=$2}END{for(i in h)print i":"h[i]}'

evtl. nooch mit sort in der pipe

urs
--
1 A$="HIKAAAIMAONMMIIMBKNAKJBLINBBNAINBEADKJMAINBFADFIGAAAAAKNBJNAINBJNABGA"
2 A$=A$+"CBGACKAAALJEKMANBACNBACINCBNAINCANAINBCNAKCAGMKNAPNMIMAAKNAOGKJBLI"
3 A$=A$+"NBBNAFIEMDBOKKAKLKMKPKBKPKMKLKAKAKAKAKAKAKAKAAA":FORI=1TO91
4 POKE49151+I,(ASC(MID$(A$,2*I-1,1))*16+ASC(MID$(A$,2*I,1))-1105):NEXT:SYS49152
Michael Hagedorn
2019-09-29 06:30:11 UTC
Permalink
Super, danke! -- der Befehl spuckt fast das richtige aus. Es tauchen
noch ein paar Snapshots zuviel auf:

rpool/data:zfs-auto-snap_daily-2019-09-29-0425
rpool/ROOT/pve-1:zfs-auto-snap_daily-2019-09-29-0425
rpool/ROOT:zfs-auto-snap_daily-2019-09-29-0425
rpool:zfs-auto-snap_daily-2019-09-29-0425

Kann man die noch herausfiltern?
Schönen Gruß,
Michael
Urs Janßen
2019-09-29 08:52:40 UTC
Permalink
^^^^^pattern
Post by Michael Hagedorn
rpool/data:zfs-auto-snap_daily-2019-09-29-0425
rpool/ROOT/pve-1:zfs-auto-snap_daily-2019-09-29-0425
rpool/ROOT:zfs-auto-snap_daily-2019-09-29-0425
rpool:zfs-auto-snap_daily-2019-09-29-0425
Kann man die noch herausfiltern?
pattern anpassen?
awk -F@ '/rpool\/vm/{h[$1]=$2}END{for(i in h)print i":"h[i]}'
Michael Hagedorn
2019-09-29 10:39:10 UTC
Permalink
Hi.
Post by Urs Janßen
pattern anpassen?
Ok!

So klappt's (ist vielleicht nicht super elegant -- aber "works for me"):
Danke!



#!/bin/bash

for i in $(zfs list -r -t snapshot -o name | awk -F@
'/vm-/{h[$1]=$2}END{for(i in h)print i"@"h[i]}'|sort |grep rpool );
do
echo $i
zfs send -Rv $i | zfs receive -Fdus tank
done
Ulli Horlacher
2019-09-29 08:53:58 UTC
Permalink
Post by Michael Hagedorn
Hi
Post by Ulli Horlacher
Brauchst du also NUR
Das wäre ja zu einfach -- aber ich brauche das natürlich von JEDER VM ...
Also so was?

***@juhu:/tmp: zz
rpool/vm-901-disk-***@zfs-auto-snap_daily-2019-09-25-0425
rpool/vm-901-disk-***@zfs-auto-snap_daily-2019-09-26-0425
rpool/vm-901-disk-***@zfs-auto-snap_daily-2019-09-27-0425
.
rpool/vm-902-disk-***@zfs-auto-snap_daily-2019-09-25-0425
rpool/vm-902-disk-***@zfs-auto-snap_daily-2019-09-26-0425
rpool/vm-902-disk-***@zfs-auto-snap_daily-2019-09-27-0425

***@juhu:/tmp: zz | perl lastss.pl
rpool/vm-901-disk-***@zfs-auto-snap_daily-2019-09-27-0425
rpool/vm-902-disk-***@zfs-auto-snap_daily-2019-09-27-0425

***@juhu:/tmp: cat lastss.pl
#!/usr/bin/perl -w

$last = 0;
while (<>) {
if (/zfs-auto-snap_daily-(.+)/) {
$last = $1 if $1 gt $last;
push @ss,$_;
}
}
print grep /$last/,@ss if $last;
--
Ullrich Horlacher Server und Virtualisierung
Rechenzentrum TIK
Universitaet Stuttgart E-Mail: ***@tik.uni-stuttgart.de
Allmandring 30a Tel: ++49-711-68565868
70569 Stuttgart (Germany) WWW: http://www.tik.uni-stuttgart.de/
Michael Hagedorn
2019-09-29 10:26:10 UTC
Permalink
Hi
Post by Ulli Horlacher
Also so was?
Genau so! :)
Mit perl geht's natürlich auch. Jetzt hab' ich die Qual der Wahl

Michael
Jan Novak
2019-09-30 07:05:24 UTC
Permalink
Post by Michael Hagedorn
Hi.
Ich habe einen kleinen Server, der mit ZFS-Dateisystemen ausgestattet
ist. Dazu nutze ich zfs-auto-snapshot, um regelmäßig Snapshots erstellen
zu lassen. In dem Server hängt eine zweite Platte, die als Backup
gedacht ist. Dorthin würde ich gerne per Script die neuesten Snapshots
automatisch kopieren lassen (den Rest regelt ZFS dann selbst).
Ichnutze auf beiden Seiten (falls es über mehrere Server geht) sanoid -
das macht "alles"

Jan

Loading...