Ersetzen eines toten Datenträgers in einem Zpool

31

Ich verwende Ubuntu Server 13.04 64-Bit mit nativem ZFS. Ich habe einen Zpool bestehend aus 4 Festplatten, von denen eine gestern gestorben ist und jetzt vom Betriebssystem oder vom BIOS nicht mehr erkannt wird.

Leider habe ich das Problem erst nach dem nächsten Neustart gesehen, so dass jetzt die Laufwerksbezeichnung fehlt und ich die Festplatte nicht anhand der offiziellen Anweisungen hier und hier austauschen kann .

zpool status hermes -x

druckt

root@zeus:~# zpool status hermes -x
  pool: hermes
 state: DEGRADED
status: One or more devices could not be used because the label is missing or
        invalid.  Sufficient replicas exist for the pool to continue
        functioning in a degraded state.
action: Replace the device using 'zpool replace'.
   see: http://zfsonlinux.org/msg/ZFS-8000-4J
  scan: scrub repaired 0 in 2h4m with 0 errors on Sun Jun  9 00:28:24 2013
config:

        NAME                         STATE     READ WRITE CKSUM
        hermes                       DEGRADED     0     0     0
          raidz1-0                   DEGRADED     0     0     0
            ata-ST3300620A_5QF0MJFP  ONLINE       0     0     0
            ata-ST3300831A_5NF0552X  UNAVAIL      0     0     0
            ata-ST3200822A_5LJ1CHMS  ONLINE       0     0     0
            ata-ST3200822A_3LJ0189C  ONLINE       0     0     0

errors: No known data errors

Ich habe das Laufwerk bereits durch ein neues ersetzt (mit dem Etikett /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ)

Beliebiger der Befehle

zpool replace hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
zpool offline hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X
zpool detatch hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X

scheitert mit

root@zeus:~# zpool offline hermes /dev/disk/by-id/ata-ST3300831A_5NF0552X
cannot offline /dev/disk/by-id/ata-ST3300831A_5NF0552X: no such device in pool

weil das Etikett des Laufwerks, das gestorben ist, nicht mehr im System vorhanden ist. Ich habe auch versucht, die obigen Befehle auszuführen, wobei der Pfad zum Etikett des Laufwerks erfolglos ausgelassen wurde.

Wie kann ich die "Ghost" -Diskette ersetzen?

Marcus
quelle

Antworten:

38

Nachdem ich diese Nacht endlos gebuddelt hatte, fand ich endlich die Lösung. Die kurze Antwort lautet, dass Sie die GUIDs der Datenträger (die auch nach dem Trennen eines Laufwerks bestehen bleiben) mit dem zpoolBefehl verwenden können.

Lange Antwort: Ich habe die GUID der Festplatte mit dem zdbBefehl erhalten, der mir die folgende Ausgabe gab

root@zeus:/dev# zdb
hermes:
    version: 28
    name: 'hermes'
    state: 0
    txg: 162804
    pool_guid: 14829240649900366534
    hostname: 'zeus'
    vdev_children: 1
    vdev_tree:
        type: 'root'
        id: 0
        guid: 14829240649900366534
        children[0]:
            type: 'raidz'
            id: 0
            guid: 5355850150368902284
            nparity: 1
            metaslab_array: 31
            metaslab_shift: 32
            ashift: 9
            asize: 791588896768
            is_log: 0
            create_txg: 4
            children[0]:
                type: 'disk'
                id: 0
                guid: 11426107064765252810
                path: '/dev/disk/by-id/ata-ST3300620A_5QF0MJFP-part2'
                phys_path: '/dev/gptid/73b31683-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
            children[1]:
                type: 'disk'
                id: 1
                guid: 15935140517898495532
                path: '/dev/disk/by-id/ata-ST3300831A_5NF0552X-part2'
                phys_path: '/dev/gptid/746c949a-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
            children[2]:
                type: 'disk'
                id: 2
                guid: 7183706725091321492
                path: '/dev/disk/by-id/ata-ST3200822A_5LJ1CHMS-part2'
                phys_path: '/dev/gptid/7541115a-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
            children[3]:
                type: 'disk'
                id: 3
                guid: 17196042497722925662
                path: '/dev/disk/by-id/ata-ST3200822A_3LJ0189C-part2'
                phys_path: '/dev/gptid/760a94ee-537f-11e2-bad7-50465d4eb8b0'
                whole_disk: 1
                create_txg: 4
    features_for_read:

