如何从 OS X 上的稀疏包中回收所有/大部分可用空间

如何从 OS X 上的稀疏包中回收所有/大部分可用空间

是否有可能对稀疏捆绑图像进行“碎片整理”并回收(大部分)可用空间?

背景如下:我正在使用稀疏束,并且时不时地想从它们中回收空间,因此我运行:

hdiutil compact image.sparsebundle

但是,正如手册页中解释的那样,它只回收完全未使用的带文件,所以在我的情况下它说:

Reclaimed 0 bytes out of 90.4 GB possible.

当然,可以将该图像的内容复制到新的稀疏束中,然后代替使用,但这既麻烦又需要足够的可用空间来完成此操作。

同时,我发现 compact 命令的输出有些误导(我目前正在运行 OS X 10.5.7),因为它有时会列出可能的大小,更大比硬盘上图像包当前占用的大小要大。我没有仔细看,但输出似乎是最大大小或“最大大小”-“已用大小”。

答案1

有趣的!

据我所知,稀疏包将数据划分为 8Mb 的带区。如果幸运的话,更改带区大小可能会有所帮助。我的意思是,你永远不会获得 100% 回收的空间,但可能比你现在得到的更好。(取决于图像上的数据等。)

我做了一个简单粗暴的测试,测试了两个 500Mb 稀疏包,一个带大小为 8Mb(默认),另一个带大小为 1Mb(据我所知,这是允许的最小大小)。我复制了超过 400mb 的 mp3 文件,然后删除了所有其他文件,然后hdiutil compact对它们进行测试。

Size after compact
8Mb bands: 271Mb
1Mb bands: 215Mb

转换稀疏束的命令是

hdiutil convert src.sparsebundle -format UDSB -tgtimagekey sparse-band-size=2048 -o dst.sparsebundle

带区大小以 512 字节为单位。因此,上述示例将带区大小设置为 512 * 2048 = 1Mb。如果您要处理 TimeMachine 图像或用户主文件夹图像等,请务必小心。您偏离了 Apple 路径 :) 保留一个故障安全备份!

至于碎片整理:我有一种奇怪的感觉,使用 hdiutil 将稀疏文件转换为具有相同格式的新稀疏文件同样快(甚至更快!)。我认为它试图变得聪明。但我不知道。

(请注意,对稀疏束进行碎片整理只会对磁盘数据进行碎片整理,而不会对稀疏束带进行碎片整理,除非它是稀疏束感知的碎片整理程序。hdiutil convert我相信带会进行“碎片整理”。)

答案2

我认为 90.4 GB 的可能性显然是错误的。当我运行:

hdiutil compact *.sparsebundle

...它释放了 16 GB 的空间,这大致符合我的预期。有趣的是,它说大约“可能 800 GB”,这远远超过了我的硬盘容量。所以我认为第二个数字只是一些(有缺陷的)理论数字。

答案3

@Oscar 为我们指明了正确的方向。但您不需要转换为 1 MB 并进行压缩,以期重新获得空间。

相反,只需将您的稀疏包复制到另一个新的稀疏包即可。这反过来会为您整理图像。同时,您可以更改文件系统、大小甚至频段。

这是我最近做的一个例子,转换我在设备间同步的 20GB“代码”图像。

$ hdiutil create -size 20g -type SPARSEBUNDLE \
-imagekey sparse-band-size=2048 -fs HFSX \
-volname code -attach ~/sync/images/code.sparsebundle

查看所有带有 的选项hdiutil create -help

此命令输出:

/dev/disk3              GUID_partition_scheme
/dev/disk3s1            EFI
/dev/disk3s2            Apple_HFS                       /Volumes/code
created: /Users/eric/sync/images/code.sparsebundle

-attach您可以在下面看到已安装的选项/Volumes/code

注意:我使用HSFX区分大小写的 HFS+,因为我还将图像同步到 Linux 并装载它们。您很可能希望改用HFS+,因为 macOS 通常不区分大小写。

现在我要做的就是将所有内容复制到我的新 sparsebundle 中:

$ cp -r /Volumes/IMG_CODE/ /Volumes/code/

现在比较一下:

# old sparsebundle
$ du -h ~/sync/images/IMG_CODE.sparsebundle/
15.0G   /Users/eric/sync/images/IMG_CODE.sparsebundle/bands
15.0G   /Users/eric/sync/images/IMG_CODE.sparsebundle/

# new sparsebundle
$ du -h ~/sync/images/code.sparsebundle/
3.0G    /Users/eric/sync/images/code.sparsebundle/bands
3.0G    /Users/eric/sync/images/code.sparsebundle/

耶。我的 15GB 稀疏包现在只有 3GB,碎片整理完毕,频段也改变了!

答案4

我不知道有没有免费的办法,但我相信 Prosoft Drive Genius 可以满足您的需要:

http://www.prosofteng.com/products/drive_genius.php

你安装稀疏包,使用 Drive Genius 对其进行碎片整理,然后

hdiutil compact

命令应该可以工作。

相关内容