ZFS:压缩算法改变后重新压缩现有文件

ZFS:压缩算法改变后重新压缩现有文件

我有一个于 2011 年创建的池,使用lzjb compression,直到几年后升级才允许我将压缩设置为lz4。我估计阵列上至少有 20% 的内容(按空间计算)是在 2013 年之前创建的,这意味着它仍然使用 进行压缩lzjb

我可以想到几个解决此问题并重新获得(一些)空间的选项:

  1. 备份并恢复到新池。不太实用,因为我没有足够的冗余存储来保存临时副本。恢复还需要池离线几个小时。

  2. 编写一个脚本来重新复制任何时间戳早于 2013 年的文件。这可能存在风险,尤其是当它卡在空格或其他特殊字符上并最终破坏原始名称时。

有没有办法让 ZFS 使用当前压缩算法重新压缩任何遗留块?有点像清理,但可以修复压缩。

相关问题:有没有办法查看每种压缩算法的使用情况?zdb 仅显示整体压缩统计数据,而不是将其分解为单独的算法。

答案1

您必须重新复制数据(全部或部分)或将数据发送/接收到新池或 ZFS 文件系统。

没有其他选择。

答案2

由于 ZFS 的设计方式,重写数据是唯一的办法,通常是复制到临时文件中并重命名原始文件。

gary17/zfs-recompress(我没有隶属关系),一个 shell 脚本,正是完成这个工作。

我发现该脚本的结果非常令人满意,但单线程处理对我来说太慢了,所以我用 Python 重写了它,以获得更好的性能和(可能)更好的文件名安全性。我的 Python 脚本位于iBug/zfs-recompress.py您可能想尝试一下。

zfs snapshot在尝试这些工具之前,请确保备份您的数据(或采取)。

相关内容