如何Freeze/Thaw ZFS 文件系统拍摄硬件快照

How to Freeze/Thaw ZFS File system to take hardware snapshots

有什么方法可以 freeze/thaw solaris 上的 zfs 文件系统,因为任何其他传统文件系统都提供此功能。我需要它来获取硬件(EMC Symmetrix 阵列)快照。

我知道 ZFS 提供 snapshot/restore 功能,但我们的要求是获取硬件快照。

卸载文件系统或导出 ZFS 池。这不仅限于 ZFS。它适用于大多数文件系统和卷管理器。

如果您希望能够在硬件设备级别为活动的、已安装的文件系统或软件管理的卷拍摄快照,并使结果成为一致文件系统的映像,那么您的要求从根本上来说是不合理的。这属于 "I want a pony" 类要求。

@AndrewHenle 的回答是正确的——今天您必须卸载/导出池才能成功暂停新 IOs。 fsfreeze is supported by most of the other widely-used filesystems in Linux, so I don't think it's unreasonable to hope that ZFS will support something similar someday. In fact, there is a feature request to support fsfreeze in ZFS on Linux here,它甚至看起来并不难实现(只是难以测试 ;-))。

也就是说,大多数人可能 不需要 在拍摄存储级快照之前使用 fsfreeze,因为崩溃一致性不需要它——如果您ZFS 之上的应用程序 运行ning 无法处理在不冻结文件系统的情况下拍摄的快照,它也无法处理您的机器进行意外的硬重启。 ZFS 在这方面比其他文件系统要好一些,因为它不需要在硬重启后重播事务日志或 运行 fsck 来确保正确性。也许这种性能下降(必须重播日志)是为什么这在其他文件系统上更为重要。

--- 编辑 ----

我记得最近有一个功能可以用来实现类似的东西,叫做 zpool checkpoint。一位前同事实现了这一点并写了一篇关于它的简短文章 here

对于您的用例,想法是当您拍摄硬件快照时:

  1. 首先你会 运行 zpool checkpoint,它将所有正在运行的 IOs 同步到磁盘并存储池的 uberblock 的副本(文件系统树中的最高级别块)包含所有这些变化。这类似于 ZFS 为单个文件系统创建快照的方式,但适用于整个池。这会创建一个序列化点,就像您将使用 fsfreeze 创建的序列化点,其中所有 IOs 在检查点必须完成之前开始,所有 IOs 在检查点未捕获之后开始。
  2. 然后拍摄存储快照。
  3. 存储快照完成后,您将丢弃实时系统上带有 zpool checkpoint --discard 的检查点,以便 ZFS 可以在磁盘被覆盖时继续释放 space(这在检查点处于活动状态,因为该数据可能仍被检查点中的某些内容引用)。
  4. 如果稍后从硬件快照恢复,运行 zpool import --rewind-to-checkpoint 而不是正常的 zpool import 将池的状态回滚到检查点,然后使用 [=丢弃检查点=17=] 因为您不打算在 运行ning 之后再次将池回滚到该点(并且您希望能够释放检查点消耗的 space)。

fsfreeze 相比,它有一个额外的优势,即它不会在采取检查点时暂停 IOs。然而,它也有缺点:(a) 它不在其他文件系统中使用,因此有点复杂,(b) 你不能轻易地将它与其他应用程序级事件同步,因为它只是发生 "sometime" 而 CLI 命令是 运行ning.