Debian ZFS

Aus Wiki
Zur Navigation springen Zur Suche springen

Einleitung

ZFS ist ein modernes Filesystem, das erheblich mehr Funktionen bietet, als EXT4, das seit vielen Jahren das Standard Filesystem unter Linux ist. neben der Filesystem Funktionalität bietet es auch builtin LVM und Raid Funktionen. Einschränkung der Raid Funktionen: Erweiterung eines Raid Verbunds mit weiteren Festplatten zur Vergrüßerunng des Speicherplatzes wird derzeit (noch) nicht unterstützt. Unter BSD ist diese Funktion bereits enthalten, sodass davon auszugehen ist, dass ZFS auch unter Linux diese Funktion früher oder später lernen wird.

Proxmox verwendet per Default ZFS, da dies einige spezielle Funktionen von Proxmox erst möglich macht. Unter Debian kann ZFS ebenfalls relativ einfach verwendet werden. Es bietet z.B. Snapshots, die das aktuelle Filesystem festhält und relativ einfach auf einn anderes ZFS Filesystem gesichert werden kann. Der neue Snapshot belegt dabei nur das Delta zum vorherigen Snapshot auf der Festplatte. Beim Backup auf einen anderen Server können inkrementelle Backups zum Einsatz kommen, bei dem lediglich dieses Delta zum vorherigen Backup übertragen werden muss.


Installation

apt-get install zfsutils-linux zfs-zed


ZFS Pool

ZFS Pool Status

check Pool Status

zpool status

Ausgabe z.B.:

  pool: rpool
 state: ONLINE
  scan: scrub repaired 0B in 00:07:05 with 0 errors on Sun Feb 14 00:31:06 2021
config:

        NAME                               STATE     READ WRITE CKSUM
        rpool                              ONLINE       0     0     0
          nvme-eui.0025385201418a6e-part3  ONLINE       0     0     0

errors: No known data errors

ZFS Pool anlegen

  • in denn folgenden Beispielen wird ein neuer Storage Pool (spool) angelegt. Poolname kann beliegig gewählt werden.
  • Es empfiehlt sich die Fesplatten per ID zu identifizieren, anstatt mittels /dev/sdx
  • es ist jeweils 1 Beispiel mittels /dev/sdx , als auch /dev/desk/by-id/ata-x aufgeführt. Nachdem die Ids sehr lagne sind, sind diese mittels ata-x abgekürzt

Single HD oder Partitionn Pool

zpool create -f -o ashift=12 <pool> <device>
z.B. ZFS Pool in Partition einer Festplatte
zpool create -f -o ashift=12 spool /dev/sdb2
zpool create -f -o ashift=12 spool /dev/disk/by-id/ata-Samsung_SSD_xyz-part2


ZFS Raid Pool

RAID 0:

minimum 1 Festplatte

zpool create -f -o ashift=12 <pool> <device1> <device2>
z.B.
zpool create -f -o ashift=12 spool /dev/sdb /dev/sdc
zpool create -f -o ashift=12 spool /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c

RAID-1

minimum 2 Festplatten:

zpool create -f -o ashift=12 <pool> mirror <device1> <device2>
z.B.
zpool create -f -o ashift=12 spool mirror /dev/sdb /dev/sdc
zpool create -f -o ashift=12 spool mirror /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c 

RAID-10

minimum 4 Festplatten:

zpool create -f -o ashift=12 <pool> mirror <device1> <device2> mirror <device3> <device4>
z.B.
zpool create -f -o ashift=12 <pool> mirror /dev/sdb /dev/sdc mirror /dev/sdd /dev/sde
zpool create -f -o ashift=12 <pool> mirror /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c mirror /dev/disk/by-id/ata-d /dev/disk/by-id/ata-e

RAIDZ-1

vergleichbar Raid 5, minimum 3 Festplatten:

