我正在尝试用 1TB FireWire 400 驱动器替换我用作 Time Machine 备份设备的 640GB USB2 驱动器,而不会丢失当前的备份历史记录。考虑到 640GB 驱动器几乎已满,并且此组合的传输限制为 400Mbps,我意识到此过程可能需要相当长的时间,并且可能会在中途中断。因此,我决定尝试使用rsync
Finder 而不是 Finder 来执行此操作(因为苹果建议)。经过几次错误的尝试和网上搜索后,我决定使用以下rsync
命令:
rsync -aHXSvPh --hfs-compression --protect-decmpfs /Volumes/Macintosh\ BK/Backups.backupdb /Volumes/Untitled
但是,此命令仍然会导致目标驱动器严重膨胀(以至于我认为旧驱动器的内容无法放入新驱动器中,尽管新驱动器大约大 1.5 倍)。rsync
我是否缺少任何可以消除这种膨胀的选项(我使用的是 v3.1.2 协议版本 31)?
我还想到,也许我使用的工具不对。块复制工具是否dd
更合适?如果合适,我该如何设置它,以便在发生中断时(例如,由于整个系统崩溃而导致的中断,在我运行命令时发生过两次这种情况rsync
)使进程可恢复?我dd
以前从未使用过,因此不熟悉它的功能(但可以使用 Mac OSX 随附的版本和 GNU 版本 8.25)。
答案1
dd
不会根据目标卷大小调整各种卷数据结构,因此只有在源卷和目标卷确切地大小相同。一般来说,我建议asr
这样做,但是崩溃后没有很好的方法继续。
因此,一种可能性是缩小目标卷以匹配源卷,用于dd
复制原始卷,然后将目标扩展回完整的 1TB。我还没有测试过,但我认为这是您需要的过程:
diskutil list
将列出卷的设备标识符(例如 disk2s3 是物理磁盘 #2 的第三个切片(分区))diskutil info <sourcevolumeid>
将列出源卷大小(以字节为单位)(以及许多其他信息)diskutil resizeVolume <targetvolumeid> <sourcevolumesize>B
(“B” 表示“字节”——请参阅手册页的“SIZES”部分diskutil
)。diskutil unmount <sourcevolumeid>
并且diskutil unmount <targetvolumeid>
——不要dd
在已安装的卷上使用!sudo dd if=/dev/r<sourcevolumeid> of=/dev/r<targetvolumeid>
进行复制。请注意设备名称上的“r”前缀 - 这会绕过操作系统磁盘缓冲区,并且根据我的经验,dd
运行速度会更快。请非常小心地获取正确的卷 ID,否则您可能会复制一个空白卷覆盖您的备份!- 最后,使用
diskutil resizeVolume
或磁盘工具将目标卷扩展为整个磁盘的大小。
哦,还有一点警告:此过程假设源或目标均未由 Core Storage 管理。如果它们由 Core Storage 管理(例如,如果它们已加密),事情会变得有点复杂。
答案2
简而言之,Time Machine 大量使用硬链接,即一个底层文件(一个字节流)在文件系统的多个目录中显示为多个文件名。如果您在复制时不了解硬链接,那么该底层文件将被复制多次(每次硬链接时复制一次)。
假设您有一个 1GB 的磁盘映像文件,它从一开始就在那里,所以它会在您所有的定期 Time Machine 备份中显示为硬链接,并且您有 100 个 Time Machine 备份。如果您在复制时没有巧妙地处理硬链接,那么您最终会得到 100 个 1GB 文件的副本,总共 100GB,而不是只有 1GB 的文件和 100 个指向它的硬链接。
我确信 Apple 知道他们的 Finder 复制建议可以正确保存硬链接。我希望磁盘实用程序的“恢复”功能也能做到这一点。不要让“恢复”这个名字欺骗了你,它不仅仅是用于从备份中恢复;它是磁盘实用程序从一个卷(或磁盘映像)到另一个卷(或磁盘映像)进行块复制的方式。
更新后添加:
嗯,rsync -H
应该保留硬链接。您确定目标卷是 HFS+,还是 OS X 信任的其他文件系统(带有硬链接)?