ZFS 快照概述

来源:互联网 发布:java泛型和通配符差别 编辑:程序博客网 时间:2024/05/12 05:51
ZFS 快照概述
  快照是文件系统或卷的只读副本。快照几乎可以即时创建,而且最初不占用池中的其他磁盘空间。但是,当活动数据集中的数据发生更改时,快照通过继续引用旧数据占用磁盘空间,从而阻止释放该空间。
  ZFS 快照具有以下特征:
  可在系统重新引导后存留下来。
  理论最大快照数是 264
  不使用单独的后备存储。快照直接占用存储池(从中创建这些快照的文件系统所在的存储池)中的磁盘空间。
  递归快照可作为一个原子操作快速创建。要么一起创建快照(一次创建所有快照),要么不创建任何快照。原子快照操作的优点是始终在一个一致的时间捕获快照数据,即使跨后代文件系统也是如此。
  无法直接访问卷的快照,但是可以对它们执行克隆、备份、回滚等操作。
  创建和销毁 ZFS 快照
  快照是使用 zfs snapshot 命令创建的,该命令将要创建的快照的名称用作其唯一参数。快照名称按如下方式指定:
  filesystem@snapname
  volume@snapname
  在以下示例中,将创建 tank/home/ahrens 的快照,其名称为 friday。
  # zfs snapshot tank/home/ahrens@friday
  通过使用 -r 选项可为所有后代文件系统创建快照。例如:
  # zfs snapshot -r tank/home@now
  # zfs list -t snapshot
  NAME          USED AVAIL REFER MOUNTPOINT
  tank/home@now       0   - 29.5K -
  tank/home/ahrens@now   0   - 2.15M -
  tank/home/anne@now    0   - 1.89M -
  tank/home/bob@now     0   - 1.89M -
  tank/home/cindys@now   0   - 2.15M -
