Vergrößern eines zpools auf FreeBSD 9.1

Schon länger betreibe ich einen Fileserver zuhause für alles was Platz braucht: Musik, Photos und Videos. Gestartet habe ich mit vier 1,5TB Festplatten als raidz1 unter FreeBSD. Hierbei dient einer der Platten als Redundanz und der pool bleibt vollständig falls eine Platte ausfällt. Als Nachteil bleiben von theoretisch 6TB nur knapp 4TB übrig. Mit der Zeit wachsen die Anforderungen und irgendwann waren auch diese 4TB zu wenig.

homeserver# zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
tank              3.87T   134G  43.4K  /mnt/tank
tank/daten        3.87T   134G  3.87T  /mnt/tank/daten

Was also tun? Ein zpool mit raidz1 hat die Eigenschaft immer die Größe der kleinsten Festplatte als Grundlage zu nehmen (logisch, oder?). Also müssen alle 4 Platten ersetzt werden, da in meinem Fileserver nicht die Möglichkeit besteht weitere Festplatten hinzuzufügen. Da ich allerdings kein zweites Gerät parat habe, konnten nicht alle Daten einfach umkopiert werden.

Die Lösung ist etwas langwierig, aber einfach:

Zuerst wird festgestellt ob autoexpand für den zpool aktiviert ist:

homeserver# zpool get autoexpand tank
NAME  PROPERTY    VALUE   SOURCE
tank  autoexpand  on      local

Falls noch nicht aktiviert, geht das so:

zpool set autoexpand=on tank

Dann wird der Server heruntergefahren und die erste Festplatte durch eine neue, größere ersetzt. Danach anschalten und das entsprechende Device ersetzen. In meinem Fall war das /dev/ada0.

homeserver# zpool replace tank ada0

Jetzt ist Geduld gefragt. In meinem Fall zwischen 24 und sogar 36 Stunden. Der aktuelle Status lässt sich so abfragen:

homeserver# zpool status -v tank
  pool: tank
 state: DEGRADED
status: One or more devices is currently being resilvered.  The pool will
        continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
 scan: resilver in progress since Thu Jan  3 10:26:51 2013
    4.98T scanned out of 5.17T at 56.2M/s, 1h0m to go
    1.25T resilvered, 96.25% done
config:

        NAME                       STATE     READ WRITE CKSUM
        tank                       DEGRADED     0     0     0
          raidz1-0                 DEGRADED     0     0     0
            replacing-0            UNAVAIL      0     0     0
              9783111906361141716  UNAVAIL      0     0     0  was /dev/ada0/old
              ada0                 ONLINE       0     0     0  (resilvering)
            ada1                   ONLINE       0     0     0
            ada2                   ONLINE       0     0     0
            ada3                   ONLINE       0     0     0

errors: No known data error

Dies muss nun für jede Festplatte wiederholt werden. Am Ende macht sich die Geduld bezahlt, es ist endlich wieder Platz:

homeserver#  zfs list
NAME               USED  AVAIL  REFER  MOUNTPOINT
tank              3.88T  4.15T  43.4K  /mnt/tank
tank/daten        3.88T  4.15T  3.88T  /mnt/tank/daten