zfs pools migrieren zwischen LXCs?

Für den Trick...

In dem Pool existiert bereits ein raidz-vdev. (#34).

Somit ist nach meinem Verständnis das Entfernen eines beliebigen vdevs nicht mehr möglich, egal ob das eine einzelne Platte oder ein Mirror ist.

Ich lasse ich mich aber wirklich gerne vom Gegenteil überzeugen!

---
Spezialisten könnten eventuell per "zdb rollback" alle Transaktionen seit dem "add" rückgängig machen. Aber in der Liga spiele ich nicht...
 
  • Like
Reactions: Johannes S
Danke @UdoB ich habe es grade versucht und hatte mit meiner ZFS Version kein Erfolg.
Code:
zfs-2.2.7-pve1
zfs-kmod-2.2.6-pve1

Die Testumgebung waren 6x 1GB Raw-Dateien, die über /dev/loopN verfügbar gemacht wurden.
Mit diesen Loop-Device konnte ich ein ZFS Pool "tpool" erzeugen:
zpool create tpool [-n] raidz1 /dev/loop0 /dev/loop1 /dev/loop2 /dev/loop3
zfs set atime=off tpool
zfs set com.sun:auto-snapshot=false tpool

Code:
zpool list -v tpool
NAME         SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tpool       3.75G   233K  3.75G        -         -     0%     0%  1.00x    ONLINE  -
  raidz1-0  3.75G   233K  3.75G        -         -     0%  0.00%      -    ONLINE
    loop0      1G      -      -        -         -      -      -      -    ONLINE
    loop1      1G      -      -        -         -      -      -      -    ONLINE
    loop2      1G      -      -        -         -      -      -      -    ONLINE
    loop3      1G      -      -        -         -      -      -      -    ONLINE

Das fehlerhafte ZFS Command konnte ich identifiziere:
zpool add tpool [-n] -f /dev/loop4

Code:
zpool list -v tpool
NAME         SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
tpool       4.69G   298K  4.69G        -         -     0%     0%  1.00x    ONLINE  -
  raidz1-0  3.75G   284K  3.75G        -         -     0%  0.00%      -    ONLINE
    loop0      1G      -      -        -         -      -      -      -    ONLINE
    loop1      1G      -      -        -         -      -      -      -    ONLINE
    loop2      1G      -      -        -         -      -      -      -    ONLINE
    loop3      1G      -      -        -         -      -      -      -    ONLINE
  loop4        1G    14K   960M        -         -     0%  0.00%      -    ONLINE
Code:
zpool status tpool -v
  pool: tpool
 state: ONLINE
config:
    NAME        STATE     READ WRITE CKSUM
    tpool       ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        loop0   ONLINE       0     0     0
        loop1   ONLINE       0     0     0
        loop2   ONLINE       0     0     0
        loop3   ONLINE       0     0     0
      loop4     ONLINE       0     0     0

Auch kann man aus dem einzelnen Device loop4 eine Mirror erzeugen:
zpool attach tpool /dev/loop4 /dev/loop5

Code:
zpool status tpool -v
  pool: tpool
 state: ONLINE
  scan: resilvered 22.5K in 00:00:00 with 0 errors on Thu Jan 30 21:45:03 2025
config:
    NAME        STATE     READ WRITE CKSUM
    tpool       ONLINE       0     0     0
      raidz1-0  ONLINE       0     0     0
        loop0   ONLINE       0     0     0
        loop1   ONLINE       0     0     0
        loop2   ONLINE       0     0     0
        loop3   ONLINE       0     0     0
      mirror-1  ONLINE       0     0     0
        loop4   ONLINE       0     0     0
        loop5   ONLINE       0     0     0

So wären die Daten, die im ZFS Stripe mirror-1 angelegt werden, sicherer.

Man kann darauf auch wirklich schreiben:
Code:
dd if=/dev/random of=/tpool/a.raw bs=1M count=1024 status=progress
1026555904 Bytes (1,0 GB, 979 MiB) kopiert, 7 s, 142 MB/s
1024+0 Datensätze ein
1024+0 Datensätze aus
1073741824 Bytes (1,1 GB, 1,0 GiB) kopiert, 7,37372 s, 146 MB/s

Leider konnte ich mich an das Verfahren der Trennung nicht mehr erinnern.
Also bleibt nur noch das Kopieren, evtl. über zfs send | zfs receive auf einen neuen Pool, um die Daten anschließen auf den alten/ neuerzeugten Pool zurück zu spielen.
 
Last edited:
  • Like
Reactions: UdoB
Jep, ich bin da über was gestolpert, das ich mir hätte logisch überlegen können.

Ich hätte erwartet, dass zpool add abgelehnt wird, wenn das ganze keinen Sinn macht. Allerdings war auch diese Platte nicht mit einem sinnvollen EFI header versehen und so kam der Hinweis -f zu verwenden in Bezug auf den EFI header. -f hat aber wohl auch dafür gesorgt, dass nun das sinnlose Kommando ebenfalls durchgezogen wurde:

Code:
~# zpool add mediapool /dev/disk/by-id/ata-ST12000NM0127_ZJV2TLHK
invalid vdev specification
use '-f' to override the following errors:
/dev/disk/by-id/ata-ST12000NM0127_ZJV2TLHK contains a corrupt primary EFI label.
~# zpool add mediapool /dev/disk/by-id/ata-ST12000NM0127_ZJV2TLHK -f
~# zpool status mediapool
  pool: mediapool
 state: ONLINE
  scan: resilvered 7.91T in 15:57:40 with 0 errors on Wed Jan 29 08:25:11 2025
config:

        NAME                                   STATE     READ WRITE CKSUM
        mediapool                              ONLINE       0     0     0
          raidz1-0                             ONLINE       0     0     0
            ata-ST12000NE0008-2JL101_ZHZ5TZNZ  ONLINE       0     0     0
            ata-ST12000NE0008-2JL101_ZHZ5WK34  ONLINE       0     0     0
            ata-ST12000NE0008-2JL101_ZHZ5Z3NT  ONLINE       0     0     0
            ata-ST12000NM0127_ZJV5HHF9         ONLINE       0     0     0
          ata-ST12000NM0127_ZJV2TLHK           ONLINE       0     0     0

errors: No known data errors

Backup läuft, dann zerlege ich den pool und baue ihn neu, es sei denn, es hat noch jemand eine Idee.
 
Stopp man sieht doch am resilvering, dass die Daten umkopiert worden sind. Du betreibst nun ein ZFS Pool als Red Z1 und stripe mit genau einer Festplatte. Wenn diese nun stirbt, dann ist dein Pool defekt und kann nicht repariert werden. Deshalb auch der Hinweis auf das Mirroring diese einzelnen Festplatte.
Oder anders ausgedrückt das Überleben deines ZFS Pools hängt nun nur noch an einer einzigen Festplatte!
 
Last edited:
Ja sieht so aus, als wäre da was drauf.

Code:
~# zpool list mediapool -v
NAME                                    SIZE  ALLOC   FREE  CKPOINT  EXPANDSZ   FRAG    CAP  DEDUP    HEALTH  ALTROOT
mediapool                              54.5T  32.3T  22.3T        -         -     0%    59%  1.00x    ONLINE  -
  raidz1-0                             43.6T  32.3T  11.4T        -         -     0%  73.9%      -    ONLINE
    ata-ST12000NE0008-2JL101_ZHZ5TZNZ  10.9T      -      -        -         -      -      -      -    ONLINE
    ata-ST12000NE0008-2JL101_ZHZ5WK34  10.9T      -      -        -         -      -      -      -    ONLINE
    ata-ST12000NE0008-2JL101_ZHZ5Z3NT  10.9T      -      -        -         -      -      -      -    ONLINE
    ata-ST12000NM0127_ZJV5HHF9         10.9T      -      -        -         -      -      -      -    ONLINE
  ata-ST12000NM0127_ZJV2TLHK           10.9T  1.69M  10.9T        -         -     0%  0.00%      -    ONLINE
root@tardis:~#

Um den Durchsatz beim Backup zu erhöhen, kann ich das resilvering stoppen?
Bislang sehe ich nur die Möglichkeit, den Drive zu detachen. Aber das geht in meinem fall ja nicht.
 
Meine Dummheit hin oder her, dass das -f bei einem "zpool add" sinnvolle aber auch sinnlose oder gefährliche Operationen überschreibt ist meines Erachtens nach ein Bug...

Wäre es nicht sinnvoller, wenn das Hinzufügen eines zu kleinen Drives in ein nicht vorhandenes Mirror-Setup zuerst mal bemängelt würde und das mit dem EFI Header dann erst bei einer sinnvollen Parameter-Übergabe erfolgt?

Wie bei meinem Auto, wo die eingeblendete Glatteiswarnung die Meldung überlagert, dass ein Reifen platt ist und letztere durch erstere auch gleich gelöscht wird.
 
Das Backup läuft noch, aber dumm ist nur wer es zweimal falsch macht, daher meine Frage vom Anfang noch mal:

Ein Pool soll ja Basis für große Dateien werden, also Videos, Roh Videos für den Schnitt und Musik. Dafür stehen jetzt dann physikalisch 5x 12TB zur Verfügung, eine 6. Platte kommt noch.

Schritt 1: Möglichst großen einfach gesicherten Pool erzeugen. RADIZ1? Und welche ashift Werte machen bei großen Dateien Sinn?
Schritt 2: Pool vergrößern, wenn die 6. Platte ausgetauscht ist.
Alternativ: Pool schneller machen.

Im Netz sind die Posts auch nicht ganz eindeutig, was die Möglichkeiten angeht. Da liest man auch, dass man bei 6 Drives mindestens RAIDZ2 machen muss? Aber leider filtert das Netz nicht nach veralteten Angaben. Gerade ZFS hat eine sehr lange Entwicklung hinter sich und man findet viel Zeugs, das unvollständig bis falsch / obsolet ist.

Vielleicht kann mir das noch mal jemand erklären? Danke!
 
Last edited:
Guten Morgen,
ich habe ein ähnlichen ZFS Setup am laufen, Eingesetzt wurden 6x HDDs, als 3x HDD VDEV-0 RaidZ1, Stripe, 3x HDD VDEV-1 RaidZ1 und 2x SSD für das VDEV-2 Mirror als Special Device.

Von einem ZFS Pool mit nur einem VDEV-0 RaidZn mit nur HDDs ist abzuraten, da die IOPS nur die einer einzelnen HDD darstellen.

Als Organisationsform:
1) RaidZ1 bedeute eine Parität wird über alle Festplatten, d.h. man schreibt einen Block 128k der wird über alle 2 HDD Verteilt und zusätzlich noch auf der 3ten HDD eine Parität angelegt, welche das sind ist völlig unbekannt.

