【问题标题】:Cleaning up a sparsebundle with a script使用脚本清理 sparsebundle
【发布时间】:2013-11-16 13:34:51
【问题描述】:

我正在使用时间机器将一些服务器备份到稀疏磁盘映像包中,并且我想要一个脚本来清理旧备份并在空间释放后重新调整映像大小。我相当确定数据受到保护,因为如果我通过右键单击删除旧备份,我必须输入密码才能删除它们。为了让我的脚本能够删除它们,我一直以 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 进行查找,但没有任何区别。

对此的任何帮助将不胜感激,因为我不知道为什么这不起作用。

【问题讨论】:

    标签: macos bash osx-mountain-lion timemachine


    【解决方案1】:

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

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

    (注意:任何时候你看到命令rm,特别是后面跟着-Rf特别是,在以root身份运行时,请确保在按回车之前知道它指向什么。)

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

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

    请注意,删除旧快照实际上只会删除未与其他快照共享的文件;因此,如果您删除一周前的所有快照,您不会删除一周内未修改的文件(备份),而是删除一个多星期前删除的文件。哪个更可能是您想要的...

    【讨论】:

    • 我不是在精简备份,而是在删除旧的备份。每天时间机器都会向我的 sparsebundle 添加一个新的完整备份,它开始填满我的驱动器。我需要做的是删除一个多星期前创建的整个备份。我使用 mtime 的原因是因为我使用的是备份目录的修改时间。对于 10 月 22 日的备份,该目录的修改时间为 2013 年 10 月 22 日。
    • find 将搜索所有级别的文件夹(除非您明确告诉它不要使用 -maxdepth)——这意味着它不仅在寻找旧的 shapshots,而且还在寻找旧的目录 within 快照。您确实需要确保查看快照级别,然后使用tmutil delete 而不是rm。此外,TM 不会每天都添加完整备份,它会执行文件级增量备份,然后使用硬链接进行技巧,以便每个快照都包含完整备份。这个诡计是你不应该在不通过 TM 的情况下删除内容的主要原因。
    【解决方案2】:

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

    来自 (this site on how time machine works) ---------

    当 Time 进行第一次备份时,它会复制所有内容(除了一些系统工作文件、垃圾等)。它还制作了一个有日期的备份文件夹,并在其中放置了指向它刚刚制作的所有备份副本的硬链接。然后,当 Time Machine 进行第二次备份时,它会复制自第一次备份以来更改的所有内容,创建另一个已注明日期的备份文件夹,并在其中放入指向新备份项目的硬链接。到目前为止,一切顺利。

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


    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-29
      • 2019-08-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多