Wie ersetze ich eine Festplatte in einem nicht redundanten ZFS-Pool?

8

Ich habe ein bisschen gelesen und es sieht so aus, als würde ZFS es nicht mögen, wenn Festplatten aus nicht redundanten Arrays entfernt werden :

Mit dem zpool detachBefehl können Sie ein Gerät von einem gespiegelten Speicherpool trennen. Zum Beispiel:

# zpool detach zeepool c2t1d0

Dieser Vorgang wird jedoch abgelehnt, wenn keine anderen gültigen Replikate der Daten vorhanden sind. Zum Beispiel:

# zpool detach newpool c1t2d0
cannot detach c1t2d0: only applicable to mirror and replacing vdevs

Das Grundproblem ist verständlich: Wenn Sie die einzige Kopie eines Datenelements (ob Metadaten oder Nutzdaten) aus einem Array entfernen, sind diese Daten nicht mehr verfügbar.

Die Beispiele zum Ersetzen von Geräten in einem ZFS-Speicherpool enthalten eine grundlegende schrittweise Beschreibung zum Ersetzen eines Geräts in einem Speicherpool: Offline-Festplatte, Entfernen der Festplatte, Einlegen der Ersatzfestplatte, Ausführen zpool replace, um ZFS über die Änderung zu informieren und online die Festplatte. Dies erfordert offensichtlich, dass das Array nicht von der zu ersetzenden Festplatte abhängt, daher muss das Array redundant sein. Wenn dies vom betreffenden Laufwerk abhängt, stellt dieser Ansatz das gleiche Problem wie oben dar.

Was ist die empfohlene Methode zum Ersetzen einer Festplatte in einem nicht redundanten ZFS-Array?

Angenommen, die vorhandene Festplatte funktioniert ordnungsgemäß, und die Ersatzfestplatte hat mindestens die gleiche Größe wie die zu ersetzende Festplatte. (Wenn die vorhandene Festplatte ausgefallen ist, können Sie natürlich nur eine neue Festplatte hinzufügen und alle vom Festplattenfehler betroffenen Dateien aus der Sicherung wiederherstellen.)

ein CVn
quelle

Antworten:

3

Ich weiß nicht, ob die Dinge in `13 so anders waren, aber 'zfs replace' funktioniert in nicht redundanten Pools. Sie führen einfach den Befehl 1 aus, anstatt ihn zuerst zu trennen.

d1 ist 1G, d2 ist 2G, beide sind leere Dateien in / tmp:

/t/test #> zpool create test /tmp/test/d1
/t/test #> zpool set autoexpand=on test
/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: none requested
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d1  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1008M   258K  1008M         -     0%     0%  1.00x  ONLINE  -


/t/test #> zpool replace test /tmp/test/d1 /tmp/test/d2


/t/test #> zpool status
  pool: test
 state: ONLINE
  scan: resilvered 61K in 0h0m with 0 errors on Sun Sep 18 18:55:32 2016
config:

    NAME            STATE     READ WRITE CKSUM
    test            ONLINE       0     0     0
      /tmp/test/d2  ONLINE       0     0     0

errors: No known data errors
/t/test #> zpool list
NAME    SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
test   1.98G   408K  1.98G         -     0%     0%  1.00x  ONLINE  -
alaricljs
quelle
12
zpool attach pool old-disk new-disk

Dadurch wird die alte Festplatte in einen Spiegel mit der alten und der neuen Festplatte konvertiert und das Resilvering gestartet. Anschließend können Sie die alte Festplatte trennen.

zpool detach pool old-disk

Getestet mit Loop-Geräten:

# truncate -s 1G a b
# truncate -s 1200M c
# losetup  /dev/loop0 a
# losetup  /dev/loop1 b
# losetup  /dev/loop2 c
# zpool create test loop{0,1}
# zpool attach test loop1 loop2
# zpool status
      pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          mirror-1  ONLINE       0     0     0
            loop1   ONLINE       0     0     0
            loop2   ONLINE       0     0     0
# zpool detach test loop1
# zpool status
  pool: test
 state: ONLINE
  scan: resilvered 62K in 0h0m with 0 errors on Wed Jul 31 13:43:19 2013
config:

        NAME        STATE     READ WRITE CKSUM
        test        ONLINE       0     0     0
          loop0     ONLINE       0     0     0
          loop2     ONLINE       0     0     0
Stéphane Chazelas
quelle
Sie sagen also, dass ZFS eine solche Operation nicht nativ unterstützt? Scheint komisch. (Es scheint , dass nur beide Laufwerke verbunden sein müssen, um ZFS darüber zu informieren, dass das alte Laufwerk offline geschaltet werden soll, sodass es die Möglichkeit hat, die darauf befindlichen Daten auf andere Laufwerke zu migrieren, ähnlich wie dies der Fall wäre wenn das ein Resilvering in einem redundanten Array war.)
ein CVn
@ MichaelKjörling, das sage ich nicht. Ich sage nur, dass das oben genannte funktionieren sollte, da ich keinen Grund sehe, warum es nicht funktionieren sollte.
Stéphane Chazelas
Trotzdem sieht es so aus, als ob ZFS dies tatsächlich unterstützt. Antwort aktualisiert.
Stéphane Chazelas
Großartig! Dies ist die Art von Antwort, nach der ich gesucht habe und die ich mir erhofft habe. Ich würde dir noch +1 geben, wenn du es ausprobieren könntest.
Ein CVn