# ZFS Grundlagen am Beispiel Proxmox VE(Stand Januar 2025)

Der Verfasser des Artikels, Christian-Peter Zengel, hat zum Zeitpunkt des Artikels ca **15 Jahre Erfahrung mit ZFS und Proxmox. Er betreibt aktuell ca 150 Systeme mit Proxmox und ZFS**

Das Einsatzgebiet geht von Standaloneinstallation bis zu ca 10 Hosts im Cluster. **Es ist keine Ceph Expertise vorhanden!**

> Dieser Dokumentation basiert auf diesem online Kurse von cloudistboese.de
> 
> #### [21. + 23.01.2025 (13.00 Uhr bis 17.00 Uhr) - ZFS Grundlagen](https://cloudistboese.de/course/view.php?id=79)

**ZFS ist die perfekte Grundlage für kleine und mittlere Systeme um gegen Ausfälle, Dummheit anderer und Erpressungstrojanern ideal aufgestellt zu sein. In diesem Kurs erhalten sie Grundkenntnisse für Systeme wie Proxmox, TrueNAS oder ähnliche Systeme.**

**Der Fokus liegt auf der Technologie und der permanenten Sicherheit im Umgang mit Daten, Linux und dem Terminal.**   
**Themen:**

- Begrifflichkeiten und Überblick
- Basisfunktionen von Proxmox und TrueNAS per GUI
- Erklärung und Beispiele Snapshots und Rollbacks
- Praxisbeispiele Replikation
- Prüfung der Replikationen
- Weitere Features die das Leben massiv erleichtern

Nach diesem Kurs bist Du bei Ausfällen und Datenverlust vor dem Schlimmsten geschützt und in Minuten wieder produktiv!