zpool create -f -o ashift=12 <pool> raidz1 <device1> <device2> <device3>
z.B.
zpool create -f -o ashift=12 <pool> raidz1 /dev/sdb /dev/sdc /dev/sdd
zpool create -f -o ashift=12 <pool> raidz1 /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c /dev/disk/by-id/ata-d

RAIDZ-2

vergleichbar Raid 6, minimum 4 Festplatten

zpool create -f -o ashift=12 <pool> raidz2 <device1> <device2> <device3> <device4>
z.B. 
zpool create -f -o ashift=12 <pool> raidz2 /dev/sdb /dev/sdc /dev/sdd /dev/sde
zpool create -f -o ashift=12 <pool> raidz2 /dev/disk/by-id/ata-b /dev/disk/by-id/ata-c /dev/disk/by-id/ata-d /dev/disk/by-id/ata-e

Pool Raid Status

zpool status

Ausgabe z.B.

  pool: rpool
 state: ONLINE
  scan: scrub repaired 0B in 00:07:05 with 0 errors on Sun Feb 14 00:31:06 2021
config:

        NAME                               STATE     READ WRITE CKSUM
        rpool                              ONLINE       0     0     0
          nvme-eui.0025385201418a6e-part3  ONLINE       0     0     0

errors: No known data errors

  pool: spool
 state: ONLINE
  scan: scrub repaired 0B in 02:23:46 with 0 errors on Sun Feb 14 02:47:48 2021
config:

        NAME         STATE     READ WRITE CKSUM
        spool        ONLINE       0     0     0
          raidz1-0   ONLINE       0     0     0
            ata-b    ONLINE       0     0     0
            ata-c    ONLINE       0     0     0
            ata-d    ONLINE       0     0     0

errors: No known data errors

Defekte Festplatte in einem Raid ersetzten

zpool replace -f <pool> <old device> <new device>
z.B. defekte Platte /dev/sdc durch neue /dev/sdf in Raid-Z1 ersetzen:
zpool replace -v spool /dev/sdc /dev/sdf
tpool replace -v spool /dev/disk/by-id/ata-c /dev/disk/by-id/ata-f

Status des Rebuild (Resilvering unter ZFS genannt):

zpool status -v


ZFS export / import

um einen ZFS Pool zu exportieren/auszuhägen:

zpool export <pool>

Pool importieren am selben Rechner:

zpool import <pool>

falls dies nicht funktionieren sollte:

zpool import -d /dev/disk/by-id/ata-b -d /dev/disk/by-id/ata-c ... <pool>

Pool an neuem Rechner/neu installiertes Betriebssystem importieren:

zpool import -d /dev/disk/by-id/ata-b -d /dev/disk/by-id/ata-c ... <pool> -f

mit obigen import Möglichkeitenn wird der Pool jeweils unter /<pool> eingehägt um einen anderen Mountpoint zu vergebe:

zpool import -D /mount/point -d /dev/disk/by-id/ata-b -d /dev/disk/by-id/ata-c ... <pool


ZFS Datasets

Dataset anlegen

in einem nackten ZFS Pool können noch keine Daten gespeichert werden. Daten werden in sog. Datasets abgelegt.

zfs create datasetname
z.B.
zfs create spool/dokumente
zfs create spool/filme
zfs create spool/samba
usw.

Vorteil mehrer Datasets gegenüber nur einem, in dem normale Unterverzeichnisse angelegt werden: Für jedes Dataset können separat snapshots angelegt werdenn. Z.B. um häufig geänndnerte Files häufiger zu sichern, als statische Daten wie z.B. CD-Images.

Datasets werden unter /poolname/dataset gemounted. D.h. obiges dataset spool/dokumente wird unter /spool/dokumente gemouted.

Datasets anzeigen

zfs list
Ausgabe z.B.
NAME                                  USED  AVAIL     REFER  MOUNTPOINT
rpool                                 280G   619G      221M  /rpool
rpool/ROOT                           4.68G   619G       96K  /rpool/ROOT
rpool/ROOT/pve-1                     4.68G   619G     4.16G  /
rpool/data                             96K   619G       96K  /rpool/data

