一个池已经遭受了永久性数据损坏,以便将文件数据作为快照的一部分。 如果文件数据是文件系统的一部分(而不是任何快照的一部分),我可以简单地从合适的备份副本中恢复文件。 如何从快照副本或池的(部分1 )副本中恢复或修复(并清除由ZFS报告的错误)快照中的文件?
1部分副本至less包含受影响的快照以及受影响的池上的上一个快照。
这是一个很容易重现的非常人为的例子:
从(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'
创build一个文本文件/ tank1 / test-text-file ,其内容可以在hex编辑器中轻松find。 这是我用的:
Lorem ipsum dolor sit amet,consectetuer adipiscing elit。 Aenean商品ligula eget dolor。 Aenean马萨。 Cum sociis natoque penatibus et magnis dis parturient montes,nascetur ridiculus mus。 Donec quam felis,ultricies nec,pellentesque eu,pretium quis,sem。 Nullainheritance了马萨诸塞州的森林。 Donec pede justo,fringilla vel,aliquet nec,vulputate eget,arcu。 在这个时候,我们可以看到一个人,一个人,一个人,一个人,一个人,一个人,一个人。 Nullam dictum felis eu pede mollis pretium。 整数tincidunt。 Cras dapibus。 Vivamus elementum semper nisi。 Aenean vulputate eleifend tellus Aenean leo ligula,porttitor eu,consequat vitae,eleifend ac,enim。 Aliquam lorem赌注,dapibus在,viverra quis,feugiat a,tellus。 Phasellus viverra nulla ut metus varius laoreet。 Quisque rutrum。 Aenean无瑕。 Etiam ultricies nisi vel augue。 Curabitur ullamcorper Ultricies nisi。 Nam eget dui。
再次来自shell提示符:
sudo zfs snapshot tank1@snapshot2 sudo sh -c 'zfs send -i tank1@snapshot1 tank1@snapshot2 | zfs receive -F tank2'
现在你需要破坏文件数据。 我用htsearch“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
使用冗余池而不是非冗余池总是更好(尽pipe并非总是可行)。 上述问题不太可能发生在冗余池上。 克隆快照(从中获取文件)比在某个地方重新创build快(当然,如果您对硬件故障没有抱怨),速度会更快。
这是我的稍微普遍的解决scheme:
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
并假设没有其他错误报告:
sudo zpool clear tank1
我创buildsnapshot3的原因不是因为它是我的(非常人为的)例子所需要的,而是因为它可能是一个很好的开发习惯(我本来想testing它会工作,正如我所希望的)。 如果从snapshot2开始tank1上有任何其他更改,我最好不要失去它们来恢复test-text-file 。