我已经建立了一个复杂的备份方案,每小时、每天、每周、每月进行备份,这些备份几乎不占用设备上的额外空间(感谢 btrfs cow 文件系统)。
但不幸的是,我用老式的方法(复制了太多东西)耗尽了空间。
现在删除某些内容是没有用的,因为它会保留在所有快照中。要释放磁盘空间,我必须删除自文件首次复制到设备以来的所有快照。我不想这样做,因为
- 很难确定具体发生的时间(特别是如果文件从那时起被更改了)
- 我不想丢失这些快照中所有其他文件的历史记录
- 访问快照只能通过挂载它们来完成,对于 root-fs 来说,这比直接执行要复杂一些
rm -f
那么我该如何告诉 btrfs 删除所有快照中的单个文件?实际上,这意味着将一些内部引用计数器设置为零,以便可以释放空间。
如果 btrfs 工具本身无法实现这一点(这有点短视),我也很乐意使用任何第三方工具来简化在所有快照中搜索、挂载和删除文件的任务。
答案1
一种解决方法是临时将快照设置为可写,然后删除出现它们的每个快照上的文件。
要将快照设置为可写(从如何使 btrfs 快照可写?):
btrfs property set -ts <snapshot> ro false
删除文件以释放空间,然后使用
btrfs property set -ts <snapshot> ro true
一旦对文件的所有引用都消失,btrfs 就会检测到有更多的可用空间。
不幸的是,如果你忘记了文件以前的命名,这种方法就没什么用了。但你仍然可以使用猴面包树或者K4DirStat或者du -h | sort -h
查找快照中大文件的位置。
此外,如果您可以挂载包含快照的目录,则不必单独挂载每个快照。