Un archivo es (aproximadamente) tres cosas separadas:
- Un "inodo", una estructura de metadatos que realiza un seguimiento de quién es el propietario del archivo, los permisos y una lista de bloques en el disco que realmente contienen los datos.
- Una o más entradas de directorio (los nombres de archivo) que apuntan a ese inodo
- Los propios bloques de datos reales
Cuando crea un archivo vacío, crea solo el inodo y una entrada de directorio que apunta a ese inodo. Lo mismo para archivos dispersos (dd if=/dev/null of=sparse_file bs=10M seek=1
).
Cuando crea enlaces fijos a un archivo existente, simplemente crea entradas de directorio adicionales que apuntan al mismo inodo.
He simplificado las cosas aquí, pero entiendes la idea.
touch
creará un inodo y ls -i
o stat
mostrará información sobre el inodo:
$ touch test
$ ls -i test
28971114 test
$ stat test
File: ‘test’
Size: 0 Blocks: 0 IO Block: 4096 regular empty file
Device: fc01h/64513d Inode: 28971114 Links: 1
Access: (0664/-rw-rw-r--) Uid: ( 1000/1000) Gid: ( 1000/1000)
Access: 2017-03-28 17:38:07.221131925 +0200
Modify: 2017-03-28 17:38:07.221131925 +0200
Change: 2017-03-28 17:38:07.221131925 +0200
Birth: -
Observe que test
utiliza 0 bloques. Para almacenar los datos mostrados, el inodo usa algunos bytes. Esos bytes se almacenan en la tabla de inodos. Mire la página ext2 para ver un ejemplo de una estructura de inodo.
ls
(o bien, el stat(2)
llamada del sistema) le dice el tamaño de los contenidos del archivo La cantidad de espacio que necesita el sistema de archivos para la contabilidad no es parte de eso, y como un detalle de implementación, no es algo que los programas en general deberían cuidar o incluso saber acerca de. Hacer visibles los detalles de implementación haría que la abstracción del sistema de archivos fuera menos útil.