使用 rsync 从文件服务器提取硬链接备份数据到 exFAT 文件系统

使用 rsync 从文件服务器提取硬链接备份数据到 exFAT 文件系统

我需要从 Time Machine 备份中逐步提取特定目录的所有数据,因此:

  • 它适合目标驱动器大小
  • 它没有硬链接,因为目标卷文件系统是 exFAT
  • 无需使用 Crapple 的过时软件,就可以轻松地从 Windows 手动访问数据。

我有一台装有 macOS 的 Apple 笔记本电脑、一台装有 Windows 的 Windows 笔记本电脑和一台装有 macOS 的虚拟机。所以我使用终端。

备份存储在可.sparsebundle通过(或 SMB)从 Finder 访问的文件中afp://10.0.1.1,并可从 Finder 将其安装为名为的卷Time Machine Backups

备份里面的文件结构是这样的:

Backups.backupdb/MacBook Air/2013-01-01-000000/Macintosh HD/Users/TimApple/Desktop
├───Directory1
│   ├───File1.txt
│   └───File2.txt
├───Directory2
│   ├───File3.txt
│   └───File4.txt
├───File5.txt
└───File6.txt
Backups.backupdb/MacBook Air/2014-01-01-000000/Macintosh HD/Users/TimApple/Desktop
├───Directory1 (hard link to 2013-01-01-000000)
│   ├───File1.txt (hard link to 2013-01-01-000000)
│   ├───File2.txt (hard link to 2013-01-01-000000)
│   └───File7.txt
├───Directory2 (hard link to 2013-01-01-000000)
│   ├───File3.txt (hard link to 2013-01-01-000000)
│   ├───File4.txt (hard link to 2013-01-01-000000)
│   └───File8.txt
├───File5.txt (hard link to 2013-01-01-000000)
├───File6.txt (hard link to 2013-01-01-000000)
└───File9.txt
Backups.backupdb/MacBook Air/2015-01-01-000000/Macintosh HD/Users/TimApple/Desktop
├───Directory1 (hard link to 2013-01-01-000000)
│   ├───File1.txt (hard link to 2013-01-01-000000)
│   ├───File2.txt (hard link to 2013-01-01-000000)
│   ├───File7.txt (hard link to 2014-01-01-000000)
│   └───File10.txt
├───Directory2 (hard link to 2013-01-01-000000)
│   ├───File3.txt (hard link to 2013-01-01-000000)
│   ├───File4.txt (hard link to 2013-01-01-000000)
│   ├───File8.txt (hard link to 2014-01-01-000000)
│   └───File11.txt
├───File5.txt (hard link to 2013-01-01-000000)
├───File6.txt (hard link to 2013-01-01-000000)
├───File9.txt (hard link to 2014-01-01-000000)
└───File12.txt

我尝试实现的文件结构如下:

/Volumes/My Passport/MacBook Air/Desktop/2013-01-01-000000/
├───Directory1
│   ├───File1.txt
│   └───File2.txt
├───Directory2
│   ├───File3.txt
│   └───File4.txt
├───File5.txt
└───File6.txt
/Volumes/My Passport/MacBook Air/Desktop/2014-01-01-000000/
├───Directory1
│   └───File7.txt
├───Directory2
│   └───File8.txt
└───File9.txt
/Volumes/My Passport/MacBook Air/Desktop/2015-01-01-000000/
├───Directory1
│   └───File10.txt
├───Directory2
│   └───File11.txt
└───File12.txt

我可以提取全部的数据rsync(如建议这个答案),但它不会尊重硬链接-H开关。无论目标文件系统是 exFAT(不支持硬链接)还是 HFS+(支持硬链接),这都会导致所有硬链接文件重新复制到每个文件夹:

cd /Volumes/Time\ Machine\ Backups/Backups.backupdb/MacBook\ Air
for F in *; do rsync --progress --ignore-existing -avz -H $F/Macintosh\ HD/Users/TimApple/Desktop /Volumes/My\ Passport/MacBook\ Air/Desktop/$F; done

