跳过导航链接 | |
退出打印视图 | |
![]() |
Oracle Solaris 11.1 管理:ZFS 文件系统 Oracle Solaris 11.1 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
6. 使用 Oracle Solaris ZFS 快照和克隆
7. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
快照是文件系统或卷的只读副本。快照几乎可以即时创建,而且最初不占用池中的其他磁盘空间。但是,活动数据集中的数据更改时,快照仍将继续引用旧数据,这会占用磁盘空间,从而阻止释放磁盘空间。
ZFS 快照具有以下特征:
可在系统重新引导后存留下来。
理论最大快照数是 264。
快照不使用单独的后备存储。快照直接占用存储池(从中创建这些快照的文件系统或卷所在的存储池)中的磁盘空间。
递归快照可作为一个原子操作快速创建。要么一起创建快照(一次创建所有快照),要么不创建任何快照。原子快照操作的优点是始终在一个一致的时间捕获快照数据,即使跨后代文件系统也是如此。
无法直接访问卷的快照,但是可以对它们执行克隆、备份、回滚等操作。有关备份 ZFS 快照的信息,请参见发送和接收 ZFS 数据。
快照是使用 zfs snapshot 或 zfs snap 命令创建的,该命令采用要创建的快照的名称作为其唯一参数。快照名称按如下方式指定:
filesystem@snapname volume@snapname
快照名称必须满足ZFS 组件命名要求中所述的命名要求。
在以下示例中,将创建一个 tank/home/cindy 的快照,其名称为 friday。
# zfs snapshot tank/home/cindy@friday
通过使用 -r 选项可为所有后代文件系统创建快照。例如:
# zfs snapshot -r tank/home@snap1 # zfs list -t snapshot -r tank/home NAME USED AVAIL REFER MOUNTPOINT tank/home@snap1 0 - 2.11G - tank/home/cindy@snap1 0 - 115M - tank/home/lori@snap1 0 - 2.00G - tank/home/mark@snap1 0 - 2.00G - tank/home/tim@snap1 0 - 57.3M -
快照没有可修改的属性。也不能将数据集属性应用于快照。例如:
# zfs set compression=on tank/home/cindy@friday cannot set property for 'tank/home/cindy@friday': this property can not be modified for snapshots
使用 zfs destroy 命令可以销毁快照。例如:
# zfs destroy tank/home/cindy@friday
如果数据集存在快照,则不能销毁该数据集。例如:
# zfs destroy tank/home/cindy cannot destroy 'tank/home/cindy': filesystem has children use '-r' to destroy the following datasets: tank/home/cindy@tuesday tank/home/cindy@wednesday tank/home/cindy@thursday
此外,如果已从快照创建克隆,则必须先销毁克隆,才能销毁快照。
有关 destroy 子命令的更多信息,请参见销毁 ZFS 文件系统。
如果存在不同的原子快照策略,导致旧的快照由于不再存在于发送侧而被 zfs receive 不小心销毁,则可能需要考虑使用本 Solaris 发行版中的快照保持功能。
保持快照可以防止它被销毁。此外,当一个带有克隆的快照等待删除最后一个克隆时,该功能允许使用 zfs destroy - d 命令删除该快照。每个快照都有一个关联的用户引用计数,其初始值为 0。在一个快照上设置一个保持标志时,此计数递增 1;释放一个保持标志时,此计数递减 1。
在先前的 Oracle Solaris 发行版中,只有在快照无克隆时,才能使用 zfs destroy 命令销毁快照。在此 Oracle Solaris 发行版中,快照的用户引用计数也必须为零。
可以保持一个快照或一组快照。例如,以下语法在 tank/home/cindy/snap@1 上设置一个保持标志 keep。
# zfs hold keep tank/home/cindy@snap1
可以使用 -r 选项递归保持所有后代文件系统的快照。例如:
# zfs snapshot -r tank/home@now # zfs hold -r keep tank/home@now
此语法向给定的快照或快照集添加一个引用 keep。每个快照都有其自己的标志名称空间,保持标志在该空间内必须是唯一的。如果一个快照上存在一个保持,尝试使用 zfs destroy 命令销毁受保持的快照将失败。例如:
# zfs destroy tank/home/cindy@snap1 cannot destroy 'tank/home/cindy@snap1': dataset is busy
要销毁保持的快照,须使用 -d 选项。例如:
# zfs destroy -d tank/home/cindy@snap1
使用 zfs holds 命令显示受保持的快照列表。例如:
# zfs holds tank/home@now NAME TAG TIMESTAMP tank/home@now keep Fri Aug 3 15:15:53 2012
# zfs holds -r tank/home@now NAME TAG TIMESTAMP tank/home/cindy@now keep Fri Aug 3 15:15:53 2012 tank/home/lori@now keep Fri Aug 3 15:15:53 2012 tank/home/mark@now keep Fri Aug 3 15:15:53 2012 tank/home/tim@now keep Fri Aug 3 15:15:53 2012 tank/home@now keep Fri Aug 3 15:15:53 2012
可以使用 zfs release 命令释放对一个快照或一组快照的保持。例如:
# zfs release -r keep tank/home@now
释放快照后,可以使用 zfs destroy 命令销毁快照。例如:
# zfs destroy -r tank/home@now
有两个新属性用来表示快照保持信息:
defer_destroy 属性在下述情况下为 on:已使用 zfs destroy -d 命令将快照标记为延期销毁。否则,此属性为 off。
userrefs 属性设置为此快照上的保持数,也称为用户引用计数。
可以重命名快照,但是必须在从中创建它们的池和数据集中对它们进行重命名。例如:
# zfs rename tank/home/cindy@snap1 tank/home/cindy@today
此外,以下快捷方式语法等效于以上的语法:
# zfs rename tank/home/cindy@snap1 today
不支持以下快照 rename 操作,因为目标池和文件系统名称与从中创建快照的池和文件系统不同:
# zfs rename tank/home/cindy@today pool/home/cindy@saturday cannot rename to 'pool/home/cindy@today': snapshots must be part of same dataset
可以使用 zfs rename -r 命令以递归方式重命名快照。例如:
# zfs list -t snapshot -r users/home NAME USED AVAIL REFER MOUNTPOINT users/home@now 23.5K - 35.5K - users/home@yesterday 0 - 38K - users/home/lori@yesterday 0 - 2.00G - users/home/mark@yesterday 0 - 1.00G - users/home/neil@yesterday 0 - 2.00G - # zfs rename -r users/home@yesterday @2daysago # zfs list -t snapshot -r users/home NAME USED AVAIL REFER MOUNTPOINT users/home@now 23.5K - 35.5K - users/home@2daysago 0 - 38K - users/home/lori@2daysago 0 - 2.00G - users/home/mark@2daysago 0 - 1.00G - users/home/neil@2daysago 0 - 2.00G -
缺省情况下,zfs list 输出中不再显示快照。您必须使用 zfs list -t snapshot 命令显示快照信息。或者,启用 listsnapshots 池属性。例如:
# zpool get listsnapshots tank NAME PROPERTY VALUE SOURCE tank listsnapshots off default # zpool set listsnapshots=on tank # zpool get listsnapshots tank NAME PROPERTY VALUE SOURCE tank listsnapshots on local
在文件系统的根的 .zfs/snapshot 目录中,可以访问文件系统的快照。例如,如果在 /home/cindy 处挂载了 tank/home/cindy,则可以在 /home/cindy/.zfs/snapshot/thursday 目录中访问 tank/home/cindy@thursday 快照数据。
# ls /tank/home/cindy/.zfs/snapshot thursday tuesday wednesday
可以列出快照,如下所示:
# zfs list -t snapshot -r tank/home NAME USED AVAIL REFER MOUNTPOINT tank/home/cindy@tuesday 45K - 2.11G - tank/home/cindy@wednesday 45K - 2.11G - tank/home/cindy@thursday 0 - 2.17G -
可以列出为特定文件系统创建的快照,如下所示:
# zfs list -r -t snapshot -o name,creation tank/home NAME CREATION tank/home/cindy@tuesday Fri Aug 3 15:18 2012 tank/home/cindy@wednesday Fri Aug 3 15:19 2012 tank/home/cindy@thursday Fri Aug 3 15:19 2012 tank/home/lori@today Fri Aug 3 15:24 2012 tank/home/mark@today Fri Aug 3 15:24 2012
创建快照时,最初在快照和文件系统之间共享其磁盘空间,还可能与以前的快照共享其空间。在文件系统发生更改时,以前共享的磁盘空间将变为该快照专用的空间,因此会将该空间算入快照的 used 属性。此外,删除快照可增加其他快照专用(使用)的磁盘空间量。
创建快照时,快照的 referenced 空间属性值与文件系统的相同。
可以找到有关 used 属性值如何被占用的附加信息。新的只读文件系统属性说明克隆、文件系统和卷的磁盘空间使用情况。例如:
$ zfs list -o space -r rpool NAME AVAIL USED USEDSNAP USEDDS USEDREFRESERV USEDCHILD rpool 124G 9.57G 0 302K 0 9.57G rpool/ROOT 124G 3.38G 0 31K 0 3.38G rpool/ROOT/solaris 124G 20.5K 0 0 0 20.5K rpool/ROOT/solaris/var 124G 20.5K 0 20.5K 0 0 rpool/ROOT/solaris-1 124G 3.38G 66.3M 3.14G 0 184M rpool/ROOT/solaris-1/var 124G 184M 49.9M 134M 0 0 rpool/VARSHARE 124G 39.5K 0 39.5K 0 0 rpool/dump 124G 4.12G 0 4.00G 129M 0 rpool/export 124G 63K 0 32K 0 31K rpool/export/home 124G 31K 0 31K 0 0 rpool/swap 124G 2.06G 0 2.00G 64.7M 0
有关这些属性的说明,请参见表 5-1。
可以使用 zfs rollback 命令放弃自特定快照创建以来对文件系统所做的全部更改。文件系统恢复到创建快照时的状态。缺省情况下,该命令无法回滚到除最新快照以外的快照。
要回滚到早期快照,必须销毁所有的中间快照。可以通过指定 -r 选项销毁早期的快照。
如果存在任何中间快照的克隆,则还必须指定 -R 选项以销毁克隆。
注 - 如果要回滚的文件系统当前为挂载状态,则会取消挂载并重新挂载。如果无法取消挂载该文件系统,则回滚将失败。-f 选项可强制取消挂载文件系统(如有必要)。
在以下示例中,会将 tank/home/cindy 文件系统回滚到 tuesday 快照:
# zfs rollback tank/home/cindy@tuesday cannot rollback to 'tank/home/cindy@tuesday': more recent snapshots exist use '-r' to force deletion of the following snapshots: tank/home/cindy@wednesday tank/home/cindy@thursday # zfs rollback -r tank/home/cindy@tuesday
在本示例中,因为已回滚到以前的 tuesday 快照,所以销毁了 wednesday 和 thursday 快照。
# zfs list -r -t snapshot -o name,creation tank/home/cindy NAME CREATION tank/home/cindy@tuesday Fri Aug 3 15:18 2012
可以使用 zfs diff 命令确定 ZFS 快照的差异。
例如,假定创建了以下两个快照:
$ ls /tank/home/tim fileA $ zfs snapshot tank/home/tim@snap1 $ ls /tank/home/tim fileA fileB $ zfs snapshot tank/home/tim@snap2
例如,要确定两个快照之间的差异,请使用类似以下的语法:
$ zfs diff tank/home/tim@snap1 tank/home/tim@snap2 M /tank/home/tim/ + /tank/home/tim/fileB
在输出中,M 表示该目录已经过修改。+ 表示 fileB 存在于较新的快照中。
以下输出中的 R 表示快照中的某个文件已经重命名。
$ mv /tank/cindy/fileB /tank/cindy/fileC $ zfs snapshot tank/cindy@snap2 $ zfs diff tank/cindy@snap1 tank/cindy@snap2 M /tank/cindy/ R /tank/cindy/fileB -> /tank/cindy/fileC
下表概括了 zfs diff 命令确定的文件或目录更改。
|
有关更多信息,请参见 zfs(1M)。