Substituindo um disco morto em um zpool

31

Estou executando o Ubuntu Server 13.04 de 64 bits usando o ZFS nativo. Eu tenho um zpool composto por 4 discos rígidos, dos quais um morreu ontem e agora não está mais sendo reconhecido pelo sistema operacional ou pelo BIOS.

Infelizmente, vi o problema somente após a próxima reinicialização. Agora, o rótulo da unidade está ausente e não posso substituir o disco usando as instruções oficiais aqui e aqui .

zpool status hermes -x

impressões

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

Eu já substituí a unidade por uma nova (com a etiqueta /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ)

Qualquer um dos comandos

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

falha com

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

porque o rótulo da unidade que morreu não existe mais no sistema. Também tentei os comandos acima, omitindo o caminho para o rótulo da unidade sem sucesso.

Como posso substituir o disco "fantasma"?

Marcus
fonte

Respostas:

38

Depois de cavar sem parar esta noite, finalmente encontrei a solução. A resposta curta é que você pode usar os GUIDs dos discos (que persistem mesmo depois de desconectar uma unidade) com o zpoolcomando

Resposta longa: obtive o GUID do disco usando o zdbcomando que me deu a seguinte saída

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:

O GUID que eu estava procurando é o 15935140517898495532que me permitiu fazer

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

e depois

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

Depois de concluída a reforma, tudo funcionou bem novamente. Seria bom incluir essas informações, pois você pode usar o GUID de um disco obtido através zdbdo zpoolcomando, com a página de manual do zpool.

Editar

Conforme indicado por durval abaixo, o zdbcomando pode não gerar nada. Então você pode tentar usar

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

para listar explicitamente informações sobre o dispositivo (mesmo se ele já estiver ausente no sistema).

Marcus
fonte
Legal, antes de executar adicione com o -nswitch, mas o -gswitch também agarra o uuid dessa maneira.
Brian Thomas
Graças a isso foi bastante útil, pois, procurando na web, não consegui encontrar informações sobre como obter coisas coletadas do zdb.
Xamox
Eu tenho procurado por semanas e finalmente esta resposta fez o truque. Mas os IDs listados por zpool status(nomes como sdab) NÃO eram os mesmos que os caminhos /dev/disk/by-id(nomes de ID longos e malucos). Mas ls -la /dev/disk/by-idrevela que todos eles são links para, /dev/...então encontrei aquele que aponta para o meu disco UNAVAIL (e posteriormente OFFLINE) e pude concluir essas etapas com êxito. Agora é resistente. Obrigado!
26417 Matt
Uma maneira alternativa mais curta de obter o GUID é zpool status -gmostrar o status usando GUIDs para cada dispositivo. Além disso, para @Matt, zpool status -Lmostrará o status usando os nomes básicos do dispositivo em vez dos /dev/disk/by-idnomes longos .
21418 StarNamer
Você é um MVP de verdade voltando com sua solução. Isso funcionou para mim.
extracrispy
3

O problema é que os discos são referenciados por IDs e não por dispositivo.

Aqui está uma solução alternativa que deve funcionar:

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: Eu estava 30 segundos atrasado ...

jlliagre
fonte
Obrigado. Eu estava tentando criar um link vazio para a unidade que estava faltando, mas continuava dizendo no such device in pool.
Marcus
Minha sugestão é quase idêntica ao que você fez. A única diferença é a maneira de obter o guia do dispositivo. Depois de criar um link simbólico para / dev / null (que é diferente de um link vazio) e exportar / importar o pool, ele aparece emzpool status
jlliagre
Usando este método eu realmente conseguiu obter o drive "defeito" de volta online sem substituí-lo (assim eu saltei offlinee replacepassos). Importei o pool uma segunda vez após remover o link nulo. Talvez tenha sido apenas um problema com a etiqueta da unidade? De fato, o nome da unidade permaneceu o mesmo. Fiz uma limpeza completa depois e nenhum erro foi encontrado.
Serrano
2

@ Marcus: Obrigado por postar esta excelente resposta à sua própria pergunta, isso me ajudou muito.

No outro dia, encontrei uma reviravolta que poderia interessar a você (e a qualquer outra pessoa que aparecer aqui pesquisando no futuro): eu tinha um dispositivo de cache que foi retirado da piscina (e marcado como "UNAVAIL") devido a esse mesmo erro (ZFS-8000-4J, "a etiqueta está ausente ou é inválida") e a tentativa de desconectá-la / removê-la / substituí-la offline falhou exatamente com a mesma mensagem "não existe esse dispositivo no pool".

MAS, quando tentei aplicar sua solução, o "zdb" simples (sem argumentos) não listou o dispositivo, muito menos seu GUID.

Após algumas pesquisas, descobri que "zdb -l / dev / DEVICENAME" listava o GUID (retirando-o diretamente do dispositivo, e não dos registros do pool), e o uso desse GUID me permitiu fazer a substituição (na verdade, fiz um "zpool offline" seguido de "zpool remove" e, em seguida, um "zpool add", que funcionou perfeitamente).

durval
fonte
Obrigado! A adicionou uma dica em minha própria resposta aceita com uma referência ao seu comentário.
Marcus
Para mim, zdb -l /dev/...sempre mostrou "falha ao descompactar etiqueta".
26517 Matt
0

Eu tive uma questão semelhante:

O drive falhou de tal maneira que não se registrou mais no BIOS (totalmente morto). O zpool statusindicou que era UNAVAILABLE.

Coloquei uma unidade de capacidade semelhante e consegui alocá-la como uma nova spareque foi INUSEe resilvei a unidade. Mas, na verdade, não fazia parte do zpool, mas a piscina tinha uma memória da unidade que faltava, pensando que algum dia apareceria novamente.

A solução foi primeiro eliminar a unidade ausente do zpool:

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

Em seguida, solte a unidade marcada spare-1 INUSEtambém:

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

Depois que fiz isso, parece que o FreeNAS descobriu sem que eu precisasse executar um replacecomando; no entanto, se o seu sistema não descobrir por si mesmo, o comando a seguir deve substituir um dispositivo pelo outro:

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

Por exemplo:

zpool replace hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094 /dev/gptid/87410b00-adb0-11e6-9193-00241d
738094
  • Os gptids vieram do meu zpool statuscomando.
Frood
fonte