Substituindo um disco morto em um zpool

29

Estou executando o Ubuntu Server 13.04 de 64 bits usando o ZFS nativo. Eu tenho um zpool que consiste em 4 discos rígidos dos quais um morreu ontem e agora não é mais reconhecido pelo sistema operacional ou pelo BIOS.

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

zpool status hermes -x

imprime

[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

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 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"?

    
por Marcus 09.06.2013 / 01:25

4 respostas

33

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 após desconectar uma unidade) com o comando zpool .

Resposta longa: Eu tenho o GUID do 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 que eu estava procurando é 15935140517898495532 , o 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 GUID de um disco obtido através de zdb com o comando zpool , com a página de manual 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).

    
por Marcus 09.06.2013 / 11:41
3

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

Aqui está uma solução 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 ...

    
por jlliagre 09.06.2013 / 11:41
2

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

Outro dia encontrei uma reviravolta que pode interessar a você (e a qualquer outra pessoa que venha aqui no googling no futuro): eu tive um dispositivo de cache que foi removido da piscina (e marcado como "UNAVAIL") devido a esse 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, "zdb" simples (sem argumentos) fez não listar o dispositivo, muito menos seu GUID.

Após algumas pesquisas, descobri que "zdb -l / dev / DEVICENAME" listava o GUID (levando-o diretamente do dispositivo, e não dos registros do pool), 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).

    
por durval 31.01.2015 / 14:15
0

Eu tive um problema semelhante:

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

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

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

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

Em seguida, solte a unidade marcada com 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 , mas se o seu sistema não resolver isso 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 .
por Frood 21.11.2016 / 18:52