Proxmox PVE ist im Dataset rpool/Root/pve-1 installiert. pve-1 ist dabei ein Sub-Dataset vom Root Dataset. Datasets können also logisch kaskadiert werden.


Dataset umbenennen

zfs rename spool/old spool/new

Dataset löschen

zfs destroy spool/datasetname


ZFS Compression

ZFS bietet die Möglichkeit Daten automatisch zu komprimieren, um Speicherplatz zu sparen:

zfs set compression=<algorithm> <dataset>

oder

zfs set compression=<algorithm> <pool>

Compressionsalgorithmus <algorithm>:

  • off: keine Kompression
  • lz4 (von Proxmox empfohlen, wenig Rechenleistungsbedarf)
  • lzjb
  • gzip-1 ... gzip-9 (1=schnellste, 9=beste Kompression)


Die Eistellung wird auf tieferliegende Datasets vererbt. D.h. wenn Compression auf Pool-Ebene eingeschaltet wird, wird sie für jedes Dataset vererbt. für einzelne Datasets kann sie dann bewusst deaktiviert werden. Funktioniert auch umgekehrt. Auf pool-Ebene off und für einzelne Datasets aktivieren.

Im Pool/Dataset bereits vorhandene Daten werden nach dem aktivieren der Compression nicht nachträglich komprimiert. Die Einstellung betrifft immer nur neu geschriebene Daten.


Snapshots

Snapshots anlegen und anzeigen

mittels Sapshots kann der aktuelle Zustand des Filesystems "eingefroren" werden. Diese Snapshots können in andere Pools / andere Pools auf anderen Rechner kopiert werden. Snapshots können auch wieder hergestellt werden, um zum Filesystem Zustand zum Zeitpunkt des Snapshots zurückzukehren.

zfs snapshot dataset@snapshotname
z.B. Snapshot sonntag-cw10 vom Dataset spool/dokumente
zfs snapshot spool/dokumente@sonntag-cw10

Snapshots anzeigen

zfs list -t snapshot pool/dataset


Snapshot umbenennen

Das Umbenennen eines Snapshot ist ebenfalls sehr einfach:

zfs rename pool/dataset@snap1 pool/dataset@snap2

Snapshot in anderen Pool übertragen

Snapshot snapshot-source in den Pool dest-pool übertragen:

zfs send snapshot-source dest-pool/dest-dataset
z.B.
zfs send spool/dokumente@sonntag-cw10 backup/dokumente  

Snapshot auf anderen PC übertragen

zfs send snapshot-source|ssh dest-pc zfs recv dest-pool/dest-dataset
z.B. 
zfs send spool/dokumente@sonntag-cw10 | ssh backup-pc zfs recv backup/dokumente

Snapshot inkrementell übertragen: Im Gegensatz zu vorherigem Beispiel, muss nur das Delta zum vorherigen Snapshot übertragen werden.

zfs send -i snapshot-source1 snapshot-source2 |ssh dest-pc zfs recv dest-pool/dest-dataset
z.B. 
zfs send spool/dokumente@sonntag-cw10 spool/dokumente@sonntag-cw9 | ssh backup-pc zfs recv backup/dokumente


Snapshot Rollback

Um das Filesystem auf den Stand eines Snapshots zurückzuversetzen:

zfs rollback snapshot
z.B.
/spool/dokumente@sonntag-cw9


Snapshot löschen

es wird nur der Snapshot gelöscht. Die eigentlichen Daten bleiben auf dem Dataset erhalten

zfs destroy snapshot
z.B.
zfs destroy /spool/dokumente@sonntag-cw9


ZRep ZFS Repliationstool

ZRep automatisiert einen großenn Teil der in vorherigen Kapiteln beschriebenen Anlegen von Shapshots und deren Übertragung in einene (Backup) Pool. ZRep verwendet dabei keinerlei Konfigfiles, sondern speichert alle relevanten Informationen in User defined ZFS-Eigenschaften.

Installation

