Digamos que Johnny hace un archivo VACÍO. Se llama foobar.py
. Cuando Johnny permite que se ejecute, corre chmod 755 foobar.py
. El archivo ahora tiene los metadatos de
-rw-r--r-- 1 johnny staff 0 Dec 27 22:53 foobar.py
¿Dónde se almacenan todos esos metadatos en ese archivo? El tamaño del archivo es 0, entonces, ¿cómo mantiene los metadatos cuando se transfiere a otra unidad?
Respuestas:
No está almacenado en ese archivo. Se almacena en el sistema de archivos, y todos los parámetros se copian manualmente uno por uno (aunque algunos no se pueden copiar).
Es decir, la mayoría de los sistemas operativos no tienen realmente una llamada "copiar archivo con metadatos". El programa de copia de archivos simplemente crea un nuevo archivo llamado
foobar.py
, copia los 0 bytes de datos completos, luego usa utime () o SetFileTime () para que su tiempo de modificación se vea igual que el original. Del mismo modo, los permisos de archivo se "copiarían" configurándolos de nuevo usando chmod () o copiando el atributo POSIX ACL.Algunos metadatos no se copian. Establecer la propiedad requiere privilegios de root, por lo que las copias de los archivos de otra persona le pertenecen y ocupan su cuota de disco. El ctime (tiempo de cambio de atributo) es imposible de configurar manualmente en Unixes; btime (tiempo de nacimiento / creación) tampoco suele copiarse.
Compare
cp -a foo bar
(que copia metadatos) ycp foo bar
(que no):fuente
Generalmente difiere de un sistema de archivos a otro donde se almacenan los metadatos. En la familia de sistemas de archivos ext2, los metadatos que mencionó (propietario, grupo, permisos, tiempo) se almacenan en el inodo . El inodo también almacena (apunta a) los bloques que el archivo ocupa en el disco. El inodo no almacena el nombre del archivo.
Puede acceder a estos datos con la
stat
llamada al sistema (man 2 stat
) y usar lastat
herramienta para imprimirlos (man stat
). Se puede encontrar una descripción detallada de los campos de inodolinux/include/linux/fs.h
en la fuente del núcleo.Hay otros tipos de metadatos (por ejemplo, permisos de ACL ) que se almacenan en diferentes lugares.
Los metadatos no se copian de manera predeterminada cuando copia el archivo. En su lugar, se crea un nuevo archivo con valores de metadatos predeterminados. Hay varias opciones para
cp
(-p
,--preserve
) que indicancp
también copiar metadatos, leyendo los metadatos antiguos constat
y modificando los nuevos metadatos en consecuencia.fuente
Dependiendo del sistema de archivos, las áreas se reservan (semi-) estáticamente o dinámicamente para contener metadatos como permisos, tamaño y otros (a veces también el nombre del archivo).
En Unix, los metadatos se almacenan en el inodo que controla el área de datos donde reside el archivo ( mientras que los nombres de archivo y los números de inodo relacionados se almacenan en una entrada de directorio ).
En algunos sistemas de archivos, las entradas de directorio son archivos como cualquier otro, pero ocultos a la vista. FAT y FAT32 son tales sistemas de archivos (aunque el directorio raíz de FAT es "especial"). Cuando crea un archivo, agrega / edita una entrada en el archivo que describe la carpeta donde reside el archivo. Cada entrada es lo suficientemente grande como para almacenar el tamaño del archivo, el nombre y la fecha, y nada más (los nombres largos ocupan varias entradas; el tamaño de entrada predeterminado de 32 bytes puede contener un solo nombre en el antiguo formato de 8 + 3 caracteres. Todo esto, por supuesto , suponiendo que mi memoria esté funcionando). El sistema externo es similar, pero la entrada del directorio tiene un tamaño dinámico y contiene solo el nombre y el puntero de inodo; toda otra información está en el inodo. De esta manera, dos entradas pueden apuntar al mismo archivo, lo cual es útil para administrar archivos duplicados.
En algunos sistemas de archivos, los inodos pueden ser lo suficientemente grandes como para contener una pequeña cantidad de datos además de los metadatos, de modo que si el archivo puede caber allí, no ocupa espacio en disco adicional. Crea un archivo de 45 bytes y el espacio libre en disco no cambia en absoluto; esos bytes se almacenan dentro del inodo. Creo que la familia ext * es compatible con esto (y NTFS también). Esto ayuda a administrar una gran cantidad de archivos muy pequeños.
En otros sistemas de archivos, existe lo que equivale a un sistema de archivos "fantasma" junto con el principal, que almacena estos atributos adicionales. No solo la información del archivo, sino también posiblemente los íconos del archivo .
Algunos sistemas tienen ambos: NTFS tiene los metadatos del directorio completo funcionando de manera similar a un inodo, y la posibilidad de crear flujos de datos alternativos que contienen información adicional que (aparentemente) no cambia nada en el archivo "principal".
fuente