Seite wählen

NETWAYS Blog

ZFS Cheat Sheet

Wenn man sich mit einem eigenen Linux Storage Servers beschäftigt hat man sicher schon davon gehört: ZFS. Ich beschäftige mich schon seit längerem mit ZFS und bin an einem Punkt an dem ich mir die Menge der Kommandos nicht mehr merken kann. Zu ZFS findet man zwar schon sehr viel im Internet, die Themen Snapshots oder verschlüsselte ZFS-Datasets fehlt aber leider meistens oder die Informationen sind nicht gesammelt an einer Stelle zu finden. Damit ich in Zukunft nicht immer suchen muss und Ihr auch etwas davon habt, schreibe ich hier alles zusammen.

Installation von ZFS unter Debian / Ubuntu
Die Installation wurde unter Debian 10 (Buster) und Ubuntu Server 20.10 (Groovy Gorilla) durchgeführt. Das Einbinden des Backports Repos ist für Ubuntu Server 20.10 nicht notwendig.
# apt-get update
# apt-get upgrade

# vi /etc/apt/sources.list.d/buster-backports.list
deb http://deb.debian.org/debian buster-backports main contrib
deb-src http://deb.debian.org/debian buster-backports main contrib

# vi /etc/apt/preferences.d/90_zfs
Package: libnvpair1linux libuutil1linux libzfs2linux libzpool2linux spl-dkms zfs-dkms zfs-test zfsutils-linux zfsutils-linux-dev zfs-zed
Pin: release n=buster-backports
Pin-Priority: 990

# apt-get update
# apt-get upgrade

--> Reboot (falls es ein Kernelupgrade gab)

# apt install dpkg-dev linux-headers-$(uname -r) linux-image-amd64
# apt install zfs-dkms zfsutils-linux

Erstellen eines einfachen ZFS Storage Pools
Mit folgendem Kommando wird ein ZFS Storage Pool namens „data“ erstellt. Dank „raidz1“ wird eine Redundanz aufgebaut und eine Festplatte kann ohne Probleme ausfallen. Es ist unter anderem auch möglich „raidz2“ oder „raidz3“ zu definieren.
# zpool create data raidz1 sdb sdc sdd
# zpool status

Erstellen eines ZFS Storage Pools mit Partition UUIDs
# ls -la /dev/disk/by-partuuid/
# zpool create data raidz1 00b85ce9-a0d5-9340-b347-cd0bcc714dc0 04c20b90-5678-4b88-af49-21db76427eda 0c35cb57-5bc6-7c49-929f-466102c22d05

Erstellen eines ZFS Datasets
# zfs create data/playground

Erstellen eines verschlüsselten ZFS Datasets
# zfs create -o encryption=aes-256-gcm -o keyformat=passphrase data/playground
# zfs get encryption

Erstellen eines ZFS Snapshots
# zfs snapshot data/playground@`date +%Y-%m-%d_%H-%M-%S`

Löschen eines ZFS Snapshots:
# zfs destroy data/playground@2020-09-12_17-25-42

Durchsuchen von Snapshots (z. B. zum Restore einzelner Daten)
# cd /data/playground/.zfs/snapshot/2020-09-12_17-25-42
# ls -la

Hinzufügen eines SSD-Caches
Erzeugen des Dateisystems auf der Partition:
# zpool create -f log  /dev/sde1
# zpool create -f cache  /dev/sde2

Löschen des Dateisystems:
# zpool destroy log1
# zpool destroy cache1

Hinzufügen von Cache und Log zum ZFS Pool:
# zpool add data log /dev/sde1
# zpool add data cache /dev/sde2

Vorsicht: In diesem Beispiel ist der Cache nicht gespiegelt / abgesichert! Beim Ausfall der SSD wären die Daten im Cache verloren!

Anzeigen der Speicherbelegung über den ganzen ZFS Pool inkl. Snapshots
# zpool set listsnapshots=on data
# zfs list -o space -r data

Tobias Redel
Tobias Redel
Head of Professional Services

Tobias hat nach seiner Ausbildung als Fachinformatiker bei der Deutschen Telekom bei T-Systems gearbeitet. Seit August 2008 ist er bei NETWAYS, wo er in der Consulting-Truppe unsere Kunden in Sachen Open Source, Monitoring und Systems Management unterstützt. Insgeheim führt er jedoch ein Doppelleben als Travel-Hacker und renoviert, baut und bastelt als Heimwerker an allem was er finden kann.

Lokale Time Machine Snapshots blockieren Speicherplatz

