Wymiana martwego dysku w zpool

31

Używam 64-bitowego systemu Ubuntu Server 13.04, używając natywnego ZFS. Mam zpool składający się z 4 dysków twardych, z których jeden zmarł wczoraj i nie jest już rozpoznawany przez system operacyjny ani BIOS.

Niestety problem pojawił się dopiero po następnym uruchomieniu, więc teraz brakuje etykiety dysku i nie mogę wymienić dysku, korzystając z oficjalnych instrukcji tu i tutaj .

zpool status hermes -x

odbitki

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

Już wymieniłem dysk na nowy (który otrzymał etykietę /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ)

Dowolne z poleceń

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

nie działa z

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

ponieważ etykieta dysku, który zmarł, nie istnieje już w systemie. Próbowałem też powyższych poleceń, pomijając ścieżkę do etykiety dysku, ale bezskutecznie.

Jak mogę wymienić dysk „ghost”?

Marcus
źródło

Odpowiedzi:

38

Po niekończącym się kopaniu tej nocy w końcu znalazłem rozwiązanie. Krótka odpowiedź jest taka, że ​​za pomocą polecenia można używać identyfikatorów GUID dysków (które utrzymują się nawet po odłączeniu dysku) zpool.

Długa odpowiedź: mam identyfikator GUID dysku za pomocą zdbpolecenia, które dało mi następujące dane wyjściowe

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:

GUID, którego szukałem, 15935140517898495532umożliwił mi to

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

i wtedy

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

Po zakończeniu resilveringu wszystko znów działało dobrze. Byłoby miło dołączyć tę informację, że można użyć identyfikatora GUID dysku uzyskanego za zdbpomocą zpoolpolecenia, z podręcznikiem strony zpool.

Edytować

Jak wskazał durval poniżej, zdbpolecenie może niczego nie wyprowadzać. Następnie możesz spróbować użyć

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

jawnie wyświetlać informacje o urządzeniu (nawet jeśli brakuje go już w systemie).

Marcus
źródło
Fajnie, a następnie przed uruchomieniem dodaj za pomocą -nprzełącznika, ale również -gprzełącznik pobierze uuid w ten sposób.
Brian Thomas
Dzięki temu było to bardzo pomocne, ponieważ grzebiąc w Internecie nie mogłem znaleźć informacji na temat uzyskiwania rzeczy zebranych ze zdb.
xamox,
Szukałem od tygodni i wreszcie ta odpowiedź załatwiła sprawę. Ale identyfikatory wymienione przez zpool status(nazwy takie jak sdab) NIE były takie same jak ścieżki w /dev/disk/by-id(zwariowane długie nazwy identyfikatorów). Ale ls -la /dev/disk/by-idujawnia, że ​​wszystkie są linkami do, /dev/...więc znalazłem ten, który wskazuje na mój dysk UNAVAIL (a następnie OFFLINE) i udało mi się pomyślnie wykonać te kroki. Teraz się zmienia. Dziękuję Ci!
Matt
Alternatywnym, krótszym sposobem uzyskania identyfikatora GUID jest zpool status -gwyświetlenie statusu za pomocą identyfikatorów GUID dla każdego urządzenia. Ponadto w przypadku @Matt zpool status -Lpokaże status przy użyciu podstawowych nazw urządzeń zamiast długich /dev/disk/by-idnazw.
StarNamer,
Jesteś prawdziwym MVP wracającym ze swoim rozwiązaniem. To zadziałało dla mnie.
extracrispy
3

Problem polega na tym, że dyski są przywoływane przez identyfikatory, a nie przez urządzenie.

Oto obejście, które powinno działać:

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

Edycja: Spóźniłem się 30 sekund ...

jlliagre
źródło
Dzięki. Próbowałem utworzyć pusty link do brakującego dysku, ale ciągle to powtarzał no such device in pool.
Marcus
Moja sugestia jest prawie identyczna z tym, co zrobiłeś. Jedyna różnica polega na sposobie uzyskania przewodnika po urządzeniu. Po utworzeniu dowiązania symbolicznego do / dev / null (który różni się od pustego linku) i wyeksportowaniu / zaimportowaniu puli, pojawia się wzpool status
jlliagre
Korzystając z tej metody udało mi się przywrócić „wadliwy” dysk do trybu online bez wymiany (więc pominąłem offlinei wykonałem replacekroki). Zaimportowałem pulę drugi raz po usunięciu linku zerowego. Może to był tylko problem z etykietą napędu? W rzeczywistości nazwa napędu pozostała taka sama. Później wykonałem pełne czyszczenie i nie znaleziono błędów.
Serrano
2

@Marcus: Dzięki za opublikowanie tej doskonałej odpowiedzi na twoje pytanie, bardzo mi pomogło.

Pewnego dnia znalazłem zwrot, który może Cię zainteresować (i każdego, kto przyjdzie tutaj, a-googling w przyszłości): miałem pamięć podręczną, która została usunięta z puli (i oznaczona jako „UNAVAIL”) z powodu tego samego błędu (ZFS-8000-4J, „brak etykiety lub jest ona nieprawidłowa”) i próba jej wyłączenia / usunięcia / zastąpienia nie powiodła się z dokładnie tym samym komunikatem „brak takiego urządzenia w puli”.

ALE, kiedy próbowałem zastosować twoje rozwiązanie, zwykły „zdb” (bez argumentów) nie wyświetlał urządzenia, a tym bardziej jego GUID.

Po pewnym kopaniu okazało się, że „zdb -l / dev / DEVICENAME” wyświetla GUID (biorąc go bezpośrednio z urządzenia, a nie z rekordów puli), a użycie tego GUID umożliwiło mi wykonanie wymiany (właściwie zrobiłem „zpool offline”, a następnie „zpool remove”, a następnie „zpool add”, które działały doskonale).

durval
źródło
Dzięki! Dodano wskazówkę w mojej zaakceptowanej odpowiedzi z odniesieniem do twojego komentarza.
Marcus
Dla mnie zdb -l /dev/...zawsze pokazywał „nie udało się rozpakować etykiety”.
Mat.
0

Miałem podobny problem:

Napęd zawiódł w taki sposób, że nie zarejestrował się już w systemie BIOS (całkowicie martwy). zpool statusWskazała, że UNAVAILABLE.

Włożyłem dysk o podobnej pojemności i udało mi się przydzielić go jako nowy, sparektóry był INUSEdyskiem. Ale tak naprawdę to nie była część zpool, raczej pula miała pamięć o brakującym dysku, myśląc, że kiedyś się pojawi.

Rozwiązaniem było najpierw upuścić brakujący dysk z zpool:

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

Następnie upuść dysk oznaczony spare-1 INUSErównież:

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

Gdy to zrobię, wygląda na to, że FreeNAS zrozumiał to bez konieczności wykonywania replacepolecenia, jednak jeśli twój system sam tego nie zrozumie, następujące polecenie powinno zastąpić jedno urządzenie drugim:

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

Na przykład:

zpool replace hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094 /dev/gptid/87410b00-adb0-11e6-9193-00241d
738094
  • Glinki pochodziły z mojego zpool statuspolecenia.
Frood
źródło