概念化 btrfs - 了解快照和使用的空间

概念化 btrfs - 了解快照和使用的空间

刚刚开始了解 btrfs 并考虑切换。

我目前对 btrfs 的看法是,它的运行方式与 git 非常相似,所有内容都会被跟踪,并且在更改后每 30 秒进行一次提交。但是,我的直觉告诉我我一定是误解了,否则硬盘空间会更快地用完——所以我想知道它是否更像 git,跟踪所有内容,在更改后每 30 秒将文件添加到暂存区域,并且文件仅在快照上提交。

  1. 如果我不做快照,你能将单个文件回滚到几个更改之前吗?或者只有在拍摄快照时才会保留?即,如果您运行一个 for 循环 10,000 次,并附加到一个文件,中间有 31 秒的睡眠,您是否会看到该文件的 10,000 个条目的祖先树,您能返回到每个条目吗?

  2. 根的 btrfs 快照是否可以像 VMware/VirtualBox 快照一样使用和思考?您可以在哪里关闭一个分支,保存其状态,移动到另一个分支,启动,进行更改,以便拥有一个发散的快照分支,然后沿着树移动到您想要的任何位置?如果是这样,是否有一个引导加载程序可以让您选择快照树节点? (无需为每个快照创建 grub.cfg 菜单条目。)

  3. 我标记快照 A,进行更改并将其标记为 B。如果我返回快照 A 并进行更改(即使只是通过引导更改 /var/log),这些更改是在“分离”或“未标记”快照中进行的,所以如果回到B,这些变化将不可见?如果是这样,如果我在此“未标记”快照中进行了更改,并且在标记它之前不小心要求更改为另一个快照,会发生什么情况?

  4. 删除文件时,是否写入了“此文件已删除”元数据,因此文件的所有版本仍然占用空间?或者,假设没有快照仍然指向它,它是否会删除所有以前的版本?

  5. 例如,如果我从源代码构建 gcc,我认为构建目录最终会达到 5-8GB。如果我定期从源代码构建它,我就会“消耗”大量硬盘空间,对吧? (即使假设删除删除了要删除的文件的所有内容,我也不知道在没有 make clean 的情况下在构建过程中删除了多少文件 - 现有的对象文件是在技术上被删除还是只是在其中“重写”。 )

答案1

我认为您的大多数问题只需记住在 Btrfs 中,快照并不特别,它只是一个 Btrfs 子卷即可得到解答。碰巧的是,当它被创建时,它具有初始内容而不是空的,并且这些初始内容的存储空间与快照来自的任何子卷共享。

快照就像(完整)副本,但由于共享存储而更经济。

  1. 如果我不做快照,你能将单个文件回滚到几个更改之前吗?

不会。就像任何常规文件系统一样,修改文件具有破坏性。您无法神奇地返回到早期版本。

  1. 根的 btrfs 快照是否可以像 VMware/VirtualBox 快照一样使用和思考?

VM磁盘映像通常是块设备,而不是文件系统或文件系统上的文件,所以我认为它有点不同。

我想,您可以使用 Btrfs 文件作为 VM 虚拟块设备的后备存储。在这种情况下,这个问题的答案是肯定的。除非您使用 NOCOW 选项(实际上建议用于磁盘映像)。那么可能不会,因为写时复制是使快照发挥作用的魔力。

  1. 我标记快照 A,进行更改并将其标记为 B。如果我返回快照 A 并进行更改(即使只是通过引导更改 /var/log),这些更改是在“分离”或“未标记”快照中进行的,所以如果回到B,这些变化将不可见?

Btrfs 中的每个子卷(包括快照)都有一个名称,因此您不能拥有“未标记”的快照。

一般来说,您在一个 Btrfs 子卷中所做的任何更改(无论是否作为快照创建)在另一个 Btrfs 子卷中绝对不可见。请记住,快照就像副本一样,但更经济。

  1. 删除文件时,是否写入了“此文件已删除”元数据,因此文件的所有版本仍然占用空间?

删除文件时,其目录条目将被删除。这是对目录的修改,与所有修改一样,它对于发生修改的子卷来说是私有的。然后,当且仅当文件的存储空间没有被文件系统的任何其他部分使用时,它才会被释放。

删除存储在多个快照之间共享的文件很像删除任何常规文件系统中具有多个(硬)链接的文件。如果存储 [inode] 不再被引用,则它会被释放。

  1. 例如,如果我从源代码构建 gcc,我认为构建目录最终会达到 5-8GB。如果我定期从源代码构建它,我就会“消耗”一堆硬盘空间,对吧?

如果您gcc在多个不同的目录中多次构建,那么是的,它将使用越来越多的空间。如果您在构建之间删除副本或每次覆盖相同的构建目录,那么,不,没有什么特别的原因它会继续使用越来越多的空间。

答案2

我目前对 btrfs 的看法是它的运行方式与 git 非常相似,……

事实并非如此。

快照的工作方式更像是cp -a /path/to/source /path/to/snapshot,只不过它们共享数据,并且拍摄快照速度很快。但该数据是写时复制的;如果您写入该文件,则写入的部分将不再共享。

(注意,在 btrfs 上cp--reflink一个选项,可以制作与快照非常相似的副本。)

(1) 一般情况下,不会。仅当您拍摄快照时。

(2) 它们更接近 LVM 快照。不过,您可以使用 btrfs send 来移动它们。但没有分支之类的东西——尽管你可以制作另一个快照。

(3) 它们将成为 A 的一部分。B 将保持不变。 A会被改变。

(4) 删除文件释放空间。版本仅作为快照的一部分保留。

(5) 没有错误,应该不是问题,除非您决定创建快照。当然,这些会占用空间(通过删除快照释放空间)。

相关内容