某人“请注意,硬链接无法跨单独的文件系统挂载工作。” — 也许这就是它无法满足我需求的原因。即使它能工作,也会在“最新”备份文件夹中留下大量硬链接,而这毕竟不是我需要的。

我也读过这篇博客文章使用rsync --link-dest=开关:

rsync -avz --progress --link-dest=PATHTO/$PREVIOUSBACKUP $SOURCE $CURRENTBACKUP

但我不知道如何使用--link-dest=switch:我应该使用什么来$PREVIOUSBACKUP链接到每个备份日期的文件夹?例如,如果我使用2013-01-01-000000位置$PREVIOUSBACKUP,它将无法正常工作,并且rsync只会在...中查找要硬链接的文件。2013-01-01-000000我应该手动获取所有日期的文件夹列表并--link-dest=为每个文件夹编写单独的命令吗?不管是什么,这对我来说都行不通,因为我不需要硬链接,因为 exFAT 不支持此功能。

因此我想出了一个计划,需要一些批评和帮助:

  1. 复制我需要的文件夹的第一个备份(没有硬链接),即Backups.backupdb/MacBook Air/2013-01-01-000000/Macintosh HD/Users/TimApple/Desktop

  2. 生成一个 TXT 文件,其中包含发生增量备份的所有“其他”日期的文件夹列表:

    备份.backupdb/MacBook Air/2014-01-01-000000/Macintosh HD/用户/TimApple/桌面 备份.backupdb/MacBook Air/2015-01-01-000000/Macintosh HD/用户/TimApple/桌面

  3. 对于每个“其他”增量备份,生成一个单独的 TXT 文件,其中包含添加到最新文件夹的唯一文件列表(如建议的那样这个答案), IE:

由于 Time Machine 使用硬链接来存储未修改的文件(和目录),这意味着最新备份中更改的文件的链接数将为 1,因为它们是唯一的。将其与 find 一起使用可生成列表

cd /Volumes/Time\ Machine\ Backups/Backups.backupdb/MacBook\ Air
find 2014-01-01-000000/Macintosh\ HD/Users/TimApple/Desktop -type f -links 1 -print
find 2015-01-01-000000/Macintosh\ HD/Users/TimApple/Desktop -type f -links 1 -print
  1. 用于rsync仅复制步骤 3 中收集的 TXT 文件,使用--files-from=简要描述的开关这里

我不太熟悉终端,所以请告知我的计划是否可行,如果可能的话,请帮助完成这些步骤。

答案1

我不建议使用自定义脚本来改变备份的结构和存储方式。尤其是对于刚开始使用终端的人来说。数据丢失的风险太大,无论是目录存储方式的反转,还是重复数据删除部分。

如果您希望从 macOS 平台迁移,请在所需的时间点恢复所有需要的数据。也许将 SMB 安装连接到 Windows,然后从 Explorer 手动复制一个时间点。或者,恢复到 macOS,创建一个包含相关文件的 zip 存档,将其传输过来并提取。由于 Time Machine 不是 Windows 的东西,请在新平台上启动不同的备份程序。保留 Time Machine 备份以备需要更多恢复时使用。


rsync 能够维护源中存在的硬链接。即使目标位于不同的文件系统上。但是,由于以下几个原因,这不起作用:

extFAT 目标不支持链接。

您提议的脚本循环遍历日期戳并为每个日期戳运行 rsync 命令。日期之间的硬链接现在不在一个 rsync 命令的源集中。即使目标确实支持硬链接,rsync --hard-links单独使用它们也不会进行重复数据删除。

rsync --link-dest=DIR 检查 DIR 中的重复文件并将它们硬链接到目标。请注意,执行重复数据删除的是 rsync,而不是 Time Machine。当然,当目标不支持链接时,这将不起作用。

rsync --compare-dest=DIR行为不同,但在链接不可用时可以作为替代方案。当 DIR 中存在重复项时,不会传输文件。减少了使用的空间,但现在您需要手动查看以前的日期以查找所有文件。理论上很有用:复制所有最新树,然后使用 --compare-dest 来创建较旧的稀疏备份。

相关内容