Die GUID, nach der ich gesucht habe 15935140517898495532, hat es mir ermöglicht

root@zeus:/dev# zpool offline hermes 15935140517898495532
root@zeus:/dev# zpool status
  pool: hermes
 state: DEGRADED
status: One or more devices has been taken offline by the administrator.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
action: Online the device using 'zpool online' or replace the device with
        'zpool replace'.
  scan: scrub repaired 0 in 2h4m with 0 errors on Sun Jun  9 00:28:24 2013
config:

        NAME                         STATE     READ WRITE CKSUM
        hermes                       DEGRADED     0     0     0
          raidz1-0                   DEGRADED     0     0     0
            ata-ST3300620A_5QF0MJFP  ONLINE       0     0     0
            ata-ST3300831A_5NF0552X  OFFLINE      0     0     0
            ata-ST3200822A_5LJ1CHMS  ONLINE       0     0     0
            ata-ST3200822A_3LJ0189C  ONLINE       0     0     0

errors: No known data errors

und dann

root@zeus:/dev# zpool replace hermes 15935140517898495532 /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
root@zeus:/dev# zpool status
  pool: hermes
 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 Sun Jun  9 01:44:36 2013
    408M scanned out of 419G at 20,4M/s, 5h50m to go
    101M resilvered, 0,10% done
config:

        NAME                            STATE     READ WRITE CKSUM
        hermes                          DEGRADED     0     0     0
          raidz1-0                      DEGRADED     0     0     0
            ata-ST3300620A_5QF0MJFP     ONLINE       0     0     0
            replacing-1                 OFFLINE      0     0     0
              ata-ST3300831A_5NF0552X   OFFLINE      0     0     0
              ata-ST3500320AS_9QM03ATQ  ONLINE       0     0     0  (resilvering)
            ata-ST3200822A_5LJ1CHMS     ONLINE       0     0     0
            ata-ST3200822A_3LJ0189C     ONLINE       0     0     0

errors: No known data errors

Nach dem Versilbern hat alles wieder gut geklappt. Es wäre schön gewesen, diese Information einzubeziehen , dass Sie die GUID eines Datenträgers, die Sie zdbmit dem zpoolBefehl erhalten haben, mit der Manpage von zpool verwenden können.

Bearbeiten

Wie von durval unten ausgeführt, gibt der zdbBefehl möglicherweise nichts aus. Dann können Sie versuchen, zu verwenden

zdb -l /dev/<name-of-device>

um explizit Informationen über das Gerät aufzulisten (auch wenn es bereits im System fehlt).

Marcus
quelle
Kühlen Sie ab, bevor Sie add using -nswitch -gausführen , aber auch der Switch greift auf diese Weise nach der uuid.
Brian Thomas
Vielen Dank, das war sehr hilfreich, da ich im Internet stöberte und keine Informationen darüber finden konnte, wie man etwas von zdb abruft.
Xamox
Ich habe wochenlang gesucht und endlich hat diese Antwort den Trick getan. Aber die IDs, die durch zpool status(Namen wie sdab) aufgelistet wurden, waren NICHT die gleichen wie die Pfade in /dev/disk/by-id(verrückte lange ID-Namen). Es ls -la /dev/disk/by-idzeigt sich jedoch, dass es sich bei allen um Links handelt, /dev/...sodass ich denjenigen gefunden habe, der auf meine UNAVAIL- (und anschließend OFFLINE-) Festplatte verweist, und diese Schritte erfolgreich ausführen konnte. Es ist jetzt resilvering. Vielen Dank!
Matt
Eine alternative kürzere Methode zum Abrufen der GUID besteht darin zpool status -g, den Status mithilfe von GUIDs für jedes Gerät anzuzeigen. Außerdem wird für @Matt zpool status -Lder Status unter Verwendung der grundlegenden Gerätenamen anstelle der langen /dev/disk/by-idNamen angezeigt .
StarNamer
Sie sind ein echter MVP, der mit Ihrer Lösung zurückkommt. Das hat bei mir funktioniert.
Extra knusprige
3

Das Problem ist, dass die Festplatten nach IDs und nicht nach Gerät referenziert werden.

Hier ist eine Problemumgehung, die funktionieren sollte:

ln -s /dev/null /dev/ata-ST3300831A_5NF0552X
zpool export hermes
zpool import hermes
zpool status
# note the new device name that should appear here
zpool offline hermes xxxx
zpool replace hermes xxxx /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ

