Un fichier est (en gros) trois choses distinctes :
- Un "inode", une structure de métadonnées qui garde une trace du propriétaire du fichier, des autorisations et une liste des blocs sur le disque qui contiennent réellement les données.
- Une ou plusieurs entrées de répertoire (les noms de fichiers) qui pointent vers cet inode
- Les blocs de données eux-mêmes
Lorsque vous créez un fichier vide, vous créez uniquement l'inode et une entrée de répertoire pointant vers cet inode. Idem pour les fichiers clairsemés (dd if=/dev/null of=sparse_file bs=10M seek=1
).
Lorsque vous créez des liens physiques vers un fichier existant, vous créez simplement des entrées de répertoire supplémentaires qui pointent vers le même inode.
J'ai simplifié les choses ici, mais vous voyez l'idée.
touch
va créer un inode , et ls -i
ou stat
affichera des informations sur l'inode :
$ 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: -
Notez que test
utilise 0 blocs. Pour stocker les données affichées, l'inode utilise quelques octets. Ces octets sont stockés dans la table d'inodes. Regardez la page ext2 pour un exemple de structure inode.
ls
(ou bien, le stat(2)
appel système) vous indique la taille du contenu du dossier. La quantité d'espace dont le système de fichiers a besoin pour la comptabilité n'en fait pas partie, et en tant que détail d'implémentation, ce n'est pas quelque chose que les programmes en général devraient soins ou même connaître. Rendre les détails d'implémentation visibles rendrait l'abstraction du système de fichiers moins utile.