Eine Datei besteht (grob) aus drei verschiedenen Dingen:
- Ein "Inode", eine Metadatenstruktur, die festhält, wem die Datei gehört, Berechtigungen und eine Liste von Blöcken auf der Festplatte, die tatsächlich die Daten enthalten.
- Ein oder mehrere Verzeichniseinträge (die Dateinamen), die auf diesen Inode zeigen
- Die eigentlichen Datenblöcke selbst
Wenn Sie eine leere Datei erstellen, erstellen Sie nur den Inode und einen Verzeichniseintrag, der auf diesen Inode zeigt. Gleiches gilt für Sparse-Dateien (dd if=/dev/null of=sparse_file bs=10M seek=1
).
Wenn Sie Hardlinks zu einer bestehenden Datei erstellen, erstellen Sie einfach zusätzliche Verzeichniseinträge, die auf denselben Inode zeigen.
Ich habe die Dinge hier vereinfacht, aber Sie verstehen schon.
touch
erstellt einen Inode , und ls -i
oder stat
zeigt Informationen über den 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: -
Beachten Sie, dass test
verwendet 0 Blöcke. Um die angezeigten Daten zu speichern, verwendet der Inode einige Bytes. Diese Bytes werden in der Inode-Tabelle gespeichert. Sehen Sie sich die ext2-Seite für ein Beispiel einer Inode-Struktur an.
ls
(oder besser gesagt, die stat(2)
Systemaufruf) gibt Ihnen die Größe des Inhalts an der Datei. Wie viel Speicherplatz das Dateisystem für die Buchhaltung benötigt, gehört nicht dazu, und als Implementierungsdetail ist es etwas, das Programme im Allgemeinen nicht sollten kümmern oder sogar wissen. Das Sichtbarmachen der Implementierungsdetails würde die Abstraktion des Dateisystems weniger nützlich machen.