web-dev-qa-db-pt.com

Substituindo um disco morto em um zpool

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 sendo reconhecido pelo sistema operacional ou o BIOS mais.

Infelizmente eu vi o problema somente após a próxima reinicialização, então agora a etiqueta da unidade está faltando e não consigo substituir o disco usando as instruções oficiais aqui e aqui .

zpool status hermes -x

impressões

[email protected]:~# 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 (que recebeu o rótulo /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

[email protected]:~# 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 no sistema mais.Eu também tentei os comandos acima omitindo caminho para a etiqueta da unidade sem sucesso.

Como posso substituir o disco "fantasma"?

31
Marcus

Depois de cavar eternamente 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 comando zpool.

Resposta longa: recebi o GUIDdo disco usando o comando zdb que me deu a seguinte saída

[email protected]:/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 eu estava procurando é 15935140517898495532 que me permitiu fazer

[email protected]:/dev# zpool offline hermes 15935140517898495532
[email protected]:/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

[email protected]:/dev# zpool replace hermes 15935140517898495532 /dev/disk/by-id/ata-ST3500320AS_9QM03ATQ
[email protected]:/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 que o resilvering foi concluído, tudo funcionou bem novamente. Teria sido bom incluir essa informação, que você pode usar o GUIDdo disco _ obtido através de zdb com o comando zpool, com a página de man do zpool.

Editar

Como apontado por durval abaixo, o comando zdb pode não produzir nada. Então você pode tentar usar

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

para listar explicitamente informações sobre o dispositivo (mesmo que ele já esteja faltando no sistema).

37
Marcus

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

3
jlliagre

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

No outro dia eu encontrei uma reviravolta que pode interessar a você (e qualquer outra pessoa que vem aqui a-googling no futuro): Eu tinha um dispositivo de cache que foi retirado do pool (e marcado como "UNAVAIL") devido a este mesmo erro (ZFS-8000-4J, "rótulo ausente ou inválido"), e tentar offline/remover/substituir falhou exatamente com a mesma mensagem "nenhum dispositivo no pool".

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

Depois de algumas escavações, descobri que "zdb -l/dev/DEVICENAME" listava o GUID (tirando-o diretamente do dispositivo e não dos registros do conjunto) e usando esse GUID me permitiu fazer a substituição (na verdade eu fiz um "zpool offline" seguido por um "zpool remove" e depois um "zpool add", que funcionou perfeitamente).

2
durval

Eu tive uma questão semelhante:

A unidade falhou de tal forma que não foi mais registrada na BIOS (totalmente inoperante). O zpool status indicou que era UNAVAILABLE.

Eu coloquei uma unidade de capacidade semelhante, e eu consegui alocá-lo como um novo spare que era INUSE e resilvered a unidade. Mas, na verdade, não era parte do zpool, mas a piscina tinha uma memória da unidade perdida, achando que um dia voltaria a aparecer.

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

[[email protected] ~]# zpool detach hactar_data /dev/gptid/87410b00-adb0-11e6-9193-00241d738094  

Em seguida, solte a unidade marcada como spare-1 INUSE também:

[[email protected] ~]# zpool detach hactar_data /dev/gptid/f2089b59-2654-11e5-8d99-00241d738094

Uma vez que fiz isso, parece que o FreeNAS descobriu isso sem que eu precisasse fazer um comando replace, no entanto, se o seu sistema não descobrir sozinho, o seguinte comando 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 comando zpool status.
0
Frood