跳过导航链接 | |
退出打印视图 | |
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 文件
属性是用来对文件系统、卷、快照和克隆的行为进行控制的主要机制。除非另有说明,否则本节中阐述的属性适用于所有数据集类型。
属性分为两种类型:本机属性和用户定义的属性。本机属性用于提供内部统计信息或控制 ZFS 文件系统行为。此外,本机属性是可设置的或只读的。用户属性对 ZFS 文件系统行为没有影响,但可通过用户环境中有意义的方式来注释数据集。有关用户属性的更多信息,请参见ZFS 用户属性。
大多数可设置的属性也是可继承的。可继承属性是这样的属性:如果为父文件系统设置了该属性,则该属性会向下传播给其所有后代。
所有可继承属性都有一个关联源,表明属性是如何获得的。属性的源可具有以下值:
表示属性是使用 zfs set 命令对数据集进行显式设置的,如设置 ZFS 属性中所述。
表示属性是从指定的祖先继承而来。
表示属性值不是继承而来或在本地设置。如果没有祖先具有属性源 local,则会使用此源。
下表介绍了只读的和可设置的本机 ZFS 文件系统属性。只读本机属性在表中注明为“只读属性”。此表中列出的所有其他本机属性均为可设置的属性。有关用户属性的信息,请参见ZFS 用户属性。
表 6-1 ZFS 本机属性说明
|
可以检索但无法设置只读本机属性。只读本机属性不可继承。有些本机属性特定于特殊类型的数据集。在这种情况下,表 6-1 的说明部分会注明数据集类型。
下面列出了只读本机属性,表 6-1 对其进行了描述。
available
compressratio
creation
keystatus
mounted
origin
referenced
rekeydate
type
used
有关详细信息,请参见 used 属性。
usedbychildren
usedbydataset
usedbyrefreservation
usedbysnapshots
有关磁盘空间记帐(包括 used、referenced 和 available 属性)的更多信息,请参见ZFS 磁盘空间记帐。
used 属性是一个只读属性,表明此数据集及其所有后代占用的磁盘空间量。可根据此数据集的配额和预留空间来检查该值。使用的磁盘空间不包括数据集的预留空间,但会考虑任何后代数据集的预留空间。数据集占用其父级的磁盘空间量以及以递归方式销毁该数据集时所释放的磁盘空间量应为其使用空间和预留空间的较大者。
创建快照时,其磁盘空间最初在快照与文件系统之间进行共享,还可能是与以前的快照进行共享。随着文件系统的变化,以前共享的磁盘空间将供快照专用,并会计算在快照的使用空间内。快照使用的磁盘空间会将其专用数据所占空间计算在内。此外,删除快照可增加其他快照专用(和使用)的磁盘空间量。有关快照和空间问题的更多信息,请参见空间不足行为。
已用磁盘空间量、可用磁盘空间量以及引用磁盘空间量并不包括暂挂更改。通常,暂挂更改仅占用几秒钟的时间。使用 fsync(3c) 或 O_SYNC 功能提交对磁盘的更改,不一定可以保证磁盘空间使用情况信息会立即更新。
使用 zfs list -o space 命令,可以显示 usedbychildren、usedbydataset、usedbyrefreservation 和 usedbysnapshots 属性信息。这些属性将 used 属性细分为后代占用的磁盘空间。有关更多信息,请参见表 6-1。
可设置的本机属性是其值可同时进行检索和设置的属性。可设置的本机属性可以使用 zfs set 命令或 zfs create 命令进行设置,请分别参见设置 ZFS 属性和创建 ZFS 文件系统中的描述。除了配额和预留空间外,可设置的本机属性均可继承。有关配额和预留空间的更多信息,请参见设置 ZFS 配额和预留空间。
有些可设置的本机属性特定于特殊类型的数据集。在这种情况下,表 6-1 的说明部分会注明数据集类型。如果未明确注明,则表明属性适用于所有数据集类型: 文件系统、卷、克隆和快照。
下面列出了可设置的属性,表 6-1 对其进行了描述。
aclinherit
有关详细说明,请参见ACL 属性。
atime
canmount
casesensitivity
checksum
compression
copies
devices
dedup
encryption
exec
keysource
logbias
mlslabel
mountpoint
nbmand
normalization
primarycache
quota
readonly
recordsize
有关详细说明,请参见recordsize 属性。
refquota
refreservation
reservation
rstchown
secondarycache
sharesmb
sharenfs
setuid
snapdir
version
vscan
utf8only
volsize
有关详细说明,请参见volsize 属性。
volblocksize
zoned
xattr
如果 canmount 属性设置为 off,则不能使用 zfs mount 或 zfs mount -a 命令挂载文件系统。将此属性设置为 off 与将 mountpoint 属性设置为 none 的效果相似,区别在于文件系统仍有一个可以继承的普通 mountpoint 属性。例如,可将该属性设置为 off,为后代文件系统建立可继承属性,但父文件系统本身永远不会挂载,也无法供用户访问。在这种情况下,父文件系统将充当一个容器,这样便可以在容器中设置属性,但容器本身永远不可访问。
在以下示例中,创建了 userpool 并将其 canmount 属性设置为 off。将后代用户文件系统的挂载点设置为一个公共挂载点 /export/home。在父文件系统中设置的属性可由后代文件系统继承,但永远不会挂载父文件系统本身。
# zpool create userpool mirror c0t5d0 c1t6d0 # zfs set canmount=off userpool # zfs set mountpoint=/export/home userpool # zfs set compression=on userpool # zfs create userpool/user1 # zfs create userpool/user2 # zfs mount userpool/user1 /export/home/user1 userpool/user2 /export/home/user2
将 canmount 属性设置为 noauto 意味着文件系统只能显式挂载,而不能自动挂载。
此属性指示文件系统使用的文件名匹配算法应当是 casesensitive、caseinsensitive,还是允许这两种匹配风格的组合 (mixed)。
对混合敏感性文件系统发出不区分大小写的匹配请求时,行为通常与纯正的不区分大小写的文件系统的预期行为相同。区别在于,在混合敏感性文件系统中可能存在以下情况:目录中的多个名称从区分大小写的角度来看是唯一的,但从不区分大小写的角度来看则不是唯一的。
例如,某个目录中可能包含文件 foo、Foo 和 FOO。如果请求对 foo 的任何可能形式(例如 foo、FOO、FoO、fOo 等)进行不区分大小写的匹配,则该匹配算法会选择三个现有文件之一作为匹配项。无法保证该算法到底选择哪个文件作为匹配项,但可以保证会选择同一文件作为 foo 的任何形式的匹配项。只要目录保持不变,被选作 foo、FOO、foO、Foo 等的不区分大小写匹配项的文件就始终相同。
utf8only、normalization 和 casesensitivity 属性还提供了可以通过使用 ZFS 委托管理指定给非特权用户的新权限。有关更多信息,请参见委托 ZFS 权限。
作为一项可靠性功能,如果可能,ZFS 文件系统元数据会在不同的磁盘中自动存储多次。此功能称为重复块 (ditto blocks)。
在此发行版中,还可以使用 zfs set copies 命令存储用户数据的多个副本,这些副本也按文件系统进行存储。例如:
# zfs set copies=2 users/home # zfs get copies users/home NAME PROPERTY VALUE SOURCE users/home copies 2 local
可用的值为 1、2 或 3。缺省值为 1。除了任何池级别的冗余以外,这些副本还用于诸如镜像或 RAID-Z 之类的配置中。
存储 ZFS 用户数据的多个副本的优点如下:
通过支持所有 ZFS 配置从不可恢复的块读取故障(例如介质故障(一般称为位损坏))恢复来提高数据保留能力。
提供数据保护,即使只有一个磁盘可用。
允许您在存储池功能之外以每个文件系统为基础选择数据保护策略。
注 - 根据存储池中重复块 (ditto blocks) 的分配,可能会将多个副本置于单个磁盘上。某个后续的满载磁盘故障可能会导致所有重复块 (ditto blocks) 都不可用。
无意中创建了非冗余池时以及需要设置数据保留策略时,可能会考虑使用重复块 (ditto blocks)。
dedup 属性控制是否从文件系统中删除重复数据。如果文件系统启用了 dedup 属性,则会以同步方式删除重复的数据块。结果是仅存储唯一的数据,在文件之间共享通用组件。
在检查以下注意事项之前,不要在驻留于生产系统上的文件系统上启用 dedup 属性:
确定数据是否将受益于重复数据删除产生的空间节省。如果您的数据不是可进行重复数据删除的,则启用 dedup 没有意义。例如:
# zdb -S tank Simulated DDT histogram: bucket allocated referenced ______ ______________________________ ______________________________ refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE ------ ------ ----- ----- ----- ------ ----- ----- ----- 1 2.27M 239G 188G 194G 2.27M 239G 188G 194G 2 327K 34.3G 27.8G 28.1G 698K 73.3G 59.2G 59.9G 4 30.1K 2.91G 2.10G 2.11G 152K 14.9G 10.6G 10.6G 8 7.73K 691M 529M 529M 74.5K 6.25G 4.79G 4.80G 16 673 43.7M 25.8M 25.9M 13.1K 822M 492M 494M 32 197 12.3M 7.02M 7.03M 7.66K 480M 269M 270M 64 47 1.27M 626K 626K 3.86K 103M 51.2M 51.2M 128 22 908K 250K 251K 3.71K 150M 40.3M 40.3M 256 7 302K 48K 53.7K 2.27K 88.6M 17.3M 19.5M 512 4 131K 7.50K 7.75K 2.74K 102M 5.62M 5.79M 2K 1 2K 2K 2K 3.23K 6.47M 6.47M 6.47M 8K 1 128K 5K 5K 13.9K 1.74G 69.5M 69.5M Total 2.63M 277G 218G 225G 3.22M 337G 263G 270G dedup = 1.20, compress = 1.28, copies = 1.03, dedup * compress / copies = 1.50
如果估计的重复数据删除比大于 2,则重复数据删除可能会带来空间节省。
在上述示例中,重复数据删除比小于 2,因此建议不要启用 dedup。
请确保系统具有足够的内存来支持重复数据删除。
每个核心中重复数据删除表项约为 320 字节
用分配的块数乘以 320。例如:
in-core DDT size = 2.63M x 320 = 841.60M
当重复数据删除表可以完全装入内存时,重复数据删除的性能最佳。如果不得不将重复数据删除表写入磁盘,则性能将降低。例如,如果系统不满足上述内存要求,则删除启用了 dedup 的大文件系统将大大降低系统性能。
在启用 dedup 时,dedup 校验和算法会覆盖 checksum 属性。将属性值设置为 verify 等效于指定 sha256,verify。如果将属性设置为 verify,且两个块具有相同的签名,则 ZFS 会与现有块进行逐字节比较,以确保内容完全相同。
可以按文件系统启用此属性。例如:
# zfs set dedup=on tank/home
可以使用 zfs get 命令确定是否设置了 dedup 属性。
虽然重复数据删除是作为文件系统属性设置的,但是它在池范围内起作用。例如,您可以确定重复数据删除比。例如:
# zpool list tank NAME SIZE ALLOC FREE CAP DEDUP HEALTH ALTROOT rpool 136G 55.2G 80.8G 40% 2.30x ONLINE -
DEDUP 列指示已发生了多少重复数据删除。如果在任何文件系统上都没有启用 dedup 属性,或者如果刚刚在文件系统上启用了 dedup 属性,则 DEDUP 比是 1.00x。
可以使用 zpool get 命令确定 dedupratio 属性的值。例如:
# zpool get dedupratio export NAME PROPERTY VALUE SOURCE rpool dedupratio 3.00x -
此池属性说明此池已实现了多少重复数据删除。
可以使用 encryption 属性来加密 ZFS 文件系统。有关更多信息,请参见加密 ZFS 文件系统。
recordsize 属性为文件系统中的文件指定建议的块大小。
该属性专门设计用于对大小固定的记录中的文件进行访问的数据库工作负荷。ZFS 会根据为典型的访问模式优化的内部算法来自动调整块大小。对于创建很大的文件但访问较小的随机块中的文件的数据库而言,这些算法可能不是最优的。将 recordsize 值指定为大于或等于数据库的记录大小的值可以显著提高性能。强烈建议不要将该属性用于一般用途的文件系统,否则可能会对性能产生不利影响。指定的大小必须是 2 的若干次幂,并且必须大于或等于 512 字节同时小于或等于 128 KB。更改文件系统的 recordsize 值仅影响之后创建的文件。现有文件不会受到影响。
此属性的缩写为 recsize。
此属性通过 Oracle Solaris SMB 服务启用 ZFS 文件系统的共享,并标识要使用的选项。
由于 SMB 共享需要一个资源名称,因此将基于文件系统名称构建唯一的资源名称。构建的名称是文件系统名称的副本,但是,对于文件系统名称中的字符,如果在资源名称中不合法,将被替换为下划线字符 (_)。此外,还支持伪属性 name,以便您用某个特定名称替换文件系统名称。然后,在继承时会使用该特定名称替换前缀文件系统。
例如,如果将文件系统 data/home/john 设置为 name=john,则 data/home/john 的资源名称是 john。如果存在一个子文件系统 data/home/john/backups,则其资源名称是 john_backups。如果为某个文件系统更改了 sharesmb 属性,除非该属性之前设置为 off,或者该文件系统和继承该属性的任何子代在该属性更改之前已是共享的,否则不会使用新选项重新共享这些文件系统。如果新属性设置为 off,则会取消共享这些文件系统。
有关使用 sharesmb 属性的示例,请参见共享和取消共享 ZFS 文件系统 。
volsize 属性指定卷的逻辑大小。缺省情况下,创建卷会产生相同大小的预留空间。对 volsize 的任何更改都会反映为对预留空间的等效更改。这些检查用来防止用户产生的意外行为。如果卷包含的空间比其声明可用的空间少,则会导致未定义的行为或数据损坏,具体取决于卷的使用方法。如果在卷的使用过程中更改卷大小,特别是在收缩大小时,也会出现上述影响。调整卷大小时,应该格外小心。
尽管并不建议,但可以通过为 -zfs create -V 指定 s 标志或在创建卷后更改预留空间来创建稀疏卷。稀疏卷指预留空间与卷大小不相等的卷。对于稀疏卷,预留空间中不会反映对 volsize 的更改。
有关使用卷的更多信息,请参见ZFS 卷。
除了本机属性外,ZFS 还支持任意用户属性。用户属性对 ZFS 行为没有影响,但可通过用户环境中有意义的信息来注释数据集。
必须包含冒号字符 (':'),以与本机属性相区分。
必须包含小写字母、数字或以下标点符号:':'、'+'、'.'、'_'。
用户属性名称的最大长度为 256 个字符。
预期约定是属性名分为以下两个部分,但 ZFS 不强制使用此名称空间:
module:property
在程序中使用用户属性时,请对属性名的 module 部分使用反向 DNS 域名,以尽量避免两个独立开发的软件包将同一属性名用于不同用途。以 com.oracle. 开头的属性名保留供 Oracle Corporation 使用。
用户属性的值必须符合以下约定:
必须由始终继承且从不验证的任意字符串组成。
用户属性值的最大长度为 1024 个字符。
例如:
# zfs set dept:users=finance userpool/user1 # zfs set dept:users=general userpool/user2 # zfs set dept:users=itops userpool/user3
对属性执行操作的所有命令(如 zfs list、zfs get、zfs set 等)都可用来处理本机属性和用户属性。
例如:
zfs get -r dept:users userpool NAME PROPERTY VALUE SOURCE userpool dept:users all local userpool/user1 dept:users finance local userpool/user2 dept:users general local userpool/user3 dept:users itops local
要清除某一用户属性,请使用 zfs inherit 命令。例如:
# zfs inherit -r dept:users userpool
如果任意父数据集中均未定义该属性,则会将其完全删除。