update software sierra mojave mac high for extfs capitan c osx filesystems

software - ¿Cómo creo un archivo disperso programáticamente, en C, en Mac OS X?



macfuse el capitan (7)

Parece haber cierta confusión sobre si el sistema de archivos Mac OS X predeterminado (HFS +) admite agujeros en los archivos. El siguiente programa demuestra que este no es el caso.

#include <stdio.h> #include <string.h> #include <fcntl.h> #include <unistd.h> void create_file_with_hole(void) { int fd = open("file.hole", O_WRONLY|O_TRUNC|O_CREAT, 0600); write(fd, "Hello", 5); lseek(fd, 99988, SEEK_CUR); // Make a hole write(fd, "Goodbye", 7); close(fd); } void create_file_without_hole(void) { int fd = open("file.nohole", O_WRONLY|O_TRUNC|O_CREAT, 0600); write(fd, "Hello", 5); char buf[99988]; memset(buf, ''a'', 99988); write(fd, buf, 99988); // Write lots of bytes write(fd, "Goodbye", 7); close(fd); } int main() { create_file_with_hole(); create_file_without_hole(); return 0; }

El programa crea dos archivos, cada 100.000 bytes de longitud, uno de los cuales tiene un orificio de 99.988 bytes.

En Mac OS X 10.5 en una partición HFS +, ambos archivos ocupan el mismo número de bloques de disco (200):

$ ls -ls total 400 200 -rw------- 1 user staff 100000 Oct 10 13:48 file.hole 200 -rw------- 1 user staff 100000 Oct 10 13:48 file.nohole

Mientras que en CentOS 5, el archivo sin agujeros consume 88 bloques de disco más que el otro:

$ ls -ls total 136 24 -rw------- 1 user nobody 100000 Oct 10 13:46 file.hole 112 -rw------- 1 user nobody 100000 Oct 10 13:46 file.nohole

Me gustaría crear un archivo disperso de modo que los bloques de cero no ocupen espacio en disco hasta que les escriba datos. ¿Es posible?


Como en otros Unixes, es una característica del sistema de archivos. O el sistema de archivos lo admite para TODOS los archivos o no. A diferencia de Win32, no tienes que hacer nada especial para que esto ocurra. Además, a diferencia de Win32, no hay una penalización de rendimiento por usar un archivo disperso.

En MacOS, el sistema de archivos predeterminado es HFS + que no admite archivos dispersos.

Actualización: MacOS solía soportar volúmenes UFS con soporte de archivos dispersos, pero eso se ha eliminado. Ninguno de los sistemas de archivos admitidos actualmente tiene soporte para archivos dispersos.


Si desea la portabilidad, el último recurso es escribir su propia función de acceso para que pueda administrar un índice y un conjunto de bloques.

En esencia, usted maneja un único archivo ya que el SO maneja el disco manteniendo la cadena de los bloques que forman parte del archivo, el mapa de bits de los bloques asignados / libres, etc.

Por supuesto, esto dará lugar a un acceso no optimizado y más lento, recomendaría esta aplicación solo si el requisito de ahorrar espacio es absolutamente crítico y usted tiene suficiente tiempo para escribir un conjunto sólido de funciones de acceso.

E incluso en ese caso, primero investigaría si su problema necesita una solución diferente. Probablemente debería almacenar sus datos de manera diferente?


hdiutil puede manejar imágenes y archivos dispersos, pero desafortunadamente el marco al que se vincula es privado.

Podría tratar de definir los símbolos externos definidos por el marco de DiskImages a continuación, pero es muy probable que esto no sea aceptable para el código de producción, y dado que el marco es privado, tendría que aplicar ingeniería inversa a sus casos de uso.

cristi: ~ diciu $ otool -L / usr / bin / hdiutil

/ usr / bin / hdiutil: /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages (compatibilidad versión 1.0.8, versión actual 194.0.0) [..]

cristi: ~ diciu $ nm /System/Library/PrivateFrameworks/DiskImages.framework/Versions/A/DiskImages | awk -F '''' ''{print $ 3}'' | c ++ filt | grep -i sparse

[..]

CSparseFile :: sector2Band (long long)

CSparseFile :: addIndexNode ()

CSparseFile :: readIndexNode (long long, SparseFileIndexNode *)

CSparseFile :: readHeaderNode (CBackingStore *, SparseFileHeaderNode *, unsigned long)

[... cortado por brevedad]

Más tarde Editar

Puede usar hdiutil como un proceso externo y hacer que cree una imagen de disco dispersa para usted. A partir del proceso C, crearía un archivo en la imagen de disco disperso (montado).


Si busca (fseek, ftruncate, ...) más allá del final, el tamaño del archivo aumentará sin asignar bloques hasta que escriba en los agujeros. Pero no hay forma de crear un archivo mágico que convierta automáticamente bloques de ceros en agujeros. Tienes que hacerlo tú mismo.

Esto puede ser útil para observar (el comando cp de OpenBSD inserta agujeros en lugar de escribir ceros). parche



Parece que OS X admite archivos dispersos en volúmenes UDF. Probé el programa de pruebas de titaniumdecoy en OS X 10.9 y generó un archivo disperso en una imagen de disco UDF. Además, no es que UFS ya no sea compatible con OS X, por lo que si necesita archivos dispersos, UDF es el único sistema de archivos compatible nativo que los admite.

También probé el programa en acciones SMB. Cuando el servidor es Ubuntu (sistema de archivos ext4) el programa crea un archivo disperso, pero ''ls -ls'' a través de SMB no lo muestra. Si hace ''ls -ls'' en el host de Ubuntu, sí muestra que el archivo es escaso. Cuando el servidor es Windows XP (sistema de archivos NTFS), el programa no genera un archivo disperso.