背景故事:
我使用的是 Mac (10.6.4),直到今天,当我使用 Vuze 下载 torrent 时,无论我尝试何种配置,Vuze 都会在开始下载该文件之前为整个文件分配空间。很长一段时间以来,快速谷歌搜索让我相信这是一个 Vuze 错误,但多年过去了,什么都没有改变,更详细的搜索告诉我,这是因为 HFS+ 不支持稀疏文件。
问题:
稀疏文件维基百科说Apple的HFS +不支持稀疏文件,并且Apple的Time Machine和FileVault使用“稀疏图像”和“稀疏束”。
我理解稀疏包是什么(图像被分割成 8Meg 块),但除此之外,这些“稀疏图像”和普通稀疏文件之间有什么区别吗?HFS+ 为何不支持稀疏文件,却仍然支持稀疏图像和稀疏包?
答案1
这是因为稀疏图像和稀疏文件在不同的抽象级别处理稀疏性。如果您将文件“直接”存储在磁盘上,则文件系统(例如 HFS+)会处理将组成文件的字节序列映射到磁盘上的字节序列。稀疏文件是指其字节序列中有间隙的文件,支持此文件的文件系统在将文件映射到磁盘时会跳过这些缺失的字节。
当您使用磁盘映像时,映射会复杂得多:文件中的字节(由内部文件系统)映射到(虚拟)磁盘中的字节。然后,这些字节(由映像装载程序)映射到磁盘映像(文件)中的字节,然后(由外部文件系统)映射到实际磁盘上的字节。映像装载程序处理稀疏映射(并且 AIUI 仅在文件之间/之外,而不是在文件内),但这并不意味着其他层(文件系统)可以处理。就外部文件系统而言,映像文件只是一个(非稀疏)字节序列。
顺便说一句,映像装载程序还可以添加文件系统本身无法处理的其他功能。例如,Mac 磁盘映像几乎一直支持压缩,但直到 OS X v10.6 才在 HFS+ 中添加对压缩的原生支持。
答案2
Gordon Davisson 的解释很有启发:这就是我如何使用 sparsebundle 图像作为种子下载目录。
首先创建图像(我将其设置为 50GB,但任何大小都可以)
hdiutil create -size 50g -type SPARSEBUNDLE -nospotlight -volname "Torrents repository" -fs "Case-sensitive Journaled HFS+" Torrents.sparsebundle
然后双击刚刚创建的 Torrents.sparsebundle 映像来挂载它。
设置您最喜欢的 torrent 客户端以使用名为“Torrents 存储库”的挂载卷作为临时存储库,我建议进行设置以便将已完成的文件移出图像(例如移到下载文件夹)。
它运行得非常好,特别是当你在一个大 torrent 中只选择几个文件时。
我还在系统中添加了启动脚本:
hdiutil compact Torrents.sparsebundle
hdiutil attach Torrents.sparsebundle
第一个命令将回收未使用的磁盘空间,而第二个命令将自动挂载映像。不幸的是,在挂载映像时无法执行压缩操作,所以我认为最好的机会是在挂载映像之前在系统启动时执行。
答案3
APFS 是新的默认 FS,现在支持稀疏文件。