2) RaidZ2 bedeute zwei Paritäten werden über alle Festplatten, d.h. man schreibt einen Block 128k der wird über alle 2 HDD Verteilt und zusätzlich noch auf der 3.ten und 4.ten HDD je die selbe Parität angelegt, welche das sind ist völlig unbekannt.

Man beachte, die Metadaten müssen auch noch geschrieben werden.

3) Nutzt man nun ZFS VDEV-0 RaidZ1 (3x HDD) - ZFS Stripe - ZFS VDEV-1 RaidZ1 (3x HDD) so kann man parallel den Block mit 128k auf 2 ZFS VDEVs schreiben. Und das mit doppelter Geschwindigkeit, das bedeutet 2x IOPS.

Man beachte, die Metadaten müssen auch noch geschrieben werden.

Das ist schon besser schneller als Fall 1) und 2) aber noch nicht perfekt.

3.a) Ergänzt man nun den ZFS Pool: ZFS VDEV-0 RaidZ1 (3x HDD) - ZFS Stripe - ZFS VDEV-1 RaidZ1 (3x HDD)
noch mit einem SSD (SATA3) ZFS VDEV-2 Special Device mit mindestens 2x SSDs Mirror,
dann sind die gesamten Metadaten auf dem schnellen SSD Datenspeicher.

