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