ZFS - Recupera ou repara um arquivo corrompido em um instantâneo do backup?

4

Um pool sofreu corrupção permanente de dados para arquivar dados que fazem parte de um instantâneo. Se os dados do arquivo fizessem parte do sistema de arquivos (e não fizesse parte de um instantâneo), eu poderia simplesmente recuperar o arquivo de uma cópia de backup adequada. Como posso recuperar ou reparar (e limpar erros relatados pelo ZFS para) um arquivo em um instantâneo de uma cópia do instantâneo ou de uma cópia (parcial 1 ) do conjunto?

1 Onde a cópia parcial contém pelo menos o instantâneo afetado e o instantâneo anterior também no conjunto afetado.

Exemplo

Aqui está um exemplo extremamente fácil de reproduzir:

De um prompt de shell (bash):

cd
mkdir zfs-test
for i in {1..2}; do dd if=/dev/zero of=zfs-test/tank-file$i bs=1G count=1 &> /dev/null; done

sudo zpool create tank1 ~/zfs-test/tank-file1
sudo zpool create tank2 ~/zfs-test/tank-file2

sudo zfs snapshot tank1@snapshot1
sudo sh -c 'zfs send tank1@snapshot1 | zfs receive -F tank2'

Crie um arquivo de texto / tank1 / test-text-file com conteúdo que você possa encontrar facilmente em um editor hexadecimal. Aqui está o que eu usei:

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus. Aenean leo ligula, porttitor eu, consequat vitae, eleifend ac, enim. Aliquam lorem ante, dapibus in, viverra quis, feugiat a, tellus. Phasellus viverra nulla ut metus varius laoreet. Quisque rutrum. Aenean imperdiet. Etiam ultricies nisi vel augue. Curabitur ullamcorper ultricies nisi. Nam eget dui.

Novamente em um prompt de shell:

sudo zfs snapshot tank1@snapshot2
sudo sh -c 'zfs send -i tank1@snapshot1 tank1@snapshot2 | zfs receive -F tank2'

Agora você precisa corromper os dados do arquivo. Eu usei ht e procurei por "dui" e mudei para "duh".

Você pode confirmar que os dados estão corrompidos:

sudo zpool scrub tank1; sudo zpool status -v tank1
  pool: tank1
 state: ONLINE
status: One or more devices has experienced an error resulting in data
        corruption.  Applications may be affected.
action: Restore the file in question if possible.  Otherwise restore the
        entire pool from backup.
   see: http://zfsonlinux.org/msg/ZFS-8000-8A
  scan: scrub repaired 0 in 0h0m with 1 errors on Sun Jan 11 20:16:30 2015
config:

        NAME                               STATE     READ WRITE CKSUM
        tank1                              ONLINE       0     0     1
          /home/kenny/zfs-test/tank-file1  ONLINE       0     0     2

errors: Permanent errors have been detected in the following files:

        tank1@snapshot2:/test-text-file
    
por Kenny Evitt 12.01.2015 / 02:53

2 respostas

1

Aqui está a minha solução ligeiramente generalizada:

sudo cp /tank2/test-text-file /tank1/test-text-file
sudo zfs snapshot tank1@snapshot3
sudo sh -c 'zfs send -i tank1@snapshot2 tank1@snapshot3 | zfs receive -F tank2'
sudo zfs rollback -r tank1@snapshot1
sudo sh -c 'zfs send -i tank2@snapshot1 tank2@snapshot3 | zfs receive -F tank1'
sudo zpool scrub tank1; sudo zpool status -v tank1

E supondo que não há outros erros relatados:

sudo zpool clear tank1

A razão pela qual eu criei snapshot3 não foi porque era necessário para o meu exemplo (extremamente artificial), mas porque provavelmente é um bom hábito de se desenvolver (e eu originalmente queria testar se funcionaria, como eu esperou). Se houvesse outras alterações em tank1 desde snapshot2 , eu preferiria não perdê-las para recuperar test-text-file .

    
por 12.01.2015 / 02:53
2

É sempre melhor usar pools redundantes em vez de pools não redundantes (embora nem sempre seja possível). O problema acima não é provável que aconteça em um pool redundante. E é mais rápido clonar um instantâneo (para obter um arquivo dele) do que recriá-lo em algum lugar (se você, é claro, não tiver reclamações sobre hardware defeituoso).

    
por 12.01.2015 / 13:52