ZRep benötigt die ksh Shell

apt-get install ksh

Download von ZRep:

cd /usr/local/src
wget https://github.com/bolthole/zrep/archive/v1.8.0.tar.gz
tar xvf v1.8.0.tar.gz
cp -rup zrep-1.8.0/zrep /usr/local/bin
Bulbgraph.png Hinweis:
Wenn auf einen 2. Host gesichert werden soll, muss auf beiden Hosts zrep (und ZFS - siehe oben) installiert werden und es ist passowort-loser SSH-login auf dem Zielhost erforderlich

Passwort-loser login auf Zielserver dhost:

ssh-copy-id -i /root/.ssh/id_rsa.pub root@dhost

evtl Abfragen mit yes bestätigen, falls vorher noch kein SSH-Login auf dhost stattfand Root Passwort von dhost eingeben

ssh dhost

Login sollte ohne Passwort erfolgen


Init

Source Pool (spool) / Source Dataset (sset) wird auf Destinnation Host dhost (kann auch der selbe host sein -> localhost) / Destination Pool (dpool) / Destination Dataset (dset) synchronisiert.Dabei muss weder der Poolname, noch der Datasetname identisch sein, könen aber.

ZFS Dataset auf Destination nicht vorhanden

zrep -i spool/sset host2 dpool/dset

Die initiale, vollsständige Synchronisation wird unmittelbar durchgeführt.

Bulbgraph.png Hinweis:
Funktioniert nur, wenn dpool/dset auf dhost nicht existiert. Der Destination Pool dpool muss auf dem Ziel Rechner bereits vorhanden sein.


Bereits existierendes Filesystem auf Destination

Falls das Ziel Filesystem dset bereis existiert, muss es entweder gelöscht werden und wie im vorhergehenden Kapitel beschrieben initialisiert werden (komplett neu übertragen), oder Source und Ziel folgendermaßen vorbereitet werden. Voraussetzung: auf Quelle und Ziel muss ein identischer Snapshot vorliegen. D.h. es muss bereits früher ein Snapshot mittels maueller Methode mit zfs send / zfs recf übertragen worden sein. Diese Snapshots werden mit "ZFS Hausmitteln" in ein zrep kompatibles format umbenannt. ZRep Snapshots haben folgendes Namensmuster: @zrep_123abc. 123abs ist dabei kein string, sondern eine Hex-Zahl.

  • Snapshot auf shost und dhost vorbereiten/umbenennen:
shost: zfs rename spool/sset@snaps spool/sset@zrep_00001
dhost: zfs rename spool/dset@snapd dpool/dset@zrep_00001
  • zrep Source/Destination Parameter setzen:
shost: zrep changeconfig -f spool/sset dhost dpool/dset
dhost: zrep changeconfig -f -d dpool/dset  shost spool/sset
  • Setze des "last sent timestamp"
shost: zrep sentsync spool/sset@zrep_00001


Manuelle Replikation

zrep -S /spool/sset

repliziert spool/sset

zrep -S all

repliziert alle initialisierten Zrep-Jobs

Automatische Repliation

Mittels Cron-Job wird die Repliationn automatisiert

vi /etc/cron.d/zrep

Folgende Zeilen einfügen

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
mm hh DD MM WD root /usr/local/bin/zrep -S spool/sset

oder

mm hh DD MM WD root /usr/local/bin/zrep -S all

Folgende Parameter entsprechend ersetzen:

mm=Minute
hh=Stunde
DD=Tag des Moats
MM=Monat
WD=Wochentag (0=Sonntag, 6=Samstag)

Es sind auch kombinierte Jobs möglich. z.B. Täglich um 23:15 Dokumente sichern, täglich alle 30 Minuten Emails und Samstags 23:30 alles

PATH='/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin'
15 23 * * * root /usr/local/bin/zrep -S spool/dokumente
*/30 * * * * root /usr/local/bin/zrep -S spool/email
23 30 * * 6 root /usr/local/bin/zrep -S all