ZFS显示可用空间,无法删除

时间:2017-04-05 16:37:15

标签: linux debian zfs

我有一个旧的zfs池(创建于05-2012),它在debian 7.6上运行,并且有dF报告的26Gbytes(58Tbytes)。我刚刚重新安装了os(debian 8.7),现在游泳池在df中显示为0字节,但是1.04Tbyte" FREE"与zpool列表。

我有两个问题:

1)zpool list(= 1.04Tbytes)中的FREE与zfs list(= 0)中的AVAIL有什么区别?

2)有什么办法可以使用这个1Tbyte的可用空间吗?我删除了所有快照,这没有任何区别......

提前致谢。

% df -h /contentA
Filesystem      Size  Used Avail Use% Mounted on
contentA         58T   58T     0 100% /contentA

% zpool list contentA
NAME       SIZE  ALLOC   FREE  EXPANDSZ   FRAG    CAP  DEDUP  HEALTH  ALTROOT
contentA    65T  64.0T  1.04T     16.0E      -    98%  1.00x  ONLINE  -

% zfs list contentA
NAME       USED  AVAIL  REFER  MOUNTPOINT
contentA  58.0T      0  58.0T  /contentA

% uname -a
Linux myserver 3.16.0-4-amd64 #1 SMP Debian 3.16.39-1+deb8u2 (2017-03-07) x86_64 GNU/Linux

% cat /etc/debian_version 
8.7

1 个答案:

答案 0 :(得分:1)

zfs(8)手册页中,available表示:

The amount of space available to the dataset and all its children,
assuming that there is no other activity in the pool. Because space
is shared within a pool, availability can be limited by any number of
factors, including physical pool size,  quotas, reservations, or other
datasets within the pool.

一般来说,查找差异的第一个地方是该数据集之外的内容,例如在同一个池中的不同数据集上设置的预留。

但是,从您的帖子看来,您运行的数据集list可能是您的池的根数据集,它应该考虑到那里的所有其他子数据集。在某些情况下,您的池配置可能会导致这种差异,详见Oracle docs

然而(再次),这些通常适用于在逻辑数据大小扩展的情况下冗余和元数据存储所需的空间(即镜像池显示available空间的一半free空间} space,因为您写入数据集的每个字节都必须复制到两个地方)。由于您的数据集available为零,显然这不仅仅是考虑到未来写入的预测开销。

这让我得出最后的解释。 ZFS在其空间会话中内置了一个安全机制,以防止用户填满超过63/64的游戏池(这让我觉得非常接近你的情况下的比例,因此几乎可以肯定你正在达到的限制)。因为ZFS总是需要新的空间来修改磁盘状态(因为写时复制),如果你超出了这个限制,那么池可能不再能够删除东西以释放新的写入空间,使其变为只读 - 永久。虽然可以修补ZFS或更改可调参数以绕过限制,但我不推荐它!