So kann der ZFS Pool aus Bsp. 3) auch mit maximaler Geschwindigkeit laufen.

Bei mir kann ich eine 2.5 GBit/s Netzwerk damit bespielen und ich hebe meine Rohdaten an Videomaterial dort auch auf.
 
Last edited:
Danke noch mal @news für deine unendliche Geduld!

Ich habe das grundsätzliche Verfahren, wie RAID / RAIDZ funktioniert verstanden. Das ist kein Problem. Und ich verstehe langsam meine zukünftige Vision von einem System, dass ich gerne umsetzen möchte und Deinem ähnelt.

Ich verstehe vollkommen, dass Du mir jetzt schon gleich am Anfang die besten Optionen aufzeigst. Aber die kann ich aktuell nicht umsetzen, werde aber in ein paar Monaten sehr genau darauf zurück kommen. Ich hatte ja schon erwähnt, dass ich alle Platten aus dem Proxmox Server entfernen werde und zwei gespiegelte TrueNAS Systeme als VDEV in Proxmox hinzufügen werden. Und da sprechen wir noch mal über Optimierungen Richtung Speed.

Aktuell muss ich mit dem auskommen was ich habe. Und ich denke, das geht vielen so, dass sie mit dem, was sie haben, erst einmal einsteigen möchten und dann soll alles besser werden. Learning with what you have ;)

