跳过导航链接 | |
退出打印视图 | |
Oracle Solaris 管理:ZFS 文件系统 Oracle Solaris 11 Information Library (简体中文) |
1. Oracle Solaris ZFS 文件系统(介绍)
3. Oracle Solaris ZFS 与传统文件系统之间的差别
7. 使用 Oracle Solaris ZFS 快照和克隆
8. 使用 ACL 和属性保护 Oracle Solaris ZFS 文件
以下各节介绍如何在具有 Oracle Solaris 区域的系统中使用 ZFS。
将 ZFS 数据集与区域关联时,请牢记以下要点:
可将 ZFS 文件系统或克隆添加至非全局区域(可以授予或不授予管理控制权)。
可将 ZFS 卷作为设备添加至非全局区域。
此时不能将 ZFS 快照与区域关联。
在以下各节中,ZFS 数据集是指文件系统或克隆。
通过添加数据集,非全局区域可与全局区域共享磁盘空间,但区域管理员不能在底层文件系统分层结构中控制属性或创建新文件系统。该操作与向区域中添加其他任何类型的文件系统相同,应该在主要目的只是为了共享公用磁盘空间时才这样做。
使用 ZFS,还可将数据集委托给非全局区域,从而授予区域管理员对数据集及其所有子级的完全控制。区域管理员可以在此数据集中创建和销毁文件系统或克隆,并可修改数据集的属性。区域管理员无法影响尚未添加到区域中的数据集,包括不能超过对委托数据集设置的任何顶层配额。
在安装了 Oracle Solaris 区域的系统中使用 ZFS 时,请考虑以下事项:
添加到非全局区域的 ZFS 文件系统必须将其 mountpoint 属性设置为 legacy。
当源 zonepath 和目标 zonepath 都驻留在 ZFS 文件系统上并且位于同一个池中时,zoneadm clone 现在将自动使用 ZFS 克隆来克隆区域。zoneadm clone 命令将创建源 zonepath 的 ZFS 快照,并设置目标 zonepath。不能使用 zfs clone 命令来克隆区域。有关更多信息,请参见《Oracle Solaris 管理:Oracle Solaris Zones、Oracle Solaris 10 Zones 和资源管理》中的第 II 部分, "Oracle Solaris Zones"。
如果目标只是与全局区域共享空间,则可添加 ZFS 文件系统作为通用文件系统。添加到非全局区域的 ZFS 文件系统必须将其 mountpoint 属性设置为 legacy。例如,如果 tank/zone/zion 文件系统将添加到非全局区域,请按如下所示在全局区域中设置 mountpoint 属性:
# zfs set mountpoint=legacy tank/zone/zion
可以使用 zonecfg 命令的 add fs 子命令将 ZFS 文件系统添加到非全局区域中。
在以下示例中,全局区域中的全局区域管理员会向非全局区域中添加一个 ZFS 文件系统:
# zonecfg -z zion zonecfg:zion> add fs zonecfg:zion:fs> set type=zfs zonecfg:zion:fs> set special=tank/zone/zion zonecfg:zion:fs> set dir=/export/shared zonecfg:zion:fs> end
此语法可向挂载在 /export/shared 且已配置的 zion 区域中添加 ZFS 文件系统 tank/zone/zion。文件系统的 mountpoint 属性必须设置为 legacy,并且该文件系统不能已在其他位置挂载。区域管理员可在文件系统中创建和销毁文件。不能在其他位置重新挂载文件系统,区域管理员也不能更改该文件系统的属性,如 atime、readonly、compression 等。全局区域管理员负责设置和控制文件系统的属性。
有关 zonecfg 命令以及有关使用 zonecfg 配置资源类型的更多信息,请参见《Oracle Solaris 管理:Oracle Solaris Zones、Oracle Solaris 10 Zones 和资源管理》中的第 II 部分, "Oracle Solaris Zones"。
为实现将存储管理委托给区域的主要目标,ZFS 支持通过使用 zonecfg 命令的 add dataset 子命令向非全局区域中添加数据集。
在以下示例中,全局区域中的全局区域管理员会将一个 ZFS 文件系统委托给非全局区域。
# zonecfg -z zion zonecfg:zion> add dataset zonecfg:zion:dataset> set name=tank/zone/zion zonecfg:zion:dataset> set alias=tank zonecfg:zion:dataset> end
与添加文件系统不同,此语法会使 ZFS 文件系统 tank/zone/zion 在已配置的 zion 区域中可见。在 zion 区域内,此文件系统不可被作为 tank/zone/zion 进行访问,但是可被作为名为 tank 的虚拟池进行访问。委托的文件系统别名以虚拟池的形式向区域提供原始池的视图。别名属性指定虚拟池的名称。如果未指定别名,则使用与文件系统名称的最后一个组件匹配的缺省别名。如果未提供具体的别名,则上述示例中的缺省别名为 zion。
在委托的数据集内,区域管理员可以设置文件系统属性,还可以创建后代文件系统。此外,区域管理员还可以创建快照和克隆,或者控制整个文件系统分层结构。如果在委托的文件系统内创建 ZFS 卷,则它们可能会与作为设备资源添加的 ZFS 卷相冲突。有关更多信息,请参见下节和 dev(7FS)。
可以通过以下方式,在非全局区域中添加或创建 ZFS 卷,或者在非全局区域中添加对卷数据的访问:
在非全局区域中,特权区域管理员可以创建 ZFS 卷,将其作为以前委托的文件系统的后代。例如:
# zfs create -V 2g tank/zone/zion/vol1
以上语法意味着,区域管理员可以在非全局区域中管理卷的属性和数据。
在全局区域中,使用 zonecfg add dataset 子命令并指定要添加到非全局区域的 ZFS 卷。例如:
# zonecfg -z zion zonecfg:zion> add dataset zonecfg:zion:dataset> set name=tank/volumes/vol1 zonecfg:zion:dataset> end
以上语法意味着,区域管理员可以在非全局区域中管理卷的属性和数据。
在全局区域中,使用 zonecfg add device 子命令并指定可以在非全局区域中访问其数据的 ZFS 卷。例如:
# zonecfg -z zion zonecfg:zion> add device zonecfg:zion:device> set match=/dev/zvol/dsk/tank/volumes/vol2 zonecfg:zion:device> end
以上语法意味着,在非全局区域中只能访问卷数据。
不能在区域中创建或修改 ZFS 存储池。委托的管理模型可将对全局区域内的物理存储设备的控制以及对虚拟存储的控制集中到非全局区域。尽管可向区域中添加池级别数据集,但区域内不允许使用用于修改该池的物理特征的任何命令,如创建、添加或删除设备。即使使用 zonecfg 命令的 add device 子命令向区域中添加物理设备或是已使用了文件,zpool 命令也不允许在该区域内创建任何池。
将数据集委托给区域后,区域管理员便可控制特定的数据集属性。将数据集委托给区域后,该数据集的所有祖先都显示为只读数据集,而该数据集本身则与其所有后代一样是可写的。例如,请参考以下配置:
global# zfs list -Ho name tank tank/home tank/data tank/data/matrix tank/data/zion tank/data/zion/home
如果将 tank/data/zion 添加到具有缺省 zion 别名的区域中,则每个数据集都将具有以下属性。
|
请注意,tank/zone/zion 的每个父项均不可见,所有子孙项均可写。区域管理员不能更改 zoned 属性,否则将产生下节介绍的安全风险。
区域中的特权用户可以更改除 quota 和 reservation 之外的任何属性。全局区域管理员借助此行为可以控制非全局区域所使用的所有数据集的磁盘空间占用情况。
此外,将数据集委托给非全局区域后,全局区域管理员便无法更改 sharenfs 和 mountpoint 属性。
将数据集委托给非全局区域时,必须对该数据集进行特殊标记,以便不在全局区域的上下文中解释特定属性。将数据集委托给受区域管理员控制的非全局区域之后,便不能再信任其内容。与任何文件系统一样,可能存在 setuid 二进制命令、符号链接或可能对全局区域的安全性造成不利影响的可疑内容。此外,不能在全局区域的上下文中解释 mountpoint 属性。否则,区域管理员可能会影响全局区域的名称空间。为解决后一个问题,ZFS 使用 zoned 属性来指示已在某一时刻将数据集委托给非全局区域。
zoned 属性是在首次引导包含 ZFS 数据集的区域时自动启用的布尔值。区域管理员将无需手动启用此属性。如果设置了 zoned 属性,则无法在全局区域中挂载或共享数据集。以下示例将 tank/zone/zion 委托给一个区域,tank/zone/global 则没有委托:
# zfs list -o name,zoned,mountpoint -r tank/zone NAME ZONED MOUNTPOINT tank/zone/global off /tank/zone/global tank/zone/zion on /tank/zone/zion # zfs mount tank/zone/global /tank/zone/global tank/zone/zion /export/zone/zion/root/tank/zone/zion
请注意 mountpoint 属性与当前挂载 tank/zone/zion 数据集的目录之间的差异。mountpoint 属性反映的是磁盘上存储的属性,而不是数据集当前在系统中的挂载位置。
从区域中删除数据集或销毁区域时,不会自动清除 zoned 属性。此行为是由与这些任务关联的固有安全风险引起的。由于不受信任的用户已取得对数据集及其后代的完全访问权限,因此 mountpoint 属性可能会设置为错误值,或者文件系统中可能存在 setuid 二进制命令。
为了防止意外的安全风险,要通过任何方式重用数据集时,必须由全局区域管理员手动清除 zoned 属性。将 zoned 属性设置为 off 之前,请确保数据集及其所有后代的 mountpoint 属性已设置为合理值并且不存在 setuid 二进制命令,或禁用 setuid 属性。
确定没有任何安全漏洞后,即可使用 zfs set 或 zfs inherit 命令禁用 zoned 属性。如果在区域正在使用数据集时禁用 zoned 属性,则系统的行为方式可能无法预测。仅当确定非全局区域不再使用数据集时,才能更改该属性。
需要将一个或多个区域迁移到其他系统时,可考虑使用 zfs send 和 zfs receive 命令。根据具体情况,可能使用复制流最好,也可能使用递归流最好。
本节中的示例介绍了如何在系统之间复制区域数据。需要执行其他步骤来传输每个区域的配置并将每个区域附加到新系统。有关更多信息,请参见《Oracle Solaris 管理:Oracle Solaris Zones、Oracle Solaris 10 Zones 和资源管理》中的第 II 部分, "Oracle Solaris Zones"。
如果一个系统上的所有区域都需要移动到另一系统,请考虑使用复制流,因为它可保留快照和克隆。快照和克隆由 pkg update、beadm create 和 zoneadm clone 命令广泛使用。
在以下示例中,sysA 的区域安装在 rpool/zones 文件系统中,需要将它们复制到 sys 上的 tank/zones 文件系统。以下命令创建一个快照并通过使用复制流将数据复制到 sysB:
sysA# zfs snapshot -r rpool/zones@send-to-sysB sysA# zfs send -R rpool/zones@send-to-sysB | ssh sysB zfs receive -d tank
在以下示例中,若干个区域中的一个被从 sysC 复制到 sysD。假定 ssh 命令不可用,但 NFS 服务器实例可用。以下命令可以用于生成递归的 zfs send 流,而不必担心区域是否是另一个区域的克隆。
sysC# zfs snapshot -r rpool/zones/zone1@send-to-nfs sysC# zfs send -rc rpool/zones/zone1@send-to-nfs > /net/nfssrv/export/scratch/zone1.zfs sysD# zfs create tank/zones sysD# zfs receive -d tank/zones < /net/nfssrv/export/scratch/zone1.zfs