第 7 章 使用 Oracle Solaris ZFS 快照和克隆.docx
《第 7 章 使用 Oracle Solaris ZFS 快照和克隆.docx》由会员分享,可在线阅读,更多相关《第 7 章 使用 Oracle Solaris ZFS 快照和克隆.docx(18页珍藏版)》请在冰豆网上搜索。
第7章使用OracleSolarisZFS快照和克隆
第7章使用OracleSolarisZFS快照和克隆
本章介绍如何创建和管理OracleSolarisZFS快照和克隆。
此外还提供了有关保存快照的信息。
本章包含以下各节:
∙ZFS快照概述
∙创建和销毁ZFS快照
∙显示和访问ZFS快照
∙回滚ZFS快照
∙ZFS克隆概述
∙创建ZFS克隆
∙销毁ZFS克隆
∙使用ZFS克隆替换ZFS文件系统
∙发送和接收ZFS数据
ZFS快照概述
快照是文件系统或卷的只读副本。
快照几乎可以即时创建,而且最初不占用池中的其他磁盘空间。
但是,当活动数据集中的数据发生更改时,快照通过继续引用旧数据占用磁盘空间,从而阻止释放磁盘空间。
ZFS快照具有以下特征:
∙可在系统重新引导后存留下来。
∙理论最大快照数是264。
∙快照不使用单独的后备存储。
快照直接占用存储池(从中创建这些快照的文件系统或卷所在的存储池)中的磁盘空间。
∙递归快照可作为一个原子操作快速创建。
要么一起创建快照(一次创建所有快照),要么不创建任何快照。
原子快照操作的优点是始终在一个一致的时间捕获快照数据,即使跨后代文件系统也是如此。
无法直接访问卷的快照,但是可以对它们执行克隆、备份、回滚等操作。
有关备份ZFS快照的信息,请参见发送和接收ZFS数据。
∙创建和销毁ZFS快照
∙显示和访问ZFS快照
∙回滚ZFS快照
创建和销毁ZFS快照
快照是使用zfssnapshot命令创建的,该命令将要创建的快照的名称用作其唯一参数。
快照名称按如下方式指定:
filesystem@snapname
volume@snapname
快照名称必须满足ZFS组件命名要求中所述的命名要求。
在以下示例中,将创建tank/home/ahrens的快照,其名称为friday。
#zfssnapshottank/home/ahrens@friday
通过使用-r选项可为所有后代文件系统创建快照。
例如:
#zfssnapshot-rtank/home@now
#zfslist-tsnapshot
NAMEUSEDAVAILREFERMOUNTPOINT
rpool/ROOT/zfs2BE@zfs2BE78.3M-4.53G-
tank/home@now0-26K-
tank/home/ahrens@now0-259M-
tank/home/anne@now0-156M-
tank/home/bob@now0-156M-
tank/home/cindys@now0-104M-
快照没有可修改的属性。
也不能将数据集属性应用于快照。
例如:
#zfssetcompression=ontank/home/ahrens@now
cannotsetcompressionpropertyfor'tank/home/ahrens@now':
snapshot
propertiescannotbemodified
使用zfsdestroy命令可以销毁快照。
例如:
#zfsdestroytank/home/ahrens@now
如果数据集存在快照,则不能销毁该数据集。
例如:
#zfsdestroytank/home/ahrens
cannotdestroy'tank/home/ahrens':
filesystemhaschildren
use'-r'todestroythefollowingdatasets:
tank/home/ahrens@tuesday
tank/home/ahrens@wednesday
tank/home/ahrens@thursday
此外,如果已从快照创建克隆,则必须先销毁克隆,才能销毁快照。
有关destroy子命令的更多信息,请参见销毁ZFS文件系统。
保持ZFS快照
如果存在不同的原子快照策略,导致旧的快照由于不再存在于发送侧而被zfsreceive不小心销毁,则可能需要考虑使用本Solaris发行版中的快照保持功能。
保持快照可以防止它被销毁。
此外,当一个带有克隆的快照等待删除最后一个克隆时,该功能允许使用zfsdestroy-d命令删除该快照。
每个快照都有一个关联的用户引用计数,其初始值为0。
对一个快照设置一个保持时,此计数递增1;释放一个保持时,此计数递减1。
在先前的Solaris发行版中,只有在快照无克隆时,才能使用zfsdestroy命令销毁快照。
在本Solaris发行版中,快照同样必须有一个用户引用计数。
可以保持一个快照或一组快照。
例如,以下语法对tank/home/cindys/snap@1设置一个保持标志keep。
#zfsholdkeeptank/home/cindys@snap1
可以使用-r选项递归保持所有后代文件系统的快照。
例如:
#zfssnapshot-rtank/home@now
#zfshold-rkeeptank/home@now
此语法向给定的快照或快照集添加一个引用keep。
每个快照都有其自己的标志名称空间,保持标志在该空间内必须是唯一的。
如果一个快照上存在一个保持,尝试使用zfsdestroy命令销毁受保持的快照将失败。
例如:
#zfsdestroytank/home/cindys@snap1
cannotdestroy'tank/home/cindys@snap1':
datasetisbusy
要销毁受保持的快照,须使用-d选项。
例如:
#zfsdestroy-dtank/home/cindys@snap1
使用zfsholds命令显示受保持的快照列表。
例如:
#zfsholdstank/home@now
NAMETAGTIMESTAMP
tank/home@nowkeepThuJul1511:
25:
392010
#zfsholds-rtank/home@now
NAMETAGTIMESTAMP
tank/home/cindys@nowkeepThuJul1511:
25:
392010
tank/home/mark@nowkeepThuJul1511:
25:
392010
tank/home@nowkeepThuJul1511:
25:
392010
可以使用zfsrelease命令释放对一个快照或一组快照的保持。
例如:
#zfsrelease-rkeeptank/home@now
释放快照后,可以使用zfsdestroy命令销毁快照。
例如:
#zfsdestroy-rtank/home@now
有两个新属性用来表示快照保持信息:
∙defer_destroy属性在下述情况下为on:
已使用zfsdestroy-d命令将快照标记为延期销毁。
否则,此属性为off。
∙userrefs属性设置为此快照上的保持数,也称为用户引用计数。
重命名ZFS快照
可以重命名快照,但是必须在从中创建它们的池和数据集中对它们进行重命名。
例如:
#zfsrenametank/home/cindys@083006tank/home/cindys@today
此外,以下快捷方式语法等效于以上的语法:
#zfsrenametank/home/cindys@083006today
不支持以下快照rename操作,因为目标池和文件系统名称与从中创建快照的池和文件系统不同:
#zfsrenametank/home/cindys@todaypool/home/cindys@saturday
cannotrenameto'pool/home/cindys@today':
snapshotsmustbepartofsame
dataset
可以使用zfsrename-r命令以递归方式重命名快照。
例如:
#zfslist
NAMEUSEDAVAILREFERMOUNTPOINT
users270K16.5G22K/users
users/home76K16.5G22K/users/home
users/home@yesterday0-22K-
users/home/markm18K16.5G18K/users/home/markm
users/home/markm@yesterday0-18K-
users/home/marks18K16.5G18K/users/home/marks
users/home/marks@yesterday0-18K-
users/home/neil18K16.5G18K/users/home/neil
users/home/neil@yesterday0-18K-
#zfsrename-rusers/home@yesterday@2daysago
#zfslist-rusers/home
NAMEUSEDAVAILREFERMOUNTPOINT
users/home76K16.5G22K/users/home
users/home@2daysago0-22K-
users/home/markm18K16.5G18K/users/home/markm
users/home/markm@2daysago0-18K-
users/home/marks18K16.5G18K/users/home/marks
users/home/marks@2daysago0-18K-
users/home/neil18K16.5G18K/users/home/neil
users/home/neil@2daysago0-18K-
显示和访问ZFS快照
您可以通过listsnapshots池属性启用或禁用zfslist输出中的快照列表显示。
缺省情况下,此属性处于启用状态。
如果禁用了此属性,则可以使用zfslist-tsnapshot命令来显示快照信息。
或者,启用listsnapshots池属性。
例如:
#zpoolgetlistsnapshotstank
NAMEPROPERTYVALUESOURCE
tanklistsnapshotsondefault
#zpoolsetlistsnapshots=offtank
#zpoolgetlistsnapshotstank
NAMEPROPERTYVALUESOURCE
tanklistsnapshotsofflocal
在文件系统的根的.zfs/snapshot目录中,可以访问文件系统的快照。
例如,如果在/home/ahrens上挂载tank/home/ahrens,则可以在/home/ahrens/.zfs/snapshot/thursday目录中访问tank/home/ahrens@thursday快照数据。
#ls/tank/home/ahrens/.zfs/snapshot
tuesdaywednesdaythursday
可以列出快照,如下所示:
#zfslist-tsnapshot
NAMEUSEDAVAILREFERMOUNTPOINT
pool/home/anne@monday0-780K-
pool/home/bob@monday0-1.01M-
tank/home/ahrens@tuesday8.50K-780K-
tank/home/ahrens@wednesday8.50K-1.01M-
tank/home/ahrens@thursday0-1.77M-
tank/home/cindys@today8.50K-524K-
可以列出为特定文件系统创建的快照,如下所示:
#zfslist-r-tsnapshot-oname,creationtank/home
NAMECREATION
tank/home@nowWedJun3016:
162010
tank/home/ahrens@nowWedJun3016:
162010
tank/home/anne@nowWedJun3016:
162010
tank/home/bob@nowWedJun3016:
162010
tank/home/cindys@nowWedJun3016:
162010
ZFS快照的磁盘空间记帐
创建快照时,最初在快照和文件系统之间共享其磁盘空间,还可能与以前的快照共享其空间。
在文件系统发生更改时,以前共享的磁盘空间将变为该快照专用的空间,因此会将该空间算入快照的used属性。
此外,删除快照可增加其他快照专用(使用)的磁盘空间量。
创建快照时,快照的空间referenced属性值与文件系统的相同。
可以找到有关used属性值如何被占用的附加信息。
新的只读文件系统属性说明克隆、文件系统和卷的磁盘空间使用情况。
例如:
$zfslist-ospace
#zfslist-rospacetank/home
NAMEAVAILUSEDUSEDSNAPUSEDDSUSEDREFRESERVUSEDCHILD
tank/home66.3G675M026K0675M
tank/home@now-0----
tank/home/ahrens66.3G259M0259M00
tank/home/ahrens@now-0----
tank/home/anne66.3G156M0156M00
tank/home/anne@now-0----
tank/home/bob66.3G156M0156M00
tank/home/bob@now-0----
tank/home/cindys66.3G104M0104M00
tank/home/cindys@now-0----
有关这些属性的说明,请参见表 6–1。
回滚ZFS快照
可以使用zfsrollback命令放弃自特定快照创建以来对文件系统所做的全部更改。
文件系统恢复到创建快照时的状态。
缺省情况下,该命令无法回滚到除最新快照以外的快照。
要回滚到早期快照,必须销毁所有的中间快照。
可以通过指定-r选项销毁早期的快照。
如果存在任何中间快照的克隆,则还必须指定-R选项以销毁克隆。
注–
如果要回滚的文件系统当前为挂载状态,则会取消挂载并重新挂载。
如果无法取消挂载该文件系统,则回滚将失败。
-f选项可强制取消挂载文件系统(如有必要)。
在以下示例中,会将tank/home/ahrens文件系统回滚到tuesday快照:
#zfsrollbacktank/home/ahrens@tuesday
cannotrollbackto'tank/home/ahrens@tuesday':
morerecentsnapshotsexist
use'-r'toforcedeletionofthefollowingsnapshots:
tank/home/ahrens@wednesday
tank/home/ahrens@thursday
#zfsrollback-rtank/home/ahrens@tuesday
在本示例中,因为已回滚到以前的tuesday快照,所以销毁了wednesday和thursday快照。
#zfslist-r-tsnapshot-oname,creationtank/home/ahrens
NAMECREATION
tank/home/ahrens@nowWedJun3016:
162010
ZFS克隆概述
克隆是可写入的卷或文件系统,其初始内容与从中创建它的数据集的内容相同。
与快照一样,创建克隆几乎是即时的,而且最初不占用其他磁盘空间。
此外,还可以创建克隆的快照。
克隆只能从快照创建。
克隆快照时,会在克隆和快照之间建立隐式相关性。
即使克隆是在数据集分层结构中的某个其他位置创建的,但只要克隆存在,就无法销毁原始快照。
origin属性显示此相关性,而zfsdestroy命令会列出任何此类相关性(如果存在)。
克隆不继承从其中创建它的数据集的属性。
使用zfsget和zfsset命令,可以查看和更改克隆数据集的属性。
有关设置ZFS数据集属性的更多信息,请参见设置ZFS属性。
由于克隆最初与原始快照共享其所有磁盘空间,因此其used属性值最初为零。
随着不断对克隆进行更改,它使用的磁盘空间将越来越多。
原始快照的used属性不包括克隆所占用的磁盘空间。
∙创建ZFS克隆
∙销毁ZFS克隆
∙使用ZFS克隆替换ZFS文件系统
创建ZFS克隆
要创建克隆,请使用zfsclone命令,指定从中创建克隆的快照以及新文件系统或卷的名称。
新文件系统或卷可以位于ZFS分层结构中的任意位置。
新数据集与从其中创建克隆的快照属同一类型(例如文件系统或卷)。
不能在原始文件系统快照所在池以外的池中创建该文件系统的克隆。
在以下示例中,将创建一个名为tank/home/ahrens/bug123的新克隆,其初始内容与快照tank/ws/gate@yesterday的内容相同:
#zfssnapshottank/ws/gate@yesterday
#zfsclonetank/ws/gate@yesterdaytank/home/ahrens/bug123
在以下示例中,将从projects/newproject@today快照为临时用户创建克隆工作区projects/teamA/tempuser。
然后,在克隆工作区上设置属性。
#zfssnapshotprojects/newproject@today
#zfscloneprojects/newproject@todayprojects/teamA/tempuser
#zfssetsharenfs=onprojects/teamA/tempuser
#zfssetquota=5Gprojects/teamA/tempuser
销毁ZFS克隆
使用zfsdestroy命令可以销毁ZFS克隆。
例如:
#zfsdestroytank/home/ahrens/bug123
必须先销毁克隆,才能销毁父快照。
使用ZFS克隆替换ZFS文件系统
借助zfspromote命令可以用活动的ZFS文件系统的克隆来替换该文件系统。
利用此功能可以克隆并替换文件系统,使源文件系统变为指定文件系统的克隆。
此外,通过此功能还可以销毁最初创建克隆所基于的文件系统。
如果没有克隆提升(clonepromotion)功能,就无法销毁活动克隆的源文件系统。
有关销毁克隆的更多信息,请参见销毁ZFS克隆。
在以下示例中,对tank/test/productA文件系统进行了克隆,然后克隆文件系统tank/test/productAbeta成为原始tank/test/productA文件系统。
#zfscreatetank/test
#zfscreatetank/test/productA
#zfssnapshottank/test/productA@today
#zfsclonetank/test/productA@todaytank/test/productAbeta
#zfslist-rtank/test
NAMEUSEDAVAILREFERMOUNTPOINT
tank/test104M66.2G23K/tank/test
tank/test/productA104M66.2G104M/tank/test/productA
tank/test/productA@today0-104M-
tank/test/productAbeta066.2G104M/tank/test/productAbeta
#zfspromotetank/test/productAbeta
#zfslist-rtank/test
NAMEUSEDAVAILREFERMOUNTPOINT
tank/test104M66.2G24K/tank/test
tank/test/productA066.2G104M/tank/test/productA
tank/test/productAbeta104M66.2G104M/tank/test/productAbeta
tank/test/productAbeta@today0-104M-
在此zfslist输出中,注意源productA文件系统的磁盘空间记帐信息已被productAbeta文件系统取代。
可以通过重命名文件系统完成克隆替换过程。
例如:
#zfsrenametank/test/productAtank/test/productAlegacy
#zfsrenametank/test/productAbetatank/test/productA
#zfslist-rtank/test
或者,也可以删除传统的文件系统。
例如:
#zfsdestroytank/test/productAlegacy
发送和接收ZFS数据
zfssend命令创建写入标准输出的快照流表示。
缺省情况下,生成完整的流。
可以将输出重定向到文件或其他系统。
zfsreceive命令创建其内容在标准输入提供的流中指定的快照。
如果接收了完整的流,那么同时会创建一个新文件系统。
可通过这些命令来发送ZFS快照数据并接收ZFS快照数据和文件系统。
请参见下一节中的示例。
∙发送ZFS快照
∙接收ZFS快照
∙发送和接收复杂的ZFS快照流
∙使用其他备份产品保存ZFS数据
以下是用于保存ZFS数据的备份解决方案:
∙企业备份产品-如果需要以下功能,则应考虑企业备份解决方案:
按文件恢复
备份介质验证
介质管理
∙文件系