快照没有可修改的属性。也不能将数据集属性应用于快照。
  # zfs set compression=on tank/home/ahrens@tuesday
  cannot set compression property for 'tank/home/ahrens@tuesday': snapshot
  properties cannot be modified
  使用 zfs destroy 命令可以销毁快照。例如:
  # zfs destroy tank/home/ahrens@friday
  如果数据集存在快照,则不能销毁该数据集。例如:
  # zfs destroy tank/home/ahrens
  cannot destroy 'tank/home/ahrens': filesystem has children
  use '-r' to destroy the following datasets:
  tank/home/ahrens@tuesday
  tank/home/ahrens@wednesday
  tank/home/ahrens@thursday
  此外,如果已从快照创建克隆,则必须先销毁克隆,才能销毁快照。
  重命名 ZFS 快照
  可以重命名快照,但是必须在从中创建它们的池和数据集中对它们进行重命名。例如:
  # zfs rename tank/home/cindys@083006 tank/home/cindys@today
  此外,下面的快捷语法提供了与上例等效的快照重命名语法。
  # zfs rename tank/home/cindys@083006 today
  不支持以下快照重命名操作,因为目标池和文件系统名称与从中创建快照的池和文件系统不同。
  # zfs rename tank/home/cindys@today pool/home/cindys@saturday
  cannot rename to 'pool/home/cindys@today': snapshots must be part of same
  dataset
  可以使用 zfs rename -r 命令以递归方式重命名快照。例如:
  # zfs list
  NAME             USED AVAIL REFER MOUNTPOINT
 users            270K 16.5G  22K /users
  users/home          76K 16.5G  22K /users/home
  users/home@yesterday      0   -  22K -
  users/home/markm       18K 16.5G  18K /users/home/markm
  users/home/markm@yesterday   0   -  18K -
  users/home/marks       18K 16.5G  18K /users/home/marks
  users/home/marks@yesterday   0   -  18K -
  users/home/neil        18K 16.5G  18K /users/home/neil
  users/home/neil@yesterday    0   -  18K -
  # zfs rename -r users/home@yesterday @2daysago
  # zfs list -r users/home
  NAME            USED AVAIL REFER MOUNTPOINT
  users/home          76K 16.5G  22K /users/home
  users/home@2daysago      0   -  22K -
  users/home/markm       18K 16.5G  18K /users/home/markm
  users/home/markm@2daysago   0   -  18K -
  users/home/marks       18K 16.5G  18K /users/home/marks
  users/home/marks@2daysago   0   -  18K -
  users/home/neil       18K 16.5G  18K /users/home/neil
  users/home/neil@2daysago    0   -  18K -
  显示和访问 ZFS 快照
  在包含文件系统的根的 .zfs/snapshot 目录中,可以访问文件系统的快照。例如,如果在 /home/ahrens 上挂载了 tank/home/ahrens,则在 /home/ahrens/.zfs/snapshot/thursday 目录中可以访问 tank/home/ahrens@thursday 快照数据。
 # ls /tank/home/ahrens/.zfs/snapshot
  tuesday wednesday thursday
  可以列出快照,如下所示:
  # zfs list -t snapshot
  NAME            USED AVAIL REFER MOUNTPOINT
  pool/home/anne@monday     0   -  780K -
  pool/home/bob@monday      0   - 1.01M -
  tank/home/ahrens@tuesday  8.50K   -  780K -
  tank/home/ahrens@wednesday 8.50K   - 1.01M -
  tank/home/ahrens@thursday   0   - 1.77M -
  tank/home/cindys@today   8.50K   -  524K -
  可以列出为特定文件系统创建的快照,如下所示:
  # zfs list -r -t snapshot -o name,creation tank/home
  NAME            CREATION
  tank/home@now        Wed Aug 30 10:53 2006
  tank/home/ahrens@tuesday  Wed Aug 30 10:53 2006
  tank/home/ahrens@wednesday Wed Aug 30 10:54 2006
  tank/home/ahrens@thursday  Wed Aug 30 10:53 2006
  tank/home/cindys@now    Wed Aug 30 10:57 2006
  快照空间记帐
  创建快照时,最初在快照和文件系统之间共享其空间,还可能与以前的快照共享其空间。在文件系统发生更改时,以前共享的空间将变为该快照专用的空间,因此会将该空间算入快照的 used 属性。此外,删除快照可增加其他快照专用(使用)的空间量。
  创建快照时,快照的空间 referenced 属性与文件系统的相同。
  回滚到 ZFS 快照
  可以使用 zfs rollback 命令废弃自创建特定快照之后所做的所有更改。文件系统恢复到创建快照时的状态。缺省情况下,该命令无法回滚到除最新快照以外的快照。
 要回滚到早期快照,必须销毁所有的中间快照。可以通过指定 -r 选项销毁早期的快照。
  如果存在任何中间快照的克隆,则还必须指定 -R 选项以销毁克隆。
  注 –
  如果要回滚的文件系统当前为挂载状态,则必须取消挂载再重新挂载。如果无法取消挂载该文件系统,则回滚将失败。-f 选项可强制取消挂载文件系统(如有必要)。
  在以下示例中,会将 tank/home/ahrens 文件系统回滚到 tuesday 快照:
  # zfs rollback tank/home/ahrens@tuesday
  cannot rollback to 'tank/home/ahrens@tuesday': more recent snapshots exist
  use '-r' to force deletion of the following snapshots:
  tank/home/ahrens@wednesday
  tank/home/ahrens@thursday
  # zfs rollback -r tank/home/ahrens@tuesday
  在上面的示例中,因为已回滚到以前的 tuesday 快照,所以删除了 wednesday 和 thursday 快照。
  # zfs list -r -t snapshot -o name,creation tank/home/ahrens
  NAME           CREATION
  tank/home/ahrens@tuesday Wed Aug 30 10:53 2006
  ZFS 克隆概述
  克隆是可写入的卷或文件系统,其初始内容与从中创建它的数据集的内容相同。与快照一样,创建克隆几乎是即时的,而且最初不占用其他磁盘空间。此外,还可以创建克隆的快照。
  创建 ZFS 克隆
  销毁 ZFS 克隆
  使用 ZFS 克隆替换 ZFS 文件系统