> [https://de.wikipedia.org/wiki/ZFS\_(Dateisystem)](https://de.wikipedia.org/wiki/ZFS_(Dateisystem))
> 
> [https://www.proxmox.com/de/](https://www.proxmox.com/de/)
> 
> [https://cloudistboese.de](https://cloudistboese.de)

#### So erstellt Proxmox VE seinen ZFS Raid

> zpool create -f -o cachefile=none -o ashift=12 rpool mirror disk1 disk2
> 
> Destruktives Anlegen (-f), kein automatisches Importieren beim Start (-o cachefile=none)  
> -o ashift=12 ist für 4k Festplatten, ashit=9 für 512e Disks, wobei man mit 12 nichts verkehrt macht  
> rpool ist der Name vom künftigen Pool, mirror der Raidlevel und die Disks wurden zweifelsfrei über Ihre ID definiert
> 
> Optionen für Raidlevel wären noch: ohne als Stripe, raidz, raidz2 oder raidz3, also Raid Level 5-7

 [![Bildschirmfoto 2025-01-21 um 13.41.23.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-13-41-23.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-13-41-23.jpg)

> Die ersten Zpool Manöver und die endlose Aktionsliste sieht man mit
> 
> zpool history

[![Bildschirmfoto 2025-01-21 um 13.44.20.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-13-44-20.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-13-44-20.jpg)

> Manuelles Trimmen der SSDs um gelöscht Blöcke schner überschreiben zu können findet man unter /etc/cron.d  
> Ebenso wird nach diesem Zeitplan der sog. **zpool scrub** durchgeführt, der die Konsistenz der Redundanz prüft und ggf. korrigiert. Gefundene Fehler findet man dann mit **zpool status**

[![Bildschirmfoto 2025-01-21 um 13.47.45.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-13-47-45.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-13-47-45.jpg)

> Zum identifizieren der Platten bieten sich neben der PVE GUI noch folgende Befehle an. Es wird dringend empfohlen bereits genutzte Platten via PVE GUI zu wipen
> 
> <p class="callout success">dmesg -Tw (live)  
> lsblk  
> ls -althr /dev/disk/by-id</p>

[![Bildschirmfoto 2025-01-21 um 13.50.01.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/Omgbildschirmfoto-2025-01-21-um-13-50-01.jpg)](https://aow.de/uploads/images/gallery/2025-01/Omgbildschirmfoto-2025-01-21-um-13-50-01.jpg)

#### Erstellen verschiedener Raidlevel und Ihrer Vorzüge

> Mit ls -althr /dev/disk/by-id haben wir folgende Festplatten anhand ihrer aufgedruckten WWN Kennung identifiziert. Es ist dringend empfohlen bei HBAs sich die Slots und die Seriennummern beim Einbau zu notieren und in die Dokumentation aufzunehmen

<p class="callout success">wwn-0x5000cca01a72ded4 wwn-0x5000cca01a7b1e2c wwn-0x5000cca01a83a61c wwn-0x5000cca01a832d24 wwn-0x5000cca01a83331c wwn-0x5000cca01a7495b8 wwn-0x5000cca01a8417fc </p>

##### Stripe, also Raid0

<p class="callout info">zpool create -f test wwn-0x5000cca01a72ded4 wwn-0x5000cca01a7b1e2c wwn-0x5000cca01a83a61c wwn-0x5000cca01a832d24 wwn-0x5000cca01a83331c wwn-0x5000cca01a7495b8  
</p>

<div id="bkmrk-test-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0" style="text-align: justify;"><div>test ONLINE</div><div> wwn-0x5000cca01a72ded4 ONLINE</div><div> wwn-0x5000cca01a7b1e2c ONLINE</div><div> wwn-0x5000cca01a83a61c ONLINE</div><div> wwn-0x5000cca01a832d24 ONLINE</div><div> wwn-0x5000cca01a83331c ONLINE</div><div> wwn-0x5000cca01a7495b8 ONLINE</div><div> wwn-0x5000cca01a8417fc ONLINE</div></div>##### Mirror, also Raid1

<p class="callout info">zpool create -f test mirror wwn-0x5000cca01a72ded4 wwn-0x5000cca01a7b1e2c</p>

<div id="bkmrk-test">test</div><div id="bkmrk-%C2%A0mirror"> mirror</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7"> wwn-0x5000cca01a72ded4</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-1"> wwn-0x5000cca01a7b1e2c</div>##### Striped Mirror, also Raid10

<p class="callout info">zpool create -f test mirror wwn-0x5000cca01a72ded4 wwn-0x5000cca01a7b1e2c mirror wwn-0x5000cca01a83a61c wwn-0x5000cca01a832d24 mirror wwn-0x5000cca01a83331c wwn-0x5000cca01a7495b8</p>

<div id="bkmrk-test-%C2%A0mirror-%C2%A0-%C2%A0wwn-"><div>test</div><div> mirror</div><div> wwn-0x5000cca01a72ded4</div><div> wwn-0x5000cca01a7b1e2c</div><div> mirror</div><div> wwn-0x5000cca01a83a61c</div><div> wwn-0x5000cca01a832d24</div><div> mirror</div><div> wwn-0x5000cca01a83331c</div><div> wwn-0x5000cca01a7495b8</div></div>##### RaidZ, also Raid 5, Nettoplatz x-1

<p class="callout info">zpool create test raidz wwn-0x5000cca01a72ded4 wwn-0x5000cca01a7b1e2c wwn-0x5000cca01a83a61c wwn-0x5000cca01a832d24 wwn-0x5000cca01a83331c wwn-0x5000cca01a7495b8 wwn-0x5000cca01a8417fc   
</p>

<div id="bkmrk-test-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-1"><div>test ONLINE 0 0 0</div><div> raidz1-0 ONLINE 0 0 0</div><div> wwn-0x5000cca01a72ded4 ONLINE 0 0 0</div><div> wwn-0x5000cca01a7b1e2c ONLINE 0 0 0</div><div> wwn-0x5000cca01a83a61c ONLINE 0 0 0</div><div> wwn-0x5000cca01a832d24 ONLINE 0 0 0</div><div> wwn-0x5000cca01a83331c ONLINE 0 0 0</div><div> wwn-0x5000cca01a7495b8 ONLINE 0 0 0</div><div> wwn-0x5000cca01a8417fc ONLINE 0 0 0</div></div><div id="bkmrk--3"></div>##### RaidZ2, also Raid 6, Nettoplatz x-2

<p class="callout info">zpool create test raidz2 wwn-0x5000cca01a72ded4 wwn-0x5000cca01a7b1e2c wwn-0x5000cca01a83a61c wwn-0x5000cca01a832d24 wwn-0x5000cca01a83331c wwn-0x5000cca01a7495b8 wwn-0x5000cca01a8417fc   
</p>

<div id="bkmrk-%C2%A0raidz2-0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-"><div><div> raidz2-0 ONLINE 0 0 0</div><div> wwn-0x5000cca01a72ded4 ONLINE 0 0 0</div><div> wwn-0x5000cca01a7b1e2c ONLINE 0 0 0</div><div> wwn-0x5000cca01a83a61c ONLINE 0 0 0</div><div> wwn-0x5000cca01a832d24 ONLINE 0 0 0</div><div> wwn-0x5000cca01a83331c ONLINE 0 0 0</div><div> wwn-0x5000cca01a7495b8 ONLINE 0 0 0</div><div> wwn-0x5000cca01a8417fc ONLINE 0 0 0</div><div>  
</div></div></div>##### RaidZ-0, also Raid 5-0, Nettoplatz x-2, in diesem Beispiel

<p class="callout info">zpool create test raidz wwn-0x5000cca01a72ded4 wwn-0x5000cca01a7b1e2c wwn-0x5000cca01a83a61c raidz wwn-0x5000cca01a832d24 wwn-0x5000cca01a83331c wwn-0x5000cca01a7495b8   
</p>

<div id="bkmrk-%C2%A0-test-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0"><div><div>test ONLINE 0 0 0</div><div> raidz1-0 ONLINE 0 0 0</div><div> wwn-0x5000cca01a72ded4 ONLINE 0 0 0</div><div> wwn-0x5000cca01a7b1e2c ONLINE 0 0 0</div><div> wwn-0x5000cca01a83a61c ONLINE 0 0 0</div><div> raidz1-1 ONLINE 0 0 0</div><div> wwn-0x5000cca01a832d24 ONLINE 0 0 0</div><div> wwn-0x5000cca01a83331c ONLINE 0 0 0</div><div> wwn-0x5000cca01a7495b8 ONLINE 0 0 0</div><div> wwn-0x5000cca01a8417fc ONLINE 0 0 0</div></div></div><div id="bkmrk--4">  
</div>> oder mit Spare, wenn Du davon nicht booten musst

<p class="callout info">zpool create test raidz wwn-0x5000cca01a72ded4 wwn-0x5000cca01a7b1e2c wwn-0x5000cca01a83a61c raidz wwn-0x5000cca01a832d24 wwn-0x5000cca01a83331c wwn-0x5000cca01a7495b8 **spare** wwn-0x5000cca01a8417fc</p>

#### Erweiterung eines RaidZ zum RaidZ-0

<div id="bkmrk-test-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-2">test ONLINE 0 0 0</div><div id="bkmrk-%C2%A0raidz1-0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-%C2%A0-"> raidz1-0 ONLINE 0 0 0</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-2"> wwn-0x5000cca01a72ded4 ONLINE 0 0 0</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-3"> wwn-0x5000cca01a7b1e2c ONLINE 0 0 0</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8"> wwn-0x5000cca01a83a61c ONLINE 0 0 0</div><div id="bkmrk--5"></div><p class="callout info">zpool add -n test raidz wwn-0x5000cca01a832d24 wwn-0x5000cca01a83331c wwn-0x5000cca01a7495b8  
</p>

<div id="bkmrk-test-1">test</div><div id="bkmrk-%C2%A0raidz1-0"> raidz1-0</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-4"> wwn-0x5000cca01a72ded4</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-5"> wwn-0x5000cca01a7b1e2c</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-1"> wwn-0x5000cca01a83a61c</div><div id="bkmrk-%C2%A0raidz1"> raidz1</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-2"> wwn-0x5000cca01a832d24</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-3"> wwn-0x5000cca01a83331c</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-6"> wwn-0x5000cca01a7495b8</div><div id="bkmrk--6"></div>#### Erweiterung eines Raid durch Ersetzen mit größeren Platten

> Die Platten müssen die Gleiche Geometrie hanben, also 4k zu 4k oder 512e zu 512e
> 
> Bei Raid 1 und 10 reicht es zwei Disks zu tauschen, bei RaidZx müssen alle Disks getauscht werden
> 
> Replace Vorgänge können auch laufen ohne die Redundanz zu brechen, wenn weitere Slots frei sind
> 
> Bei Erweiterung durch Austausch von großen und vor allem älteren Raid 10 prüfen ob in einem Mirror ggf. neue Platten getauscht wurden, diese sollten weiter im Betrieb bleiben, während ältere Paare getauscht werden können

<div id="bkmrk-rpool-hdd">rpool-hdd</div><div id="bkmrk-%C2%A0mirror-0"> mirror-0</div><div id="bkmrk-%C2%A0-2024-8t-%28vorher-di"> **2024-8T (vorher Disk aus 2014)**</div><div id="bkmrk-%C2%A0-2024-8t-%28vorher-di-1"> **2024-8T (vorher Disk aus 2014)**</div><div id="bkmrk-%C2%A0mirror-1"> mirror-1</div><div id="bkmrk-%C2%A0-2014-2t"> 2014-2T</div><div id="bkmrk-%C2%A0-2021-2t"> 2021-2T</div><div id="bkmrk-%C2%A0mirror-2"> mirror-2</div><div id="bkmrk-%C2%A0-2022-2t"> 2022-2T</div><div id="bkmrk-%C2%A0-2014-2t-1"> 2014-2T</div><div id="bkmrk--7"></div>#### Caches und Logdevices

> Vorsichtig formuloiert, Lese- und Schreibcache
> 
> First Level Cache, sog. ARC kommt aus dem RAM und bekommt idealerweise ca. 1GB für 1TB Nettodaten
> 
> Second Level Cache wird als Cachedevice als Partition auf einer schnelleren Disk als der Pool hat bereitgestellt, z. B. am idealsten mit NVMe

<p class="callout info">zpool add test -n cache sdl  
</p>

<div id="bkmrk-test-2">test</div><div id="bkmrk-%C2%A0raidz2-0"> raidz2-0</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-7"> wwn-0x5000cca01a72ded4</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-8"> wwn-0x5000cca01a7b1e2c</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-4"> wwn-0x5000cca01a83a61c</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-5"> wwn-0x5000cca01a832d24</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-6"> wwn-0x5000cca01a83331c</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-9"> wwn-0x5000cca01a7495b8</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-7"> wwn-0x5000cca01a8417fc</div><div id="bkmrk-cache">**cache**</div><div id="bkmrk-%C2%A0sdl"> **sdl**</div><div id="bkmrk--8"></div>> <div>Logdevice (Writecache muss gespiegelt werden)  
> </div><div>Damit der Log auch genutzt wird muss man noch mit zfs set sync den cache aktivieren</div>

<div id="bkmrk--9"></div><p class="callout info">zpool add test -n log mirror sdl </p>

<p class="callout info">zfs set sync=always test</p>

<div id="bkmrk-test-3">test</div><div id="bkmrk-%C2%A0raidz2-0-1"> raidz2-0</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-10"> wwn-0x5000cca01a72ded4</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-11"> wwn-0x5000cca01a7b1e2c</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-8"> wwn-0x5000cca01a83a61c</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-9"> wwn-0x5000cca01a832d24</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-10"> wwn-0x5000cca01a83331c</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a7-12"> wwn-0x5000cca01a7495b8</div><div id="bkmrk-%C2%A0-%C2%A0wwn-0x5000cca01a8-11"> wwn-0x5000cca01a8417fc</div><div id="bkmrk-logs">**logs**</div><div id="bkmrk-%C2%A0mirror-3"> **mirror**</div><div id="bkmrk-%C2%A0-%C2%A0sdl"> **sdl**</div><div id="bkmrk-%C2%A0-%C2%A0sdk"> **sdk**</div><div id="bkmrk--10"></div>> <div>**Arc wird mit "arcstat 1" ausgelesen, er wird bei der Installation festgelegt oder später unter /etc/modprobe.d/zfs.conf geändert. update-initramfs -u macht das dann persistent und aktiviert die Änderungen beim nächsten reboot.** </div><div>**Zur Laufzeit ändert man den Firstlevelcahce mit** </div><div>**Cache- und Logdevices mit zpool iostat 1**</div>

<p class="callout info">echo 2147483648 &gt; /sys/module/zfs/parameters/zfs\_arc\_max  
echo 1073741824 &gt; /sys/module/zfs/parameters/zfs\_arc\_min  
free -h &amp;&amp; sync &amp;&amp; echo 3 &gt; /proc/sys/vm/drop\_caches &amp;&amp; free -h</p>

<p class="callout info">arcstat 1</p>

[![Bildschirmfoto 2025-01-21 um 15.15.59.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-15-15-59.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-15-15-59.jpg)

#### Test der Leistung eines Pools

<p class="callout info">zfs create -o compression=off test/speed  
cd /test/speed  
dd if=/dev/zero of=dd.tmp bs=256k count=16384 status=progress  
dd if=/dev/zero of=dd.tmp bs=2M count=16384 status=progress</p>

[![Bildschirmfoto 2025-01-21 um 15.30.20.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-15-30-20.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-15-30-20.jpg)

[![Bildschirmfoto 2025-01-21 um 15.31.09.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-15-31-09.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-15-31-09.jpg)

#### Erweiterung der Funktionen des Pools

> zpool status meldet neue Funktionen im ZFS und kann leicht und schnell mit
> 
> <p class="callout info">zpool upgrade -a</p>
> 
> erledigt werden
> 
> Jedoch würde ich in jedem Fall empfehlen zu prüfen ob meine Notfall ISO diese Funktionen bereits unterstützt!

[![Bildschirmfoto 2025-01-21 um 15.59.16.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-15-59-16.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-15-59-16.jpg)

[![Bildschirmfoto 2025-01-21 um 15.59.26.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-15-59-26.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-15-59-26.jpg)

> Für das Auslesen der Parameter von Pools, Volumes, Datasets und Snapshots gibt es den Parameter **get**

[![Bildschirmfoto 2025-01-21 um 16.00.49.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-00-49.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-00-49.jpg)

#### Bereitstellen und entfernen von Pools ohne löschen

> zpool import #zeigt was es zum importieren, also bereitstellen gibt
> 
> zpool import poolname oder -a für alle importiert den Pool oder alle verfügbaren Pools
> 
> Am elegantesten importiert man den Pool über
> 
> **zpool import -d /dev/disk/by-id**
> 
> damit man hinterher nicht sda, sdb, sondern die Bezeichner im Status sieht

[![Bildschirmfoto 2025-01-21 um 16.12.48.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-12-48.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-12-48.jpg)

Nach der Bereitstellung würde man hier lediglich einen Mountpoint /test finden, bei TrueNAS /mnt/test. Dazu noch die Systemdatasets vom Proxmox selbst. Danach legen wir gleich mal ein Dataset namens dateisystem und ein Volume namens volume an.

[![Bildschirmfoto 2025-01-21 um 16.27.43.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-27-43.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-27-43.jpg)

> Datasets werden als Ordner gemountet und / oder /mnt
> 
> Volumes findet man unter /dev/zd... und zusätzlich mit vernünftigen Namen unter /dev/zvol/tankname/....

[![Bildschirmfoto 2025-01-21 um 16.28.41.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-28-41.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-28-41.jpg)

> Datasets werden mit Linuxcontainern, Backupfiles, Vorlagen oder Serverdateien bespielt
> 
> Volumes verhalten sich wie eingebaute Datenträger, jedoch virtuell. Sie stehen nach dem Import des Pools bereit und können in einer VM genutzt werden. Manipulationen an Volumes zur Vorbereitung oder Datenrettung können jedoch ebenso auf dem PVE Host vorgenommen werden

<p class="callout danger">Diese Schritte übernimmt üblicherweise der Installer in der VM und sollen nur aufzeigen wie diese ZVOLs genutzt werden</p>

[![Bildschirmfoto 2025-01-21 um 16.42.58.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-42-58.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-42-58.jpg)

[![Bildschirmfoto 2025-01-21 um 16.43.33.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-43-33.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-43-33.jpg)

[![Bildschirmfoto 2025-01-21 um 16.48.11.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-48-11.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-48-11.jpg)

[![Bildschirmfoto 2025-01-21 um 16.48.19.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-48-19.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-48-19.jpg)

Proxmox legt seine Datasets für LXC so ab

[![Bildschirmfoto 2025-01-21 um 16.52.46.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-52-46.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-52-46.jpg)

und so die ZVOLs für VMs mit KVM, hier findet man die virtuellen Disk und /dev/zvol...

[![Bildschirmfoto 2025-01-21 um 16.51.58.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-21-um-16-51-58.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-21-um-16-51-58.jpg)

#### Thin- und Thickprovisioning für Datasets und Volumes

> Am Beispiel von Proxmox VE via GUI wird hier eine Thinprovision Festplatte für VM 301 mit 32GB und einer Standardblockgröße von 16k erzeugt. 8k sind nur bei Raid1 und 10 möglich. Hakt man den Thinprovision Haken nicht an, wird beim Erzeugen noch die Option -o refreservation=32G ergänzt. Diese macht bei ZFS mit Autosnapshots aber keinen Sinn

<p class="callout info">zfs create -s -b 16k -V 33554432k rpool/data/vm-301-disk-4</p>

<p class="callout success">rpool/data/vm-301-disk-4<span class="Apple-converted-space"> </span>56K<span class="Apple-converted-space"> </span>1.17T<span class="Apple-converted-space"> </span>56K<span class="Apple-converted-space"> </span>- **\#hier kein Mount sonder unter /dev/zvol/...**</p>

> Bei LXC werden Datasets genutzt und der Platz via Reservierung genutzt, wobei bei der genutzten Refquota auch die Snapshotaufhebezeiten den Nettoplatz verkleinern, daher größer dimensionieren, gerne mal doppelt so groß

<p class="callout info"><span class="Apple-converted-space"> </span>zfs create -o acltype=posixacl -o xattr=sa -o refquota=33554432k rpool/data/subvol-106-disk-1</p>

<p class="callout success">rpool/data/subvol-106-disk-1<span class="Apple-converted-space"> </span>96K<span class="Apple-converted-space"> </span>32.0G<span class="Apple-converted-space"> </span>96K<span class="Apple-converted-space"> </span>**/rpool/data/subvol-106-disk-1 #hostzugriff möglich**</p>

> Virtuelle Diskimages wie QCOW2, VMDK oder RAW-Dateien legt man üblicherweise nicht in Datasets, bestenfalls für NFS oder iSCSI Server

#### Snapshots

> Snapshots können jederzeit erstellt oder gelöscht werden. Die Datasets und Volumes befinden sich immer in einem Livezustand der sich durch die Vektorkette der eventuell vorhandenen Snapshots ergibt. Entfernt man einen Snapshot, so verändert sich der Weg der Vektoren. Das Ganze geschieht fast ohne Last!
> 
> ZFS selbst bringt weder Workflows für Snapshotting, noch Replikationen mit. Es stellt nur die Werkzeuge bereit
> 
> Snapshots generiert man bei Proxmox offiziell mit der GUI manuell oder für Replikationen, jedoch leistet dieser Workflow nicht genug.
> 
> Daher nutzen wir...

<p class="callout info">apt install zfs-auto-snapshot -y</p>

> ZFS-AUTO-SNAPSHOT legt seine Verknüpfungen in alle Cronordner. Proxmox VE weiß erst mal nichts davon. Zu berücksichtigen ist hier lediglich daß wir den Pool nicht über 80% befüllen wollen. Gehen wir darüber hinaus, müssen wir in den Cronordnern die Verknüpfungen anpassen um die Aufhebezeiten zu reduzieren.

<p class="callout info">nano /etc/crontab<span class="Apple-converted-space"> #kann angepasst werden, die viertelstündlichen finden sich unter cron.d!</span></p>

\# .---------------- minute (0 - 59)  
\# |<span class="Apple-converted-space"> </span>.------------- hour (0 - 23)  
\# |<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>.---------- day of month (1 - 31)  
\# |<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>.------- month (1 - 12) OR jan,feb,mar,apr ...  
\# |<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>.---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat  
\# |<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>|<span class="Apple-converted-space"> </span>|  
\# \*<span class="Apple-converted-space"> </span>\*<span class="Apple-converted-space"> </span>\*<span class="Apple-converted-space"> </span>\*<span class="Apple-converted-space"> </span>\* user-name command to be executed  
17 \* \* \* \* root cd / &amp;&amp; run-parts --report /etc/**cron.hourly**  
25 6 \* \* \* root test -x /usr/sbin/anacron || { cd / &amp;&amp; run-parts --report /etc/**cron.daily**; }  
47 6 \* \* 7 root test -x /usr/sbin/anacron || { cd / &amp;&amp; run-parts --report /etc/**cron.weekly**; }  
52 6 1 \* \* root test -x /usr/sbin/anacron || { cd / &amp;&amp; run-parts --report /etc/**cron.monthly**; }

<p class="callout info">cat /etc/cron.hourly/zfs-auto-snapshot<span class="Apple-converted-space"> </span></p>

<p class="callout success">exec zfs-auto-snapshot --quiet --syslog --label=hourly **--keep=96** // #also in dem Fall 96 Stunden</p>

> Wir empfehlen für den Start folgende Settings: Drei Monate, sechs Wochen, zehn Tage, 96h und 12 Viertelstunden
> 
> Damit kommt man auf ca. 2,5x- 3x so viele Daten wie belegt wären ohne Snapshots. Erfahrungswert.
> 
> Das wären pro virtueller Disk oder LXC Mountpoint etwa 127 Snaphots, bei 20 Disks über 2540.
> 
> Nicht davon abschrecken lassen, es geht auch easy fünfstellig, wenn die IO stimmt!
> 
> Die in PVE eingebaute Snapshotfunktion sollte nicht mit den Autosnapshots kombiniert werden.
> 
> Im Problemfall stoppen wir die VM, manipulieren was zu machen ist und starten sie wieder!
> 
> Der eigentliche Vorteil der Snapshots in der GUI ist die Notierung der VM Definition zur Zeit der Erstellung, was wir über ein Backup im hauseigenen Postinstaller kompensieren. Dort findet man die Historie der PVE Config

[![Bildschirmfoto 2025-01-23 um 14.29.16.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-23-um-14-29-16.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-23-um-14-29-16.jpg)

##### Kleines manuelles Beispiel, was für uns aber Z-A-S übernimmt

**Snapshot**

<p class="callout info">zfs snapshot tank/sub/datasetodervolume@snapshotname</p>

**Auflisten**

<p class="callout info">zfs list -t snapshot tank/sub/datasetodervolume</p>

**VM oder LXC ausmachen**

**Rollback**

<p class="callout info">zfs rollback -r rpool/data/vm-100-disk-0@Test #danach ist alles neuere weg! </p>

**VM oder LXC starten**

#### Dynamik von Snapshots

Wir unterscheiden zwei Sorten von Datennutzung

- Zunehmende Datennutzung wie bei einem NAS 
    - Es kommt nur was dazu und wird selten gelöscht
    - Viele Snapshots auf lange Zeit ändern nichts an der Gesamtnutzung des Pools
    - Replikation außer Haus kann in kleinen Schritten passieren, da die Gesamtübertragung gleich groß ist
- Rotierende Datennutzung wie bei einem Datenbankserver 
    - Daten verändern sich permanent, wenig Zuwachs
    - Viele Snapshots auf lange Zeit ändern **brachial viel** an der Gesamtnutzung des Pools
    - Replikation außer Haus sollte in einem Schritt, ohne Zwischensnapshots passieren, da die Gesamtübertragung sonst ein vielfaches größer sein kann
    - Nur essenzielle Wiederherstellungspunkte sollten aufgehoben werden um das System nicht unnötig zu befüllen

#### Dynamik von Snapshots

> Dank ZFS kann man langfristig Replikationen inkrementell vornehmen, jedoch dauert die erste Replikation natürlich länger, wenn schon Datenbestand da war

#### Übliche Vorgehensweise einer Datenübertragung

PC NTFS&gt;SMB&gt; Datei &gt; SAMBA Server BTRFS LVM &gt; EXT4 Datei = Konsistent? Bitrod?

<p class="callout danger">Zu viele Köche verderben die Köchin</p>

#### Funktion von Snapshotreplikation

##### Von ZFS zu Datei, was wenig Praxis findet

<p class="callout danger">zfs send tank/dataset@snapshot &gt; datei.zfs</p>

<p class="callout danger">zfs recv tank &lt; datei.zfs</p>

##### Von ZFS zu ZFS, was üblich ist

<p class="callout success">zfs send | zfs recv #laufen immer gleichzeitig  
</p>

<p class="callout info">zfs send rpool/data/vm-100-disk-0@Test | zfs recv -dvF backuptank   
**\#überträgt den Zustand Test auf ein lokalen weiteren Pool, wobei das zfs Tool immer doppelt läuft**  
</p>

##### Pushreplikation

<p class="callout info">zfs send -pvwRI rpool/data/vm-100-disk-0@Test rpool/data/vm-100-disk-0@zfs-auto-snap\_hourly-2025-01-23-1317 | zfs recv -dvF backuptank  **\#Fortschritt, Infos, Rohdaten plus Historie, ideal für verschlüsselte Volumes, erspart das De- und Komprimieren**</p>

#### Workflow

- Erzeugen eines Datasets oder Volumes
- Snapshot auf Dataset oder Volume ausführen
- Übertragung des Snapshotzustands auf Ziel, optional mit Zwischenständen

<p class="callout warning">Trojanerproblem: Wer auf Quelle sitzt kann Pushziele löschen</p>

<p class="callout success">Lösung: Pullreplikation, ähnlich Backupsoftware, Transport SSH, Daten ZFS  
Quelle |&gt; Pullserver  
  
</p>

<p class="callout success">zfs **recv** | ssh root@quelle zfs **send** #Pull Replikation via SSH  
</p>

##### Von PVE zu PVE, was uns zu wenig ist

[![Bildschirmfoto 2025-01-23 um 16.26.18.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-23-um-16-26-18.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-23-um-16-26-18.jpg)

[![Bildschirmfoto 2025-01-23 um 16.26.33.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-23-um-16-26-33.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-23-um-16-26-33.jpg)

[![Bildschirmfoto 2025-01-23 um 16.26.37.jpg](https://aow.de/uploads/images/gallery/2025-01/scaled-1680-/bildschirmfoto-2025-01-23-um-16-26-37.jpg)](https://aow.de/uploads/images/gallery/2025-01/bildschirmfoto-2025-01-23-um-16-26-37.jpg)

<p class="callout warning">Proxmox baut selbst keine Notfallpunkte auf und nutzt ZFS nur als Transport, nimmt jedoch manuelle und automatisierte Snapshots mit, auch von Z-A-S!</p>

<p class="callout warning">Weitere Kopien per ZFS sind nur per Pushverfahren möglich, was ideal für Angreifer ist wenn sie alles löschen möchten. Ein Backupserver ist hier unverzichtbar, bei Pullreplikation gehts ggf. auch ohne. Außer Haus ist es nicht möglich ein ZFS Replikat zu senden, da sich der Partner im lokalen Cluster befinden muss!</p>

#### Nondestruktiver Rollback nach Trojanerbefallt bei Forensikbedarf