ZFS bringt RAID als eingebaute Funktion mit — kein separater Volumemanager nötig. Mirror, RAID-Z (ähnlich RAID-5), RAID-Z2 (ähnlich RAID-6) und RAID-Z3 sind direkt im Pool konfigurierbar. Spare-Platten und Striping ebenfalls.

Mirror anlegen

Einen neuen Pool direkt als Mirror erstellen:

zpool create backup mirror da0 da1

Einem bestehenden Pool eine Spiegelplatte hinzufügen:

zpool attach backup da0 da1
Make sure to wait until resilver is done before rebooting.

Wichtig: Die Reihenfolge der Platten zählt. Die erste Platte (da0) ist die Quelle, die zweite (da1) wird als Spiegel hinzugefügt. Vertauscht man die Platten, spiegelt ZFS die leere Platte auf die Datenplatte.

RAID-Z

RAID-Z verteilt Daten und Parität über mehrere Platten — ähnlich wie klassisches RAID, aber mit Copy-on-Write und ohne Write Hole:

# raidz — 1 Platte darf ausfallen (wie RAID-5), mindestens 3 Platten
zpool create tank raidz da0 da1 da2

# raidz2 — 2 Platten dürfen ausfallen (wie RAID-6), mindestens 4 Platten
zpool create tank raidz2 da0 da1 da2 da3

# raidz3 — 3 Platten dürfen ausfallen, mindestens 5 Platten
zpool create tank raidz3 da0 da1 da2 da3 da4

# Mit Hot-Spare
zpool create tank raidz da0 da1 da2 spare da3

Resilvering

Beim Resilvering zeigt sich ein großer Vorteil von ZFS: Da Dateisystem und Volumemanager nicht getrennt sind, weiß ZFS genau, wo Daten liegen. Es spiegelt nur belegte Blöcke. Ein 80-GB-Mirror mit 4 GB Daten war in 5 Minuten fertig resilvered — klassische Lösungen wie mdadm würden stumpf alle 80 GB Block für Block kopieren.

zpool status backup
  pool: backup
 state: ONLINE
  scan: resilvered 4,04G in 0h5m with 0 errors on Mon Oct 31 13:33:00 2011
config:

    NAME        STATE     READ WRITE CKSUM
    backup      ONLINE       0     0     0
      mirror-0  ONLINE       0     0     0
        da0     ONLINE       0     0     0
        da1     ONLINE       0     0     0

errors: No known data errors

Root-Pool spiegeln

Gespiegelte Daten helfen nichts, wenn die Systemplatte ausfällt und man nicht booten kann. Daher den Root-Pool ebenfalls spiegeln — und den Bootloader auf beide Platten schreiben.

Unter Solaris/OpenIndiana:

# Partitionslayout der Quellplatte auf die Zielplatte kopieren
prtvtoc /dev/rdsk/c2d0s2 | fmthard -s - /dev/rdsk/c2d1s2

# Zielplatte dem Root-Pool als Mirror hinzufügen
zpool attach -f rpool c2d0s0 c2d1s0
Make sure to wait until resilver is done before rebooting.

# Grub auf die Zielplatte schreiben
installgrub /boot/grub/stage1 /boot/grub/stage2 /dev/rdsk/c2d1s0

Unter FreeBSD ist es einfacher — gpart für die Partitionierung und gptzfsboot für den Bootloader. Unter Linux mit UEFI reicht oft ein zpool attach und die Kopie der EFI-Partition.

Praxistest — Hauptplatte gezogen, System von der Spiegelplatte gebootet:

zpool status rpool
  pool: rpool
 state: DEGRADED
config:

    NAME        STATE     READ WRITE CKSUM
    rpool       DEGRADED     0     0     0
      mirror-0  DEGRADED     0     0     0
        c2d0s0  FAULTED      0     0     0  corrupted data
        c2d1s0  ONLINE       0     0     0

errors: No known data errors

Degraded, aber online — genau wie gewünscht. Nach dem Einsetzen einer neuen Platte übernimmt zpool replace den Rest.

Details in der OpenZFS-Dokumentation zu zpool create. Mehr zu ZFS: ZFS Snapshots und ZFS Compression und Deduplication. Fragen? Einfach melden.