假设我有一个包含 100 个快照的数据集,并且想要rm -rf
所有快照中的所有文件夹都名为“缓存”。
我想真正释放空间,而不仅仅是将其隐藏在快照层中,因此创建一个克隆并从中删除然后拍摄新的快照似乎并不能满足我的要求。
有没有半自动化的方法可以做到这一点? 一些围绕 zfs list -t 快照、zfs clone、zfs boost、zfs 快照的方法?
(交叉发布自https://superuser.com/questions/313197因为我看到这个有更多的 ZFS 东西)
答案1
快照是只读的。如果您需要如果这些文件夹消失了,那么您必须删除整个快照。
您可以进行备份(使用类似 tar 的程序),排除有问题的文件夹,然后删除快照。显然,备份现在是 tar 格式,或其他格式;但至少您还有一份备份副本。
答案2
您可以尝试以下操作:
- 将最旧的快照克隆到新的文件系统(称之为
fsnew
)。 - 提升克隆(
fsnew
)以允许您销毁文件系统所基于的快照。 - 删除有问题的文件。
- 创建 的快照
fsnew
。
现在,对于之后的每个快照,rsync
使用--inplace
从快照到 fsnew 的标志跳过您不需要的文件。该--inplace
标志减少了写入次数并允许使用较小的快照。
- 创建 的快照
fsnew
。 - 销毁原始快照。
完成后,您应该有一个快照,fsnew
该快照对应于原始文件系统的快照,并且删除了有问题的文件。
如果驱动器上有空间,您可能希望跳过“destroy”命令,直到脚本正常运行为止。
答案3
- 销毁原始快照。
升级操作后您无法销毁原始快照。只有这样才能销毁父数据集。
示例(提升克隆之后)。
zfs 销毁 media1/cheers/[电子邮件保护]
无法销毁“media1/cheers/[电子邮件保护]':快照有依赖克隆
使用‘-R’销毁以下数据集:
媒体1/媒体/[电子邮件保护]
媒体 1/媒体/备份
zfs 销毁 media1/media/[电子邮件保护]
zfs 销毁 media1/cheers/[电子邮件保护]
无法销毁“media1/cheers/[电子邮件保护]':快照有依赖克隆
使用‘-R’销毁以下数据集:
媒体 1/媒体/备份
经过这次“搞笑”的操作后,我必须进行下一次
zfs 快照 media1/media/backup@1
zfs 发送 media1/media/backup@1 | pv | zfs 接收 media1/media/backupnew
zfs 销毁 media1/media/backup@1
zfs 销毁 -R media1/media/备份
zfs 重命名 media1/media/backupnew media1/media/backup
或者反转提升一个。zfs 提升 media1/media/backup 并在其之后删除克隆,因为你将在 src 位置有一个大的快照)
只有 rsync/backup 可以在这里提供帮助。
答案4
特定 ZFS 文件系统的 ZFS 快照可以在.zfs/snapshots
文件系统根目录中找到。您应该能够编写一个脚本来遍历此文件夹并rm
找到您需要的文件,然后将其从快照本身中删除。