2 个稳定版本

2.0.0 2022年10月29日
1.0.0 2022年9月13日

#1421 in 文件系统

MIT/Apache

30KB
669

块级写时复制

这是什么?

这是一个小巧的工具,允许你在不影响原始文件的情况下修改大文件,同时也不需要制作整个副本。

它作为一个用户空间的文件系统实现,跟踪文件块的变化。

例如,如果你有一个大型数据库或虚拟硬盘,并且你想进行更改但保留原始文件;你可以使用此工具创建文件的副本

$ touch virtual_copy.db
$ cowblock original.db virtual_copy.db &
$ sqlite3 virtual_copy.db
  # Make changes here
  # The changes are visible in virtual_copy.db,
  # but no change is made to original.db
  # The changed blocks are stored in virtual_copy.db-diff and virtual_copy.db-extra,
  # which are much smaller files
$ fusermount -u virtual_copy.db

为什么?

有写时复制文件系统的选项,但它们相当有限

  • 像 unionfs-fuse、aufs 和 overlayfs 这样的工具为文件系统实现了写时复制,但在需要写入时需要复制整个文件。没有办法在不制作副本的情况下复制大文件的一部分。
  • btrfs 或 zfs 这样的文件系统提供写时复制(使用 cp --reflink),但你需要使用该文件系统才能从中受益。
  • 你可以滥用 devicemapper 来实现这一点,但这非常困难(并且你会得到设备而不是普通文件)

如何?

差异文件在开头包含一个索引,指示文件块在差异中可以找到的位置。尚未覆盖的块为 0,而其他数字是差异文件中块的索引。

在每次读取块之前检查索引,以确定是否应从原始文件或差异文件中读取。

依赖项

~3–4MB
~68K SLoC