克隆只能从快照创建。克隆快照时,会在克隆和快照之间建立隐式相关性。即使克隆是在数据集分层结构中的某个其他位置创建的,但只要克隆存在,就无法销毁原始快照。origin 属性显示此相关性,而 zfs destroy 命令会列出任何此类相关性(如果存在)。
  克隆不继承从其中创建它的数据集的属性。使用 zfs get 和 zfs set 命令,可以查看和更改克隆数据集的属性。
  由于克隆最初与原始快照共享其所有磁盘空间,因此其 used 属性最初为零。随着不断对克隆进行更改,它使用的空间将越来越多。原始快照的 used 属性不考虑克隆所占用的磁盘空间。
  创建 ZFS 克隆
  要创建克隆,请使用 zfs clone 命令,指定从中创建克隆的快照以及新文件系统或卷的名称。新文件系统或卷可以位于 ZFS 分层结构中的任意位置。新数据集的类型(例如,文件系统或卷)与从中创建克隆的快照的类型相同。不能在原始文件系统快照所在池以外的池中创建该文件系统的克隆。
  在以下示例中,将创建一个名为 tank/home/ahrens/bug123 的新克隆,其初始内容与快照 tank/ws/gate@yesterday 的内容相同。
  # zfs snapshot tank/ws/gate@yesterday
  # zfs clone tank/ws/gate@yesterday tank/home/ahrens/bug123
  在以下示例中,将从 projects/newproject@today 快照为临时用户创建克隆工作区 projects/teamA/tempuser。然后,在克隆工作区上设置属性。
  # zfs snapshot projects/newproject@today
  # zfs clone projects/newproject@today projects/teamA/tempuser
  # zfs set sharenfs=on projects/teamA/tempuser
  # zfs set quota=5G projects/teamA/tempuser
  销毁 ZFS 克隆
  使用 zfs destroy 命令可以销毁 ZFS 克隆。例如:
 # zfs destroy tank/home/ahrens/bug123
  必须先销毁克隆,才能销毁父快照。
  使用 ZFS 克隆替换 ZFS 文件系统
  借助 zfs promote 命令可以用活动的 ZFS 文件系统的克隆来替换该文件系统。此功能简化了克隆并替换文件系统以使“源”文件系统变为指定文件系统之克隆的功能。此外,通过此功能还可以销毁最初创建克隆所基于的文件系统。如果没有克隆提升 (clone promotion) 功能,就无法销毁活动克隆的“源”文件系统。
  在以下示例中,对 tank/test/productA 文件系统进行了克隆,然后克隆文件系统 tank/test/productAbeta 成为了 tank/test/productA 文件系统。
  # zfs create tank/test
  # zfs create tank/test/productA
  # zfs snapshot tank/test/productA@today
  # zfs clone tank/test/productA@today tank/test/productAbeta
  # zfs list -r tank/test
  NAME          USED AVAIL REFER MOUNTPOINT
  tank/test       314K 8.24G 25.5K /tank/test
  tank/test/productA   288K 8.24G  288K /tank/test/productA
  tank/test/productA@today   0   -  288K -
  tank/test/productAbeta   0 8.24G  288K /tank/test/productAbeta
  # zfs promote tank/test/productAbeta
  # zfs list -r tank/test
  NAME          USED AVAIL REFER MOUNTPOINT
  tank/test       316K 8.24G 27.5K /tank/test
  tank/test/productA    0 8.24G  288K /tank/test/productA
  tank/test/productAbeta  288K 8.24G  288K /tank/test/productAbeta
tank/test/productAbeta@today   0   -  288K -
  在上面的 zfs -list 输出中,可以看到原始 productA 文件系统的空间记帐已替换为 productAbeta 文件系统。
  通过重命名文件系统完成克隆替换过程。例如:
  # zfs rename tank/test/productA tank/test/productAlegacy
  # zfs rename tank/test/productAbeta tank/test/productA
  # zfs list -r tank/test
  NAME          USED AVAIL REFER MOUNTPOINT
  tank/test       316K 8.24G 27.5K /tank/test
  tank/test/productA   288K 8.24G  288K /tank/test/productA
  tank/test/productA@today   0   -  288K -
  tank/test/productAlegacy   0 8.24G  288K /tank/test/productAlegacy
  或者,也可以删除传统的文件系统。例如:
  # zfs destroy tank/test/productAlegacy
  保存和恢复 ZFS 数据
  zfs send 命令创建写入标准输出的快照流表示。缺省情况下,生成完整的流。可以将输出重定向到文件或其他系统。zfs receive 命令创建其内容在标准输入提供的流中指定的快照。如果接收了完整的流,那么同时会创建一个新文件系统。可通过这些命令来保存 ZFS 快照数据并恢复 ZFS 快照数据和文件系统。请参见下一节中的示例。
  使用其他备份产品保存 ZFS 数据
  保存 ZFS 快照
  恢复 ZFS 快照