Kürzlich hatte ich den Plan, ein ca. 100GB iPhone Backup zwischenzeitlich auf dem Mac anzufertigen. Meinem Plan stand nach einem kurzen Blick auf den freien Diskspace des Finders eigentlich nichts im Wege, denn dieser zeigte noch 120 GB freien Speicherplatz an. Nachdem sich das Backup aber mit einem bisher unbekannten Fehler verabschiedete, machte ich mich einmal auf die Suche, was mein Mac denn so eigentlich macht.
Ein Kurzer Blick im Terminal bestätigte mir allerdings viel weniger freien Platz auf der Platte, als der Finder es tat. So waren hier nur noch 55 GB frei. Wie kann das sein?
Zunächst einmal öffnet ihr euer Terminal im Mac und gebt folgendes Kommando ein

df -h

Der Mac zeigt nun in aller Regel in der ersten Zeile die Informationen der Mac-Festplatte (Gegenkontrolle Anhand der Size-Spalte) an. In der Spalte Available steht der noch zur Verfügung stehende Speicherplatz. Sollten sich diese Werte im Finder und im Terminal erheblich unterscheiden, macht es Sinn, die Snapshots unter die Lupe zu nehmen.
Warum Snapshots?
Sollte das Time Machine Backup Volume (z. B. wenn man im Urlaub ist) nicht verfügbar sein, fertigt der Mac lokale Snapshots an. Ein solcher Snapshot schützt zwar nicht vor Datenverlust bei einem Hardwareschaden, wohl aber bei unbeabsichtigten Löschen – also die haben schon Ihre Daseinsberechtigung und fertigen zuverlässig auch ohne Backupvolume im Hintergrund eine Art Sicherung an. Normaler Weise gibt der Mac nach und nach die Snapshots frei, wenn er merkt, dass der Platz benötigt wird. Das ist wahrscheinlich auch der Grund, warum der Finder die Snapshots von der Kalkulation des freien Speicherplatzes excludiert.
Habe ich auch Snapshots?
Sofern ein Time Machine Backup läuft, wird diese Funktion aktiviert. Allerdings tritt sie nur in Kraft, wenn das Backup-Volume nicht verfügbar ist. Am besten prüft man das kurz über das Mac-Terminal mittels Eingabe des folgenden Kommandos. Es listet alle vorhandenen Snapshots der Primärplatte auf.

tmutil listlocalsnapshots /

Möchte man nun einmal solche Snapshots entsorgen, so lässt sich das mit folgendem Kommando erledigen

sudo tmutil thinLocalSnapshots / 10000000000 4

Kurze Erklärung hierzu: / Bezieht sich wieder auf das soeben ermittelte Volume (also die primäre Festplatte, das braucht man in aller Regel nicht ändern), 10000000000 bezieht sich auf den „purgeamount“ also die Menge, in diesem Beispiel sind das 10 GB. Um mehr freizugeben, Zahl auf beliebigen Wert in Byte erhöhen, oder Kommando mehrfach ausführen. Die 4 steht für die „urgency“, also die Dringlichkeit. 1 ist hier die höchste, aber 4 reicht eigentlich auch zum Löschen.
Nachhaltig verhindern, lassen sich lokale Snapshots auf den Apple-Geräten mit folgendem Kommando:

sudo tmutil disablelocal

Alternativ Time Machine nicht mehr nutzen, oder dafür sorgen, dass die Backupvolumes immer verfügbar sind.

MySQL Sicherung mit LVM

Auch die robusteste MySQL-Replikation kann einmal zerbrechen, besonders wenn der Faktor Mensch einen nicht ganz unerheblichen Teil dazu beiträgt. Glücklich schätzen können sich also im Fehlerfall welche, die das DataDir auf einem Volume oder Dateisystem mit Snapshot-Funktionalität installiert haben.
Hat man einen konsistenten Master kann man mit folgenden Kommandos ein Backup erstellen und dieses zum Aufsetzen inkonsistenter,defekter oder neuer Slaves verwenden.
mysql> flush tables with read lock;
mysql> flush logs;
mysql> show master status;
bash# lvcreate -s -n snap -L5G vg/lv
mysql> unlock tables;

Innerhalb weniger Sekunden ist das Backup erstellt. Allerdings wartet das „flush tables“ die gerade aktiven Statements ab. Solange hier kein Ausreißer dabei ist, bleibt es auch beim sekundenschnellen Backup.
Das Snapshot-LV kann anschließend wie gewöhnlich eingehängt und die Daten auf das Zielsystem kopiert werden. „reset slave“ und „change master to ….“ auf dem Slave runden das Vorgehen ab.

Sebastian Saemann
Sebastian Saemann
CEO Managed Services

Sebastian kam von einem großen deutschen Hostingprovider zu NETWAYS, weil ihm dort zu langweilig war. Bei uns kann er sich nun besser verwirklichen, denn er leitet das Managed Services Team. Wenn er nicht gerade Cloud-Komponenten patched, versucht er mit seinem Motorrad einen neuen Rundenrekord aufzustellen.