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

use*_*689 4 filesystems btrfs

刚开始学习 btrfs 并考虑切换。

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

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

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

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

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

  5. 例如,如果我从源代码构建 gcc,我认为构建目录最终为 5-8GB。如果我定期从源代码构建它,我正在“咀嚼”一堆硬盘空间,对吗?(即使假设 delete 删除了被删除文件的所有内容,我也不知道在没有 make clean 的情况下在构建过程中删除了多少文件——无论现有的目标文件是在技术上被删除还是只是“重新写入”其中。 )

Cel*_*ada 7

我认为你的大部分问题都可以通过记住在 Btrfs 中简单地回答,快照并不是很特别,它只是一个 Btrfs 子卷。碰巧的是,当它被创建时,它有初始内容而不是空的,并且这些初始内容的存储空间与快照来自的任何子卷共享。

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

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

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

  1. 可以像 VMware/VirtualBox 快照一样使用和考虑 root 的 btrfs 快照吗?

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

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

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

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

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

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

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

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

  1. 例如,如果我从源代码构建 gcc,我认为构建目录最终为 5-8GB。如果我定期从源代码构建它,我正在“咀嚼”一堆硬盘空间,对吗?

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