1) Laut https://www.delphix.com/blog/zfs-raidz-stripe-width-or-how-i-learned-stop-worrying-and-love-raidz sollte man keine zu breiten RAIDZ aufbauen. Technisch ist es aber machbar, dass man eben doch 6 Disks mit nur RAIDZ1 betreibt.
2) Laut Deiner und anderer Aussagen kommen IOPS richtig erst durch Mirroring, da das ZFS dann dort schreibt, wo gerade ein IO Slot frei ist.
Verstanden.

Nun habe ich noch eine 512GB SSD übrig, was kann ich mit der sinnvolles machen?
Liest man https://klarasystems.com/articles/openzfs-understanding-zfs-vdev-types/ birgt eine einzelne Consumer-SSD mehr Risiko als Nutzen, wenn man sie als CACHE oder andere SPECIAL device einsetzt. https://www.admin-magazine.com/HPC/Articles/Tuning-ZFS-for-Speed-on-Linux/(offset)/4 setzt NVMe ein um auf zwei Partitionen einmal einen CACHE und einmal ein LOG zu fahren.
Das sind aber High-Performance Optimierungen und diese benötige ich nach meiner Vorstellung erst einmal nicht, da ich zwar ein paar Container auf dem Proxmox laufen lasse, diese aber primär reine Datenablagen sind.

Vielleicht wird jetzt klarer, warum ich ZUNÄCHST alle Optimierungen Richtung Geschwindigkeit verweigere, denn ich muss netto möglichst viel relativ zuverlässigen Speicherplatz haben.

Übrigens bringen einige andere Kleinigkeiten eine Menge Speed in ein veraltets System:
Für reine "sequenzielle" Datenspeicher mit bereits vorkomprimierten Daten (mp4, mpegs2, mp3...)
zfs set atime=off mediapool
zfs set compression=off mediapool
und ein von 800MB auf 4GB erhöhtes ARC via
~# echo 4294967296 |sudo tee -a /sys/module/zfs/parameters/zfs_arc_max

Nun habe ich einen sehr viel konstanteren Durchsatz bei einem parallelen Kopieren mit einem rsync und einem samba share.
 
Meine Dummheit hin oder her, dass das -f bei einem "zpool add" sinnvolle aber auch sinnlose oder gefährliche Operationen überschreibt ist meines Erachtens nach ein Bug...

Nun ja, die Doku sagt dazu folgendes:

-f Forces use of vdevs, even if they appear in use, have conflicting ashift values, or specify a conflicting replication level. Not all devices can be overridden in this manner.
https://openzfs.github.io/openzfs-docs/man/master/8/zpool-add.8.html

