我希望使用 BTRFS 在 VirtualBox 中托管虚拟机,以便能够在没有 LVM 或类似技术的情况下使用快照。理论上,CoW
由于性能原因,我并不总是需要行为,而且使用nodatacow
它似乎也不需要。我希望采用一种据我理解 Windows 和 NTFS 似乎正在使用的方法:数据一直在更改CoW
,但如果创建文件系统快照,则当前数据将通过复制数据(如果需要以任何方式更改)来保存在该快照中。重要的似乎是这在每个快照中只发生一次,并且实际上只针对修改过的块。因此,在首先复制掉要修改的块之后,对同一块的所有后续修改都只是应用,同样没有CoW
行为。
除了将原始更改数据块复制到某个安全的地方之外,从性能角度来看,这对我来说非常有意义,我希望有这种行为来托管我的虚拟机。它们一直在写入一些数据,我只是不明白我需要如何CoW
为所有这些更改提供行为。
我只想CoW
在有目的地创建文件系统快照之后,例如出于备份目的。之后,我CoW
当然需要能够在需要时保持快照的一致性。但同样,即使在创建快照之后,我也不需要CoW
永远保留所有数据,而只需要对之后更改的块进行一次快照。第一个快照之后的所有更改都可以简单地应用,无需任何更改CoW
。
根据我对 BTRFS 文档的理解,如果CoW
某个文件发生一次,它就会永远发生。但我当然可能是错的……
那么,我希望通过 BTRFS 实现什么目标吗?
答案1
如果
CoW
某个文件发生一次,它就会永远发生。但我当然也可能是错的。
我认为你错了。我发现这个问题拍摄已安装的 BTRFS 卷的快照nodatacow
那里有引文(来自BTRFS 邮件列表)这对您的情况来说似乎至关重要:
在 NOCOW 文件上,快照后对文件块(4096 字节)的第一次写入仍必须是 COW,因为快照将旧版本锁定在原处,而现在文件块已更改,因此尽管存在 NOCOW,仍必须将其写入其他地方,以保持快照原样。但是,文件确实保留了 NOCOW 属性,并且对同一文件块的其他写入将保持原位……当然,直到下一个快照。
看起来nodatacow
mount 选项正好满足了你的要求。但请记住,它有局限性:
nodatacow
不要对以下对象进行写时复制数据:新创建的文件,现有文件不受影响。这也会关闭校验和![…] 系统故障时可能会获取部分更新的文件。[…] 关闭压缩!
来源:BTRFS 挂载选项。