ZFS Toolbox

 

Auf dieser Seite findest du nützliche Scripte, Tools und Tipps rund um ZFS.

01| ZFS holds

Mit Hilfe von ZFS-Holds können Snapshots vor versehentlichen Löschen geschützt werden. 

Alle Snapshots mit gestzten holds in einem ZFS-Pool ermitteln:

zfs get -Ht snapshot userrefs | grep -v $'\t'0 | cut -d $'\t' -f 1 | tr '\n' '\0' | xargs -0 zfs holds | grep <POOL_NAME> 

Bei allen Snapshots im ZFS-Pool die Holds entfernen:

for i in $(zfs get -Ht snapshot userrefs | grep -v $'\t'0 | cut -d $'\t' -f 1 | tr '\n' '\0' 
         | xargs -0 zfs holds | grep <POOL_NAME> | awk '{ print $1"|"$2 }'); do 
    zfs release ${i#*|} ${i%|*}; 
done

02| Clone (encrypted) Datasets inkl. aller Snaphots

Mit zfs send un zfs receive können (verschlüsselte) Datasets inklusive aller Snapshots per SSH über das Netzwerk übertragen werden:

Hinweis: Im folgenden Script wird davon ausgegangen, dass man sich auf dem Ziel-Rechner befindet der die geklonten Daten empfangen soll. 
Die Umgebungsvariablen am Anfang des Scripts müssen entsprechend angepasst werden.

SRC_HOST=<SRC_HOST>
SRC_POOL=<SRC_POOL>
SRC_DATASET=<SRC_DATASET>
DST_POOL=$SRC_POOL

# zpool auf dem Zielsystem anlegen, z.B. als single disk:
zpool create -o ashift=12  $DST_PPOL <DEV> 

# zpool Parameter abgleichen:
diff <(ssh $SRC_HOST "zpool get all $SRC_POOL" | awk '{ printf "%-20s %-40s %s\n",  $1, $2, $3 }') \
      <(zpool get all $DST_POOL| awk '{ printf "%-20s %-40s %s\n",  $1, $2, $3 }')

# Snapshot für die Migration auf dem Quellsystem erstellen:
ssh $SRC_HOST zfs snapshot -r $SRC_POOL/$SRC_DATASET@migration

# Snapshot per SSH auf das lokale System übertragen:
# Send-Parameter:
#   -R  Generate a replication stream package, which will replicate the specified file system, and all 
#       descendent file systems, up to the named snapshot. When received, all properties, snapshots, 
#       descendent file systems, and clones are preserved.
#   -w For encrypted datasets, send data exactly as it exists on disk. This allows backups to be taken 
#       even if encryption keys are not currently loaded. The backup may then be received on an untrusted 
#       machine since that machine will not have the encryption keys to read the protected data or alter 
#       it without being detected. Upon being received, the dataset will have the same encryption keys 
#       as it did on the send side, although the keylocation property will be defaulted to prompt if not 
#       otherwise provided. For unencrypted datasets, this flag will be equivalent to -Lec. Note that if 
#       you do not use this flag for sending encrypted datasets, data will be sent unencrypted and may 
#       be re-encrypted with a different encryption key on the receiving system, which will disable the 
#       ability to do a raw send to that system for incrementals.
#   -h Generate a stream package that includes any snapshot holds (created with the zfs hold command), 
#       and indicating to zfs receive that the holds be applied to the dataset on the receiving system.
# Receive-Parameter:
#   -d Discard the first element of the sent snapshot's file system name, using the remaining elements to 
#       determine the name of the target file system for the new snapshot 
#       
ssh $SRC_HOST "zfs send -Rwh $SRC_POOL/$SRC_DATASET@migration" | zfs receive -d $DST_POOL

# Holds abgleichen
diff <(ssh $SRC_HOST "zfs get -Ht snapshot userrefs | grep -v $'\t'0 | \
     cut -d $'\t' -f 1 | tr '\n' '\0' | xargs -0 zfs holds" | \
     grep $SRC_POOL | awk '{ printf "%-30s %s", $2 ,$1 }') \
     <(zfs get -Ht snapshot userrefs | grep -v $'\t'0 | cut -d $'\t' -f 1 | tr '\n' '\0' | \
     xargs -0 zfs holds |  grep $DST_POOL | awk '{ printf "%-30s %s", $2 ,$1 }')

# Parameter der Datasets abgleichen Dataset
diff <(ssh $SRC_HOST "zfs get all $SRC_POOL/$SRC_DATASET") \
     <(zfs get all $DST_POOL/$SRC_DATASET)

# Migrationssnapshot entfernen
zfs destroy -r $DST_POOL/$SRC_DATASET@migration
ssh $SRC_HOST "zfs destroy -r $SRC_POOL/$SRC_DATASET@migration"

03| Ubuntu Snapshot Cleanup

Ubuntu nutzt tsysctl um beispielweise bei Systemupdates automatisch einen Snapshot zu erstellen. Wird der Speicherplatz knapp, müssen die Snapshots aufgeräumt werden. Mit dem folgenden Script können die zsysctl-Snapshots aufgeräumt werden:    

# Set Pattern used to select snapshots to be deleted
PATTERN=2023-09

# ausgewählte zsysctl system snapshots löschen
for i in $(zsysctl show | grep -e "- rpool/USERDATA/root_.*@autozsys.*$PATTERN" | awk ' { print $2 } '); do 
    i=${i#*@autozsys_}
    zsysctl state remove $i -s;
    zsysctl state remove $i -u root
    zsysctl state remove $i -u stephan
done

# ausgewählte zsysctl user snapshots löschen
for i in $(zsysctl show | grep -e "- rpool/USERDATA/stephan_.*@autozsys.*$PATTERN" | awk ' { print $2 } '); do 
    i=${i#*@autozsys_}
    zsysctl state remove $i -u stephan
done

# ausgewählte andere zfs snapshots löschen
#TODO

04| Quellen

[01] https://openzfs.github.io/openzfs-docs/man/master/8/zfs-recv.8.html  
[02] https://openzfs.github.io/openzfs-docs/man/master/8/zfs-send.8.html 

Kommentare

PostadresseE-MailadresseFestnetzMobiltelefonSMS/SignalThreemaTwitter DirektnachrichtFAXWeb Page