OSX Lion 中有一个我无法解释的行为(也可能在其他版本上)。
当我复制某些包含动态库的应用程序(例如 iTunes)时,这些库的物理大小会发生变化(大小会增加)。这可能是由于磁盘碎片造成的。但不仅如此,因为令人惊讶的是原始物理大小小于逻辑大小(通常物理大小总是大于逻辑大小,除非涉及压缩)。
为了说明我的情况:
antoine@amarante:/Applications$ ls -ls iTunes.app/Contents/MacOS/libgnsdk_submit.1.8.2.dylib
384 -rwxrwxr-x+ 1 root admin 558704 8 jul 2011 iTunes.app/Contents/MacOS/libgnsdk_submit.1.8.2.dylib
Run Code Online (Sandbox Code Playgroud)
ls考虑 512 字节的块大小,与报告的 558704 字节逻辑大小相比,384 个块构成 196608 字节。或者,如Finder 中的获取信息窗口所示:
558.704 octets (197 Ko sur disque)
Run Code Online (Sandbox Code Playgroud)
在我复制整个 iTunes 应用程序的一些复制操作后也会显示这一点。第一个iTunes copie是通过 Finder 完成的复制,iTunes-cp也是使用 CLI 命令完成的复制cp -a。
antoine@amarante:/Applications$ ls -ls iTunes*.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib
11632 -rwxr-xr-x+ 1 antoine admin 5955104 8 jul 2011 iTunes copie.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib
11632 -rwxrwxr-x+ 1 antoine admin 5955104 8 jul 2011 iTunes-cp.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib
3944 -rwxrwxr-x+ 2 root admin 5955104 8 jul 2011 iTunes.app/Contents/MacOS/libgnsdk_dsp.1.8.2.dylib
Run Code Online (Sandbox Code Playgroud)
我们看到复制的文件的物理大小(11632*512 = 5955584 字节)大于逻辑大小(5955104),但原始文件小得多。.dylib当我单独复制单个文件时,行为是相同的。少数动态库文件会发生这种情况,但并非所有动态库文件都会发生这种情况。
原始库文件怎么会比副本小呢?是否涉及一些压缩?或者我的原始文件是否以某种方式损坏了?我该如何检查?
事实上,Mac 10.6 及更高版本的 HFS+ 中存在压缩功能。它是透明的,甚至很难用标准操作系统工具检测到。
而且,这并不总是能完成。为了向后兼容,默认情况下不压缩,但它们在安装操作系统时会对其进行压缩。
工具列表,以防链接损坏:
hfsdebugafsctoolstat -f %f- 报告文件上的“用户标志” - 标志之一表示压缩。我在压缩文件上得到“32”,在未压缩文件上得到“0”。可能 32 映射到一个位字段。ditto - 支持写入压缩文件