Ole*_*nko 10 zfs data-recovery zfsonlinux
在 Debian 8.7 上,我有一个 zfs 池。(显然在 Linux 上使用 ZFS,而不是 Oracle 或 Solaris zfs)
需要将 ZFS 池从 2 个磁盘上的镜像扩展到 4 个磁盘上的 raidz。我做了备份(一份数据副本 - 这是我的第一个错误)
我认为zpool destroy
在我删除所有数据集(卷)之前这不会起作用,所以我做到了zfs destroy
(这是我的第二个错误)。
之后我发出'zpool destroy',重新分区所有4个磁盘,发现备份已损坏。
所以我开始了我的恢复冒险:ZFS 的第一个好处是它能够导入被破坏的池。之后zpool destroy yourPoolName
您可以调用zpool import -D
以查看已销毁池的列表。然后,您可以使用 imoprt 它,zpool import -D yourPoolName
或者如果您销毁了多个具有相同名称的池,那么您可以通过 id 导入它,由zpool import -D
.
zpool import -D
需要在其原始位置进行分区。它必须精确到部门。我曾经用fdisk
确切的开始和结束扇区号创建分区。我曾经cfdisk
设置分区类型(因为它对用户更友好:))然后您应该调用partprobe
以确保操作系统知道更改的分区。
zpool import -D
像魅力一样工作,我的游泳池再次处于完美健康状态!.. 但后果是zfs destroy
- 所有数据都丢失了。
ZFS 在事务中存储对文件和文件系统的更改,这些更改以事务组 (TXG) 的形式保存到磁盘。我的进一步研究表明,我必须回滚最后一个事务组。
有两种回滚 ZFS 事务组的方法:
zpool import
与-T
选项zfs_revert-0.1.py
首先你需要找到最后一个好的TXG。
zpool history -il
帮助过我。
根据第一种方式,您应该调用类似的东西:(zpool import -o readonly=on -D -f -T <LAST-GOOD-TXG> poolName
如果您喜欢-F
,可以使用附加参数:-m
,,-R
)不幸的是,此命令仅适用于实际的 TXG。甚至回溯到上一个 TXG 之前都不起作用,并显示“设备不可用”之类的错误消息。看起来此功能仅在 Solaris 上有效(或已经有效)。遗憾。
我已经分析了 的代码zfs_revert-0.1.py
,它看起来很清晰,很有前途。我用过这个工具,但看起来我需要删除太多的TXG。之后zpool import -D
就无法再检测到池了。
目前我已经恢复了一个较旧的备份,我有dd
2 个磁盘的转储,它们被镜像但在zfs destroy
和之后zpool destroy
。看起来我们只会使用旧备份中的数据并停止进一步的恢复过程。尽管如此,如果有人会建议在这种情况下该怎么做,我会很高兴尝试恢复数据。
进一步的恢复将在 VMWare Workstation 中完成,所以我需要找到一种方法如何在 VM 中导入 zpool(磁盘 ID 可能会改变)
问题 接下来我可以尝试什么?
经验教训:
zfs destroy
如果您zpool destroy
无论如何都要做,则不需要并且非常危险。评论:很明显,在恢复期间您应该完全停止向存储损坏数据的磁盘写入。
有用的命令: zpool import -D zpool import -o readonly=on -D -f originalPoolName newPoolName zpool status tank
zpool online dozer c2t11d0
zpool scrub tank
zpool history -il
zpool export tank
zpool import dozer zeepool
Run Code Online (Sandbox Code Playgroud)
链接:
工具
有关损坏的 ZFS 的信息
ZFS 导入