Edit: Ich war 30 Sekunden zu spät ...

jlliagre
quelle
Vielen Dank. Ich habe versucht, einen leeren Link zum fehlenden Laufwerk zu erstellen, aber es wurde immer wieder darauf hingewiesen no such device in pool.
Marcus
Mein Vorschlag ist fast identisch mit dem, was Sie getan haben. Der einzige Unterschied ist die Art und Weise, wie die Geräteführung erstellt wird. Nachdem Sie einen Symlink zu / dev / null erstellt haben (der sich von einem leeren Link unterscheidet) und den Pool exportiert / importiert haben, wird er am zpool status
9.
Mit dieser Methode habe ich es tatsächlich geschafft, das "defekte" Laufwerk wieder in den Online-Zustand zu versetzen, ohne es zu ersetzen (also habe ich übersprungen offlineund replaceSchritte ausgeführt). Ich habe den Pool ein zweites Mal importiert, nachdem ich den Null-Link entfernt habe. Vielleicht war es nur ein Problem mit der Laufwerksbezeichnung? Tatsächlich blieb der Laufwerksname gleich. Ich habe danach ein komplettes Peeling durchgeführt und keine Fehler gefunden.
Serrano
2

@Marcus: Danke, dass du diese ausgezeichnete Antwort auf deine eigene Frage gepostet hast, das hat mir sehr geholfen.

Neulich habe ich eine Wendung entdeckt, die Sie interessieren könnte (und jeden anderen, der in Zukunft hierher kommt): Ich hatte ein Cache-Gerät, das aufgrund desselben Fehlers aus dem Pool entfernt (und als "UNAVAIL" markiert) wurde (ZFS-8000-4J, "Etikett fehlt oder ist ungültig") und der Versuch, es offline zu schalten / zu entfernen / zu ersetzen, schlug mit genau der Meldung "Kein solches Gerät im Pool" fehl.

Aber, als ich versuchte , Ihre Lösung anzuwenden, plain „ZDB“ (ohne Argumente) hat nicht die Geräteliste, viel weniger seinen GUID.

Nach einigem Durchsuchen stellte ich fest, dass "zdb -l / dev / DEVICENAME" die GUID auflistete (direkt vom Gerät und nicht von den Pool-Datensätzen) und die Verwendung dieser GUID den Austausch ermöglichte (tatsächlich habe ich eine durchgeführt) "zpool offline" gefolgt von einem "zpool remove" und einem "zpool add" (was perfekt funktioniert hat).

durval
quelle
Vielen Dank! A fügte einen Hinweis in meiner eigenen akzeptierten Antwort mit einem Verweis auf Ihren Kommentar hinzu.
Marcus
Für mich zdb -l /dev/...zeigte immer "Etikett konnte nicht entpackt werden".
Matt
0

Ich hatte ein ähnliches Problem:

Das Laufwerk ist so ausgefallen, dass es sich nicht mehr im BIOS registriert hat (völlig tot). Das zpool statusdeutete darauf hin, dass es war UNAVAILABLE.

Ich habe eine ähnliche Kapazität Laufwerk in, und ich schaffte es als ein neues zuzuordnen , sparedie war INUSEund Resilvering durchgeführt das Laufwerk. Aber es war eigentlich kein Teil des Zpools, sondern der Pool hatte eine Erinnerung an das fehlende Laufwerk und dachte, es würde eines Tages wieder erscheinen.

Die Lösung bestand darin, zuerst das fehlende Laufwerk aus dem zpool zu löschen:

[root@hactar ~]# zpool detach hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094  

Lassen Sie dann das mit gekennzeichnete Laufwerk fallen spare-1 INUSE:

[root@hactar ~]# zpool detach hactar_data /dev/gptid/f2089b59-2654-11e5-8d99-00241d738094

Sobald ich das getan habe, sieht es so aus, als hätte FreeNAS es herausgefunden, ohne dass ich einen replaceBefehl ausführen muss. Wenn Ihr System es jedoch nicht selbst herausfindet, sollte der folgende Befehl ein Gerät durch das andere ersetzen:

zpool replace {your_poolname} {drive to be replaced} {new drive to take its place}

Beispielsweise:

zpool replace hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094 /dev/gptid/87410b00-adb0-11e6-9193-00241d
738094
  • Die gptids kamen von meinem zpool statusBefehl.
Frood
quelle