¿Por qué el tamaño físico de un archivo .dylib es más pequeño que su tamaño lógico?

3

Hay un comportamiento que no puedo explicar en OSX Lion (podría estar en otras versiones también).

Cuando copio o duplico algunas aplicaciones, por ejemplo iTunes, que contienen algunas bibliotecas dinámicas, el tamaño físico de esas bibliotecas cambia (el tamaño aumenta). Esto puede ser debido a la fragmentación del disco. Pero no es solo eso, porque lo sorprendente es que el tamaño físico original es más pequeño que el tamaño lógico (donde generalmente el tamaño físico es siempre más grande que el lógico, excepto cuando se trata de una compresión).

Para ilustrar mi caso:

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

ls considera un tamaño de bloque de 512 bytes, 384 bloques hacen 196608 bytes en comparación con el tamaño lógico informado de 558704 bytes. O, como se muestra en una obtener información ventana desde el buscador:

558.704 octets (197 Ko sur disque)

Esto también se muestra después de algunas operaciones de copia donde copié en toda la aplicación de iTunes. El primero iTunes copie Es un duplicado hecho a través del Finder y iTunes-cp Es una copia hecha con el CLI. cp -a mando.

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

Vemos que los archivos copiados tienen un tamaño físico mayor (11632 * 512 = 5955584 bytes) que el tamaño lógico (5955104), excepto el archivo original, que es mucho más pequeño. Cuando copio el single .dylib archivo en sí mismo, el comportamiento es el mismo. Esto sucede para unos pocos archivos de biblioteca dinámicos, no para todos.

¿Cómo puede el archivo de biblioteca original ser más pequeño que las copias? ¿Hay alguna compresión involucrada? ¿O están mis archivos originales dañados de alguna manera? ¿Cómo puedo comprobar eso?

Tonin
fuente
1
Ahora que sabemos que la discrepancia de tamaño se debe a la compresión del sistema de archivos, supongo que no hay nada específico sobre los archivos .dylib al respecto, aparte de que son ejemplos comunes de archivos comprimidos en el sistema.
Arne Stenström

Respuestas:

4

De hecho, hay compresión en HFS + en el mac en 10.6 y posteriores. Es transparente y puede ser difícil de detectar incluso con herramientas estándar del sistema operativo.

Y, no siempre se hace. Para la compatibilidad con versiones anteriores, el valor predeterminado es no comprimir, pero comprimen el sistema operativo cuando está instalado.

Lista de herramientas, en caso de rotura de enlace:

  • hfsdebug
  • afsctool
  • stat -f %f - informa "banderas de usuario" en archivos - una de las banderas significa compresión. Obtengo "32" en un archivo comprimido y "0" en un archivo sin comprimir. Probablemente los 32 mapas a un campo de bits.
  • ditto - Tiene soporte para escribir archivos comprimidos.
Dan Pritts
fuente
2
Impresionante. Gracias por tu respuesta, ¡realmente aprendí algo hoy! Utilizando la ditto El comando copiará y preservará la compresión, resultando en el mismo tamaño.
Tonin
2
Esta discusión causó que dos piedras se juntaran en mi cabeza. Smallish SSD se ha estado llenando últimamente ... Encontré esto: github.com/jrk/afsctool que informará sobre la compresión de hfs, y también comprimirá los archivos en su lugar. sudo afsctool -ckv / Applications y tengo 4 conciertos atrás.
Dan Pritts