如何在 btrfs 系统上删除所有快照中的文件?

Cha*_*_99 3 linux snapshot btrfs

我已经建立了一个复杂的备份方案,包括每小时、每天、每周、每月的备份,几乎不占用设备上的额外空间(感谢 btrfs 牛文件系统的荣耀)。

但不幸的是,我用老式的方式用完了空间(通过向它复制很多东西)。

现在删除一些东西是没有用的,因为它存在于所有的快照中。为了释放磁盘空间,我必须删除所有快照,因为文件首先被复制到设备上。我不想那样做,因为

  • 很难知道这是什么时候(特别是如果文件被更改了)
  • 我不想丢失这些快照中所有其他文件的历史记录
  • 访问快照只能通过挂载它们来完成,对于 root-fs 来说有点复杂,然后只是做 rm -f

那么如何告诉 btrfs 在所有快照中删除单个文件?实际上,这意味着将一些内部参考计数器设置为零,以便可以释放空间。

如果 btrfs 工具本身无法做到这一点(这有点短视),我也很高兴任何第三方工具可以简化在所有快照中搜索、挂载和删除文件的任务.

Zip*_*ilt 7

一种解决方法是暂时将快照设置为可写并删除它们出现的每个快照上的文件。

设置快照可写(来自如何使 btrfs 快照可写?):

btrfs property set -ts <snapshot> ro false

删除文件以释放空间,然后将其设置回只读

btrfs property set -ts <snapshot> ro true

一旦对文件的所有引用都消失了,btrfs 将检测到有更多可用空间。

不幸的是,如果您忘记了文件过去的名称,则此方法无济于事。但是您仍然可以使用BaobabK4DirStatdu -h | sort -h查找大文件在快照中的位置。

此外,如果您可以只挂载包含它们的目录,则不必单独挂载每个快照。