Ken*_*itt 5 zfs data-recovery zfsonlinux
池的快照中的文件数据遭受永久性数据损坏。如果文件数据是文件系统的一部分(而不是任何快照的一部分),我可以简单地从合适的备份副本中恢复文件。如何从快照副本或池的(部分1)副本恢复或修复(并清除 ZFS 报告的错误)快照中的文件?
1部分副本至少包含受影响的快照,并且先前的快照也在受影响的池中。
这是一个易于复制的极其人为的示例:
从(bash)shell 提示符:
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'
Run Code Online (Sandbox Code Playgroud)
创建一个文本文件/tank1/test-text-file,其内容可以在十六进制编辑器中轻松找到。这是我使用的:
Lorem ipsum dolor 坐 amet,consectetuer adipiscing 精英。Aenean commodo ligula eget dolor。埃尼马萨。Cum sociis natoque penatibus et magnis disparturient 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。在 enim justo、rhoncus ut、imperdiet a、venenatis vitae、justo。Nullam dictum felis eu pede mollis pretium。整数提示。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。古怪的韵律。埃涅亚帝国。Etiam ultricies nisi vel augue。Curabitur ullamcorper ultricies nisi。
再次从 shell 提示:
sudo zfs snapshot tank1@snapshot2
sudo sh -c 'zfs send -i tank1@snapshot1 tank1@snapshot2 | zfs receive -F tank2'
Run Code Online (Sandbox Code Playgroud)
现在您需要破坏文件数据。我使用ht并搜索“dui”并将其更改为“duh”。
您可以确认数据已损坏:
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
Run Code Online (Sandbox Code Playgroud)
这是我稍微概括的解决方案:
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
Run Code Online (Sandbox Code Playgroud)
假设没有报告其他错误:
sudo zpool clear tank1
Run Code Online (Sandbox Code Playgroud)
我创建的原因snapshot3并不是因为我的(极其人为的)示例需要它,而是因为它可能是一个值得养成的好习惯(我最初想测试它是否有效,正如我所希望的那样)。如果此后有任何其他更改,我希望不要丢失它们来恢复。tank1snapshot2test-text-file