远程复制 ZFS 数据
  以下是用于保存 ZFS 数据的解决方案:
  保存 ZFS 快照和回滚快照(如有必要)。
  保存 ZFS 快照的完整副本和增量副本以及恢复快照和文件系统(如有必要)。
  通过保存和恢复 ZFS 快照及文件系统来远程复制 ZFS 文件系统。
  用归档实用程序(如 tar 和 cpio)或第三方备份产品保存 ZFS 数据。
  选择用于保存 ZFS 数据的解决方案时,请考虑以下事项:
  文件系统快照和回滚快照-如果要轻松创建文件系统的副本并恢复到以前的文件系统版本(如有必要),请使用 zfs snapshot 和 zfs rollback 命令。例如,如果要从文件系统的早期版本恢复一个或多个文件,则可以使用此解决方案。
  保存快照-使用 zfs send 和 zfs receive 命令可保存和恢复 ZFS 快照。可以保存快照之间的增量更改,但不能逐个恢复文件。必须恢复整个文件系统快照。
  远程复制-如果要将文件系统从一个系统复制到另一个系统,请使用 zfs send 和 zfs receive 命令。此过程与可能跨 WAN 镜像设备的传统卷管理产品有所不同。不需要特殊的配置或硬件。复制 ZFS 文件系统的优点是,可以在其他系统的存储池上重新创建文件系统,并为新创建的池指定不同的配置级别(如 RAID-Z),但是新创建的池使用相同的文件系统数据。
  使用其他备份产品保存 ZFS 数据
  除 zfs send 和 zfs receive 命令外,还可以使用归档实用程序(如 tar 和 cpio 命令)保存 ZFS 文件。所有这些实用程序都可以保存和恢复 ZFS 文件属性和 ACL。请选中 tar 和 cpio 命令的适当选项。
  保存 ZFS 快照
  zfs send 命令的最常见用法是在用于存储备份数据的另一个系统中保存快照副本和接收快照。例如:
host1# zfs send tank/dana@snap1 | ssh host2 zfs recv newtank/dana
  发送完整的流时,目标文件系统必须不能存在。
  使用 zfs send -i 选项可以保存增量数据。例如:
  host1# zfs send -i tank/dana@snap1 tank/dana@snap2 | ssh host2 zfs recv newtank/dana
  请注意,第一个参数是较早的快照,第二个参数是较晚的快照。在这种情况下,newtank/dana 文件系统必须存在,增量接收才能成功。
  可将增量 snapshot1 源指定为快照名称的最后一个组成部分。此快捷方式意味着只需在 @ 符号后指定 snapshot1 的名称,假定它与 snapshot2 都来自同一文件系统。例如:
  host1# zfs send -i snap1 tank/dana@snap2 > ssh host2 zfs recv newtank/dana
  此语法与上一示例中的增量语法等效。
  尝试从其他文件系统 snapshot1 生成增量流时,将显示以下消息:
  cannot send 'pool/fs@name': not an earlier snapshot from the same fs
  如果需要存储许多副本,可以考虑使用 gzip 命令压缩 ZFS 快照流表示。例如:
  # zfs send pool/fs@snap | gzip > backupfile.gz
  恢复 ZFS 快照
  恢复文件系统快照时,请牢记以下要点:
  将恢复快照和文件系统。
  将取消挂载文件系统和所有后代文件系统。
  文件系统在恢复期间不可访问。
  要恢复的原始文件系统在恢复期间必须不存在。
  如果文件系统名称存在冲突,可以使用 zfs rename 重命名文件系统。
  例如:
  # zfs send tank/gozer@0830 > /bkups/gozer.083006
  # zfs receive tank/gozer2@today < /bkups/gozer.083006
  # zfs rename tank/gozer tank/gozer.old
原创粉丝点击