¿A dónde van los metadatos cuando guardas un archivo?

28

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?

juniorrubista
fuente
1
No soy un experto, pero supongo que la respuesta general es que cuando tienes un disco duro y haces 1+ particiones, formateas la partición con un sistema de archivos, por ejemplo, Windows tiende a usar ntfs y Linux puede usar ex2, entonces el La mayor parte de esa partición es para el contenido del archivo, pero una pequeña cantidad está reservada para otras cosas, incluidos los metadatos.
barlop
@barlop es esencialmente correcto. Ambos sistemas usan algo de espacio para grabar donde se almacenan los archivos; en NTFS, la "tabla maestra de archivos" almacena los metadatos, en ext2 + está en "inodes".
pjc50
@ pjc50 gracias. y aparte de los metadatos, ¿cuál es el nombre de la cosa que está fuera de las particiones? Supongo que depende de si la cosa es MBR o GPT ... En MBR la cosa se llama MBR ... ¿Cómo se llama en GPT? (Entiendo que GPT tiene un MBR heredado, pero ¿también tiene su propia cosa, fuera de todas las particiones?)
barlop
Relacionado: (básicamente lo mismo, pero la pregunta es específicamente sobre Windows) ¿Cómo se almacenan los metadatos del archivo en Windows?
gronostaj
2
"chmod 755 ... El archivo ahora tiene los metadatos de ... -rw-r - r-- ..." te refieres a -rwxr-xr-x.
JoL

Respuestas:

42

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) y cp foo bar(que no):

$ strace -v cp foo bar
...
abierto ("foo", O_RDONLY) = 3
abierto ("barra", O_WRONLY | O_TRUNC) = 4
leer (3, "prueba \ n", 131072) = 5
escribir (4, "prueba \ n", 5) = 5
leer (3, "", 131072) = 0
cerrar (4) = 0
cerrar (3) = 0
...
$ strace -v cp -a foo bar
...
 - se recuperan los metadatos originales
lstat ("foo", {st_dev = makedev (254, 0), st_ino = 60569468, st_mode = S_IFREG | 0644,
             st_nlink = 1, st_uid = 1000, st_gid = 1000, st_blksize = 4096, st_blocks = 8,
             st_size = 5, st_atime = 2016-12-28T09: 16: 59 + 0200.879714332,
             st_mtime = 2016-12-28T09: 16: 55 + 0200.816363098,
             st_ctime = 2016-12-28T09: 16: 55 + 0200.816363098}) = 0
 - los datos se copian
abierto ("foo", O_RDONLY | O_NOFOLLOW) = 3
abierto ("barra", O_WRONLY | O_TRUNC) = 4
leer (3, "prueba \ n", 131072) = 5
escribir (4, "prueba \ n", 5) = 5
leer (3, "", 131072) = 0
 - se copia el tiempo de modificación
utimensat (4, NULL, [{tv_sec = 1482909419, tv_nsec = 879714332},
                    {tv_sec = 1482909415, tv_nsec = 816363098}], 0) = 0
 - la propiedad se copia (solo con 'sudo [strace] cp')
fchown (4, 1000, 1000) = 0
 - los atributos extendidos se copian (xdg.origin.url se configura mediante navegadores, wget)
flistxattr (3, NULL, 0) = 0
flistxattr (3, "user.xdg.origin.url \ 0", 20) = 20
fgetxattr (3, "user.xdg.origin.url", "https://superuser.com/", 22) = 22
fsetxattr (4, "user.xdg.origin.url", "https://superuser.com/", 22, 0) = 0
 - Las ACL POSIX no están presentes, por lo que se construye una ACL básica a partir de st_mode
 - (en este caso, un simple fchmod () también funcionaría)
fgetxattr (3, "system.posix_acl_access", 0x7ffc87a50be0, 132) = -1 ENODATA (sin datos disponibles)
fsetxattr (4, "system.posix_acl_access", "\ 2 \ 0 \ 0 \ 0 \ 1 \ 0 \ 6 \ 0 \ 377 \ 377 \ 377 \ 377 \ 4 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 \ 0 \ 4 \ 0 \ 377 \ 377 \ 377 \ 377 ", 28, 0) = 0
cerrar (4) = 0
cerrar (3) = 0
...
Gravedad
fuente
3
Para complementar esta respuesta, debe mencionar: - al copiar en otra unidad: los metadatos se leen desde el origen y se reproducen en el destino si la configuración (u opciones) apropiadas (por ejemplo: mantener la fecha, mantener los derechos o incluso mantener " todo ") fueron utilizados (como usted mencionó). 2) Una alternativa es hacer primero un archivo (.zip, .tar, etc.) de los archivos, y extraer de este archivo en el destino, una vez más dando al programa un lugar (en el formato de archivo) para encontrar los metadatos, y las opciones / configuraciones específicas le permiten a uno mantener (o no) esos metadatos.
Olivier Dulac
Para el segundo párrafo: ¿Qué pasa con stat (2)?
gato
Gracias por darme una respuesta detallada a esta pregunta sobre la que he reflexionado.
juniorRubyist
11

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 statllamada al sistema ( man 2 stat) y usar la statherramienta para imprimirlos ( man stat). Se puede encontrar una descripción detallada de los campos de inodo linux/include/linux/fs.hen 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 indican cptambién copiar metadatos, leyendo los metadatos antiguos con staty modificando los nuevos metadatos en consecuencia.

dirkt
fuente
4

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".

LSerni
fuente
2
Los nombres de archivo no se almacenan con el archivo, son parte del inodo del directorio. Es por eso que los enlaces duros funcionan
Sobrique
esta respuesta entra en conflicto con los dirkt sobre dónde se almacenan los nombres de archivo, me pregunto cuál es el correcto
cat
Lo siento, confundí las cosas, y @dirkt tiene el derecho de hacerlo . Respuesta fija
LSerni
Son parte del directorio , pero generalmente no son parte del inodo del directorio. Es específico de FS, pero si piensa en un directorio como un archivo especial, entonces su contenido sería la lista de archivos (nombres y sus inodos).
Grawity