![如何从 OS X 上的稀疏包中回收所有/大部分可用空间](https://linux22.com/image/483469/%E5%A6%82%E4%BD%95%E4%BB%8E%20OS%20X%20%E4%B8%8A%E7%9A%84%E7%A8%80%E7%96%8F%E5%8C%85%E4%B8%AD%E5%9B%9E%E6%94%B6%E6%89%80%E6%9C%89%2F%E5%A4%A7%E9%83%A8%E5%88%86%E5%8F%AF%E7%94%A8%E7%A9%BA%E9%97%B4.png)
是否有可能对稀疏捆绑图像进行“碎片整理”并回收(大部分)可用空间?
背景如下:我正在使用稀疏束,并且时不时地想从它们中回收空间,因此我运行:
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
命令应该可以工作。