使用脚本清理sparsebundle

时间:2013-11-05 15:50:30

标签: macos bash osx-mountain-lion timemachine

我使用时间机器将一些服务器备份到稀疏磁盘映像包,并且我希望有一个脚本来清理旧备份并在空间释放后重新调整映像大小起来。我确信数据是受保护的,因为如果我通过右键单击删除旧备份,我必须输入密码才能删除它们。为了让我的脚本能够删除它们,我一直在以root身份运行它。出于某种原因,它只是赢了,并且它试图删除的每个文件都得到了

rm: /file/: Operation not permitted

以下是我的剧本:

#!/bin/bash

for server in servername; do
    /usr/bin/hdiutil attach -mountpoint /path/to/mountpoint /path/to/sparsebundle/$server.sparsebundle/;
    /bin/sleep 10;
    /usr/bin/find /path/to/mountpoint -type d -mtime +7 -exec /bin/rm -rf {} \;
    /usr/bin/hdiutil unmount /path/to/mountpoint;
    /bin/sleep 10;
    /usr/bin/hdiutil compact /path/to/sparsebundle/$server.sparsebundle/;
    done

exit;

我认为导致此问题的一个问题是需要指定一个挂载点,因为默认挂载是/ Volumes / Time \ Machine \ Backups /这就是我创建挂载点的原因。我还认为它试图在安装后快速删除文件并且它还没有实际安装,这就是为什么我加入了睡眠。我也尝试使用-delete选项代替-exec,但它没有任何区别。

对此的任何帮助都将非常感激,因为我不知道为什么这样做不会起作用。

2 个答案:

答案 0 :(得分:1)

首先,以这种方式细化备份是一个非常糟糕的主意。首先,当您在目录上使用find -mtime测试时,您将检查上次修改该目录的时间;你需要检查的是 中的某个目录被修改的最后一次。例如,我的Mac上的/(根目录)已被修改了10天,所以如果我在备份中使用了你的脚本(并且它有效),它将从所有备份中删除我的整个启动卷(包括最新的)一个)。

其次,你正在搞乱Time Machine精心安排的备份结构,这可能会有效地破坏备份(甚至包括未来的备份)。不要这样做。

(注意:当您以root身份运行时,只要您看到命令rm,尤其是-Rf ,尤其是,请确保在按返回之前知道它指向的是什么。)

现在,至于实际问题,我怀疑你遇到了Time Machine's safety net,这是一个内核扩展,试图防止损坏TM的备份。这是一件好事(见最后一点),你不应该禁用它。

但是有一个简单的解决方案:使用Time Machine。具体来说,使用tmutil delete /path/to/snapshot删除旧快照。快照路径类似于/path/to/mountpoint/Backups.backupdb/<servername>/<YYYY-MM-DD-HHMMSS>

请注意,删除旧快照实际上只会删除未与其他快照共享的文件;因此,如果您删除超过一周的所有快照,您没有摆脱(备份)一周内未修改的文件,您将摆脱一周前删除的文件。哪个更有可能成为你想要的......

答案 1 :(得分:0)

虽然这是一个旧线程,但需要提及的是,时间机器包中的备份不是副本,而是链接到文件(使用硬链接),这意味着如果文件没有更改,那么副本该文件只占用几个字节的开销,所以只是因为你可以看到文件的多个副本并不意味着它们都在使用物理空间。

from(this site on how time machine works)---------

当Time进行第一次备份时,它会复制所有内容(除了一些系统工作文件,垃圾箱等)。它还会创建一个过时的备份文件夹,并将硬链接放入其刚刚创建的所有备份副本中。然后,当Time Machine进行第二次备份时,它会复制自第一次备份以来更改的所有内容,生成另一个日期备份文件夹,并将硬链接放入新备份项。到目前为止,非常好。

但这就是诀窍:它还将第二个备份文件夹中的硬链接放到没有更改的项目中。因此,该文件夹现在包含指向第二次备份时系统上所有内容的链接。