更改现有 ZFS 数据集的记录大小

更改现有 ZFS 数据集的记录大小

我想更改recordsize现有 ZFS 数据集的属性。

手册页指出:

更改文件系统的记录大小只会影响后来创建的文件;现有文件不受影响。

因此,简单地更改recordsize属性只会对新创建的文件产生影响。我希望现有文件也能利用新的记录大小。

zfs send数据集是否会将zfs receive现有文件转换为新的记录大小,或者我是否必须手动将文件从数据集中复制出来然后再复制回来?

答案1

如果您想利用新的记录大小,则需要将数据复制并重新复制到文件系统。

但我不确定你的问题是什么。

答案2

我知道回复晚了,但这里有几点建议:

  1. zfs receive有一个-o recordsize选项可以让您覆盖接收端的值。

  2. 我认为同步 ZFS 数据集最容易实现,方法是使用 syncoid 的帮助(它是萨诺伊德套件)。例如,以下相当简单的命令行会将给定的数据集从现有的 Zpools 复制apool到,同时在接收端bpool强制将所需的大小设置为 64k:recordsize

    syncoid --recursive --recvoptions="o recordsize=64k" apool/DATASET bpool/DATASET
    

syncoid是 的包装器zfs send/receive,它根据自己管理的快照进行操作;因此您可以在系统运行时使用它,也可以发送增量。 --recvoptions传递给zfs receive。此选项仅记录在syncoid的手册页中,而不是 Github 页面上,但它的工作方式与预期完全一致。

答案3

这是一个旧的回复,但是您不能使用zfs send+zfs recv来更改记录大小。

我被某个地方的阅读所欺骗,它确实会改变记录大小,然后我开始从事一个项目,我需要阅读大量有关流格式的内容,并发现它总是引用流中已经存在的记录大小的对象 ID。自然,您可能会认为这不是问题,它可以在接收端进行更改,但由于它支持增量更新,因此当它引用块 ID + 块偏移量时,如果不将原始信息存储在 ZFS 中的某个位置,就不可能存储 FREE 命令,而事实并非如此。

相关内容