在 Oracle® Solaris 11.2 中管理 ZFS 文件系统

退出打印视图

更新时间: 2014 年 12 月
 
 

ZFS 磁盘空间记帐

ZFS 建立在池存储概念的基础上。与典型文件系统映射到物理存储器不同,池中的所有 ZFS 文件系统都共享该池中的可用存储器。因此,即使文件系统处于非活动状态,实用程序(例如 df)报告的可用磁盘空间也会发生变化,因为池中的其他文件系统会使用或释放磁盘空间。

注意,使用配额可以限制最大文件系统大小。有关配额的信息,请参见设置 ZFS 文件系统的配额。可以利用预留空间保证一个文件系统拥有指定大小的磁盘空间。有关预留的信息,请参见设置 ZFS 文件系统的预留空间。此模型与 NFS 模型非常相似,NFS 模型基于同一文件系统(例如 /home)挂载多个目录。

ZFS 中的所有元数据都是动态分配的。其他大部分文件系统都会预分配其大量元数据。因此,创建文件系统时,此元数据需要直接占用空间。此行为还意味着文件系统支持的文件总数是预先确定的。由于 ZFS 根据需要分配其元数据,因此不需要初始空间成本,并且文件数只受可用磁盘空间的限制。对于 ZFS 文件系统,对 df -g 命令输出的解释必须和其他文件系统不同。报告的 total files 只是根据池中可用的存储量得出的估计值。

ZFS 是事务性文件系统。大部分文件系统修改都捆绑到事务组中,并异步提交至磁盘。这些修改在被提交到磁盘之前称为暂挂更改。已用磁盘空间量、可用磁盘空间量以及文件或文件系统引用的磁盘空间量并不考虑暂挂更改。通常,暂挂更改仅占用几秒钟的时间。即使使用 fsync(3c)O_SYNC 提交对磁盘的更改,也不一定能保证有关磁盘空间使用情况的信息会立即更新。

在 UFS 文件系统上,du 命令报告文件中数据块的大小。在 ZFS 文件系统上,du 报告在磁盘上存储的文件的实际大小。该大小包括元数据以及压缩。此报告确实有助于解答“删除此文件可获得多少多余空间?”这一问题。因此,即使压缩已关闭,您仍会在 ZFS 和 UFS 之间看到不同的结果。

df 命令与 zfs list 命令报告的空间占用进行比较时,请注意,df 报告的是池大小而不仅仅是文件系统大小。此外,df 不了解后代文件系统或快照是否存在。如果在文件系统上设置了任何 ZFS 属性(如压缩和配额),则协调由 df 报告的空间占用可能很难。

请考虑也可能影响所报告的空间占用的以下情况:

  • 对于大于 recordsize 的文件,文件的最后一个数据块通常只填充大约 1/2。当缺省 recordsize 设置为 128 KB 时,每个文件大约浪费 64 KB,这可能影响很大。集成 RFE 6812608 可解决此情况。通过启用压缩可解决此问题。即使数据已压缩,最后一个数据块的未使用部分也将以零填充,且压缩非常好。

  • 在 RAIDZ-2 池上,每个数据块至少要占用 2 个扇区(512 字节块)来存储奇偶校验信息。奇偶校验信息所占用的空间不会被报告,但是因为它可能是变化的,且在小数据块中所占的百分比更大,因此对空间报告可能有显著影响。对于设置为 512 字节的 recordsize,影响更为明显,其中每个 512 字节的逻辑数据块都占用 1.5 KB(该空间的 3 倍)。不管存储什么数据,如果您最关注的是空间效率,则应该将 recordsize 保留为缺省值 (128 KB),并启用压缩(至 lzjb 的缺省值)。

  • df 命令不会识别已由重复数据删除操作剔除的文件数据。

空间不足行为

文件系统的快照开销很小,并且很容易在 ZFS 中创建。在大多数 ZFS 环境中,快照是常见现象。有关 ZFS 快照的信息,请参见Chapter 6, 使用 Oracle Solaris ZFS 快照和克隆

尝试释放磁盘空间时,快照的存在会引起某种意外行为。通常,获取适当的权限后,可从整个文件系统中删除一个文件,此操作会使文件系统有更多的可用磁盘空间。但是,如果要删除的文件存在于文件系统的快照中,则删除该文件不会获得任何磁盘空间。快照将继续引用该文件使用的块。

由于需要创建新版本的目录来反映名称空间的新状态,因此删除文件会占用更多的磁盘空间。此行为意味着,尝试删除文件时可能收到意外的 ENOSPC 或 EDQUOT 错误。