Mit anderen Worten: Normalerweise meckert zpool add wenn das vdev bereits in Nutzung zu sein scheint, mit -f wird genau das dann abgeschaltet.
Das ist also kein Bug, sondern "works as designed", da es eben genau dafür da ist, solche Warnungen zu ignorieren. Und ja, zfs geht (wie die meisten Unix-CLI-Tools) davon aus, dass sich ein Admin vorher überlegt, welche sonstigen Konsequenzen das mit sich bringen könnte.
Wäre es nicht sinnvoller, wenn das Hinzufügen eines zu kleinen Drives in ein nicht vorhandenes Mirror-Setup zuerst mal bemängelt würde und das mit dem EFI Header dann erst bei einer sinnvollen Parameter-Übergabe erfolgt?

Warum? Das wäre doch doppelt gemoppelt (siehe oben)
 
Last edited:
  • Like
Reactions: Astralix and UdoB
Danke @Johannes S, aber das mit -f hatte ich ja bereits festgestellt und lediglich das suboptimale Verhalten von -f angemängelt.
Es gibt sicher bessere Wege Sicherheitsabfragen zu implementieren. Gerade, wenn ein Parameter mehrere Warnungen triggern sollte, ist es ungeschickt die ungefährlichste und zu erwartende Warnung (EFI Header) abzufragen und alle wirklich dummen Einstellungen oder Aktionen dann stillschweigend durchzuziehen. Und dass das irgendwo steht, macht es weder sinnvoller noch weniger gefährlich. Das Thema war aber für mich auch schon abgehakt.

Daher mein letzter Post noch mal nach vorne und der Wunsch nach ein paar echten Vorschlägen für meine Speichermengen optimierte Konfiguration, statt Durchsatzoptimierung. Außerdem die Frage, ob ich mit dem 512GB Drive noch etwas anfangen kann außer ihn als CACHE zu opfern oder so einzubinden, dass alleine sein Tod zum Totalverlust eines VDEV wird.
 
Guten Mittag @Astralix danke für deine Klarstellung der Zielsetzung.
Wenn die Verfügbarkeit und die Ausfallwahrscheinlichkeit eine Rolle spielen, dann bleibt als das
a) ZFS Pool mit einem VDEV RaidZ2 und
b) für den besseren Durchsatz durch das Stripe-Set ZFS Pool ein VDEV-0 RaidZ1 mit 3x HDD und VDEV-1 RaidZ1 mit 3x HDD.
Den fall b) kann man noch später und ein VDEV als ZFS Special Device mit nxMirror mit n>=2 erweitern.

Eine ZFS Cache SSD kann man opfern und sie wird den Pool nicht beeinflussen, wenn sie mal aus fällt.
Ich nutze häufig dann 2x SSD je eine Partionen der SSDs als weiteres VDEV in Stripe-Configuration für den Pool.
Den ZFS Cache kann man auch einfach entfernen und die Partition auch anderweitig nutzen.
 
Last edited:
Mahlzeit zusammen!

Inzwischen habe ich das Backup komplettiert, das RADIZ1 mit 6 Platten neu aufgesetzt und mitten drin noch das Mainboard getauscht, da die 4 alten kernel vom AMD A8-3950 ein wenig überfordert und 16GB RAM etwas wenig waren. Jetzt steckt darin erst einmal ein E5-2680 mit 64GB RAM und das sieht nicht mehr so gelb aus im Proxmox Monitoring.

Samba läuft
Nextcloud läuft
nginx proxy läuft
Zwei Test-Instanzen von Ubuntu Desktop laufen.

Woran ich jetzt noch arbeite ist Paperless-ngx, das weigert sich noch über den nginx proxy zu laufen und ich muss mir noch überlegen, wie ich den Scanner einbinde. Aber dazu werde ich einen separaten Thread aufmachen, wenn ich nicht weiter komme. Es hat nur indirekt mit zfs zu tu.
 
  • Like
Reactions: waltar