Warum unterscheidet sich die Größenberichterstattung für Verzeichnisse von anderen Dateien?

8

Ich habe mich gefragt, warum ein leeres Verzeichnis 4096 Byte Speicherplatz belegt, und ich habe diese Frage gesehen. Es wird angegeben, dass Speicherplatz in Blöcken zugewiesen wird und daher die Größe eines neuen Verzeichnisses 4096 Bytes beträgt.

Ich bin mir jedoch ziemlich sicher, dass die Zuordnung für "normale" Dateien auch in Blöcken erfolgt. Zumindest ist es in Windows-Dateisystemen so und ich vermute, dass es in ext * zumindest ähnlich sein muss.

Soweit ich verstanden habe, erfolgt die Größenauflistung für andere Dateitypen wie Dateien, symbolische Links usw. in Bezug auf die tatsächliche Größe. Denn wenn ich eine leere Datei erstelle, sehe ich eine 0 als Größe. Wenn Sie ein paar Zeichen eingeben, sehe ich die <Anzahl der Zeichen> Bytes als Größe usw.

Meine Frage ist also, obwohl die Zuordnung für andere Dateien auch in Blöcken erfolgt, warum die Richtlinie zum Melden der Größe eines Verzeichnisses und einer Datei unterschiedlich ist.

Klärung

Ich dachte, die Frage sei klar genug, aber anscheinend nicht. Ich werde versuchen, die Frage hier zu klären.

1) Was ich denke, ist ein Verzeichnis:

Ich werde versuchen, anhand des folgenden Beispiels zu erklären, was meiner Meinung nach ein Verzeichnis ist. Wenn es nach dem Lesen falsch ist, benachrichtigen Sie mich bitte.

Nehmen wir an, wir haben ein Verzeichnis mit dem Namen mydir. Und lassen Sie uns sagen , dass es drei Dateien enthält, die da sind: f0, f1und f2. Nehmen wir an, dass jede Datei 1 Byte lang ist.

Was ist nun mydir? Es ist ein Zeiger auf einen Inode, der Folgendes enthält: String "f0" und die Inode-Nummer, auf die verwiesen wird f0. String "f1" und die Inode-Nummer, auf die f1zeigt. Und String "f2" und die Inode-Nummer, auf die f2zeigt. (Zumindest denke ich, dass dies ein Verzeichnis ist. Bitte korrigieren Sie mich, wenn ich falsch liege.)

Nun gibt es zwei Methoden zum Berechnen der Größe eines Verzeichnisses:

1) Berechnung der Größe der Inode, auf die mydirzeigt.

2) Summieren der Größen der Inodes, auf die der Inhalt von mydirzeigt.

Obwohl 1 kontraintuitiver ist, nehmen wir an, dass es sich um die verwendete Methode handelt. (Für diese Frage spielt es keine Rolle, welche Methode tatsächlich verwendet wird.) Dann wird die Größe von wie mydirfolgt berechnet:

2 + 2 + 2 + 3 * <space_required_to_store_an_inode_number>

2 sind, weil jeder Dateiname 2 Bytes lang ist.

2) Die Frage:

Nun die Frage: Unter der Annahme, dass ein Verzeichnis meiner Meinung nach korrekt ist, sollte die gemeldete Größe für mydirviel weniger als 4096 betragen, unabhängig davon, ob Methode 1 oder Methode 2 zur Berechnung seiner Größe verwendet wird.

Nun werden Sie sagen, dass der Grund, warum 4096 Bytes gemeldet werden, darin besteht, dass die Zuordnung in Blöcken erfolgt. Daher ist die gemeldete Größe so groß.

Aber dann werde ich sagen: Die Zuordnung erfolgt auch in Blöcken für reguläre Dateien. (Siehe Thrigs Antwort als Referenz) Trotzdem werden ihre Größen in realen Größen angegeben. (1 Byte, wenn sie 1 Zeichen enthalten, 2 Byte, wenn sie 2 Zeichen enthalten usw.)

Meine Frage ist also, warum sich die Richtlinien für die Berichtsgröße von Verzeichnissen so stark von der Berichtsgröße für reguläre Dateien unterscheiden.

Weitere Klarstellung:

Wir wissen, dass die anfängliche Anzahl von Blöcken, die für eine nicht leere Datei und für ein leeres Verzeichnis zugewiesen wurden, beide 8 Blöcke beträgt. (Siehe Antwort von Thrig. ) Obwohl die Zuordnung sowohl für reguläre Dateien als auch für Verzeichnisse in der gleichen Anzahl von Blöcken erfolgt, warum ist die gemeldete Größe für ein Verzeichnis viel größer?

Utku
quelle

Antworten:

11

Ich denke, der Grund, warum Sie verwirrt sind, ist, dass Sie nicht wissen, was ein Verzeichnis ist . Machen Sie dazu einen Schritt zurück und untersuchen Sie, wie Unix-Dateisysteme funktionieren.

Das Unix-Dateisystem verfügt über mehrere separate Begriffe zum Adressieren von Daten auf der Festplatte:

  • Datenblöcke sind eine Gruppe von Blöcken auf einer Festplatte, die den Inhalt einer Datei enthalten.
  • Inodes sind spezielle Blöcke in einem Dateisystem mit einer in diesem Dateisystem eindeutigen numerischen Adresse, die Metadaten zu einer Datei enthält, z.
    • Berechtigungen
    • Zugriffs- / Änderungszeiten
    • Größe
    • Zeiger auf die Datenblöcke (kann eine Liste von Blöcken, Extents usw. sein)
  • Dateinamen sind hierarchische Speicherorte in einem Dateisystemstamm, die Inodes zugeordnet sind.

Mit anderen Worten, eine "Datei" besteht tatsächlich aus drei verschiedenen Dingen:

  1. ein PFAD im Dateisystem
  2. eine Inode mit Metadaten
  3. Datenblöcke, auf die der Inode zeigt

In den meisten Fällen stellen sich Benutzer eine Datei als Synonym für "die mit dem Dateinamen verknüpfte Entität" vor. Nur wenn Sie sich mit Entitäten auf niedriger Ebene oder der Datei- / Socket-API befassen, denken Sie an Inodes oder Datenblöcke. Verzeichnisse sind eine dieser untergeordneten Entitäten.

Sie könnten denken, dass ein Verzeichnis eine Datei ist, die eine Reihe anderer Dateien enthält. Das ist nur halb richtig. Ein Verzeichnis ist eine Datei, die Dateinamen Inode-Nummern zuordnet. Es "enthält" keine Dateien, sondern Zeiger auf Dateinamen. Stellen Sie sich das wie eine Textdatei vor, die folgende Einträge enthält:

  • . - Inode 1234
  • .. - Inode 200
  • Dokumente - inode 2008
  • README.txt - Inode 2009

Die obigen Einträge werden als Verzeichniseinträge bezeichnet . Es handelt sich im Grunde genommen um Zuordnungen von Dateinamen zu Inode-Nummern. Ein Verzeichnis ist eine spezielle Datei, die Verzeichniseinträge enthält.

Das ist natürlich eine Vereinfachung, erklärt aber die Grundidee und andere Verrücktheiten des Verzeichnisses.

  • Warum kennen Verzeichnisse nicht ihre eigene Größe?
    • Da sie nur Zeiger auf andere Inhalte enthalten, müssen Sie deren Inhalt durchlaufen, um die Größe zu ermitteln
  • Warum sind Verzeichnisse nie leer?
    • Weil sie mindestens die enthalten. und .. Einträge. Daher ist ein geeignetes Verzeichnis mindestens so klein wie die kleinste Dateigröße, die diese Einträge enthalten kann. In den meisten Dateisystemen sind 4096 Bytes die kleinsten.
  • Warum benötigen Sie beim Umbenennen einer Datei eine Schreibberechtigung für das übergeordnete Verzeichnis?
    • Da Sie nicht nur die Datei ändern, ändern Sie auch den Verzeichniseintrag, der auf die Datei verweist.
  • Warum zeigt ls eine seltsame Anzahl von "Links" zu einem Verzeichnis?
    • Ein Verzeichnis kann von sich selbst, seinem übergeordneten und seinen untergeordneten Verzeichnis referenziert (verknüpft) werden.
  • Was macht ein Hardlink und wie unterscheidet er sich von einem Symlink?
    • Ein fester Link fügt einen Verzeichniseintrag hinzu , der auf dieselbe Inode-Nummer verweist. Da es auf eine Inode-Nummer verweist, kann es nur auf Dateien im selben Dateisystem verweisen (Inodes sind lokal für ein Dateisystem).
    • Ein Symlink fügt einen neuen Inode hinzu, der auf einen separaten Dateinamen verweist. Da es sich auf einen Dateinamen bezieht, kann es auf beliebige Dateien im Baum verweisen.

Aber warte! Es passieren seltsame Dinge!

ls -ld somedirectoryZeigt immer die Dateigröße 4096 an, während ls -l somefiledie tatsächliche Größe einer Datei angezeigt wird . Warum?

Verwirrungspunkt 1: Wenn wir "Größe" sagen, können wir uns auf zwei Dinge beziehen:

  • Dateigröße, eine im Inode gespeicherte Nummer; und
  • zugewiesene Größe, dh die Anzahl der dem Inode zugeordneten Blöcke multipliziert mit der Größe jedes Blocks.

Im Allgemeinen sind dies nicht die gleichen Zahlen. Wenn Sie versuchen, stateine normale Datei auszuführen, werden Sie diesen Unterschied feststellen.

Wenn ein Dateisystem eine nicht leere Datei erstellt, ordnet es Datenblöcke normalerweise eifrig in Gruppen zu. Dies liegt daran, dass Dateien dazu neigen, beliebig schnell zu wachsen und zu schrumpfen. Wenn das Dateisystem nur so viele Datenblöcke zuweist, wie zur Darstellung der Datei erforderlich sind, ist das Wachstum / Verkleinern langsamer und die Fragmentierung ein ernstes Problem. In der Praxis müssen Dateisysteme also nicht ständig Speicherplatz für kleine Änderungen neu zuweisen. Dies bedeutet, dass möglicherweise viel Speicherplatz auf der Festplatte vorhanden ist, der von Dateien "beansprucht", aber nicht verwendet wird.

Was macht das Dateisystem mit all dem ungenutzten Speicherplatz? Nichts. Bis es sich anfühlt, als müsste es. Wenn sich Ihr Dateisystemoptimierungs-Tool - möglicherweise ein im Hintergrund ausgeführtes Online-Optimierungsprogramm, möglicherweise ein Teil Ihres fsck, möglicherweise in Ihr Dateisystem selbst integriert - so anfühlt, kann es die Datenblöcke Ihrer Dateien neu zuweisen - verwendete Blöcke verschieben, nicht verwendete freigeben Blöcke usw.

Nun kommen wir zum Unterschied zwischen regulären Dateien und Verzeichnissen: Da Verzeichnisse das "Rückgrat" Ihres Dateisystems bilden, erwarten Sie, dass häufig auf sie zugegriffen oder sie geändert werden müssen und daher optimiert werden sollten. Und so wollen Sie nicht, dass sie überhaupt fragmentiert werden. Wenn Verzeichnisse erstellt werden, maximieren sie immer alle ihre Datenblöcke in ihrer Größe, selbst wenn sie nur so viele Verzeichniseinträge haben. Dies ist für Verzeichnisse in Ordnung, da Verzeichnisse im Gegensatz zu Dateien in der Regel in Größe und Wachstumsrate begrenzt sind.

Die gemeldete Größe von 4096 Verzeichnissen ist die im Verzeichnis-Inode gespeicherte "Dateigröße", nicht die Anzahl der Einträge im Verzeichnis. Es ist keine feste Zahl - es sind die maximalen Bytes, die in die zugewiesene Anzahl von Blöcken für das Verzeichnis passen. In der Regel sind dies 512 Byte / Block mal 8 Blöcke, die einer Datei mit einem beliebigen Inhalt zugewiesen wurden. Bei Verzeichnissen sind übrigens die Dateigröße und die zugewiesene Größe gleich. Da es als einzelne Gruppe zugeordnet ist, verschiebt das Dateisystemoptimierungsprogramm seine Blöcke nicht.

Da das Verzeichnis wächst, werden mehr Datenblöcke zugewiesen, und es wird auch aus max diesen Blöcken entsprechend die Dateigröße durch Einstellung.

Und so lsund statwird die Dateigröße Bereich der Inode des Verzeichnisses zeigen, die auf die Größe der Datenblöcke zugewiesen , um es festgelegt ist.

Madumlao
quelle
[1] Dies ist eine großartige Antwort, danke, aber ich kannte diese bereits und sie beantwortet meine Frage nicht. Lassen Sie mich klarstellen: Nehmen wir an, es gibt ein Verzeichnis namens mydir. Und lassen Sie uns sagen , dass es einige Dateien enthält wie: f0, f1und f2. Was ist nun mydir? Es ist ein Zeiger auf einen Inode, der Folgendes enthält: String "f0" und Inode-Nummer, auf die er zeigt. String "f1" und Inode-Nummer, auf die es zeigt. String "f2" und Inode-Nummer, auf die es zeigt. (Zumindest ist dies das Bild in meinem Kopf. Es könnte falsch sein) So weit so gut.
Utku
[2] Nun müssen wir entscheiden, was wir unter der Größe eines Verzeichnisses verstehen. Eine der beiden Optionen besteht darin, sie so zu definieren, dass nur die Größe der Inode auf mydirzeigt. Hinzufügen der Größen der Inodes, auf die der Inhalt des Verzeichnisses verweist. Der andere Weg könnte darin bestehen, die Summe der Größen der Inodes zu definieren, auf die der Inhalt des Verzeichnisses zeigt. Wenn wir der Einfachheit halber annehmen, dass es nach der vorherigen Definition berechnet wird, sollte die Größe von mydir: 2 + 2 + 2 + 3 * <Größe, die zum Speichern einer Inode-Nummer erforderlich ist> sein. 2 sind, weil jeder Dateiname in mydirzwei Zeichen lang ist.
Utku
[3] Wenn man so denkt, muss die gemeldete Größe eines leeren Verzeichnisses weit unter 4096 Bytes liegen. Jetzt werden Sie sagen, dass die Zuordnung in Blöcken erfolgt. Daher ist die gemeldete Größe so groß. Aber dann werde ich sagen: Die Zuordnung für reguläre Dateien erfolgt ebenfalls in Blöcken. Ihre Größen werden jedoch als echte Größen angegeben. Meine Frage ist dies. Was ist der Grund für solch unterschiedliche Richtlinien beim Melden der Größe einer Datei im Vergleich zu einem Verzeichnis?
Utku
Ich würde einen Unterschied zwischen der Dateigröße und der zugewiesenen Größe machen. Dateisysteme können nach eigenem Ermessen unterschiedliche Techniken zum Zuweisen von Blöcken verwenden. Im Allgemeinen enthält der Inode eine "Blockliste", die auf die Datenblöcke verweist. Einige Dateisysteme können die Dateidaten im Block des Inodes selbst speichern. Einige Dateisysteme können den Inode haben Geben Sie einen Start- / Endblock an, einige können Blöcke zwischen Dateien usw. aufteilen / zuordnen. Mit anderen Worten, es gibt keine Garantie im allgemeinen Fall, dass die Datei den gesamten Block "besitzt". Die einzige Größe, die der Datei "gehört", ist der tatsächliche Inhalt (nicht der Inode).
Madumlao
Verzeichnisse sind jedoch spezielle Dateien und können vom Dateisystem hinsichtlich der Dateigröße / Blockzuordnung unterschiedlich behandelt werden. Der für ein Verzeichnis auf der Festplatte zugewiesene Speicherplatz gehört wahrscheinlich auch ausschließlich dem Verzeichnis zu Optimierungszwecken (damit der Inhalt eines Verzeichnisses schneller gelesen / geschrieben werden kann). Ich würde den Unterschied also NICHT als Berichtsunterschied betrachten, sondern als Zuordnungsunterschied. Das Verzeichnis "besitzt" den gesamten Block beim Erstellen, eine reguläre Datei, nicht unbedingt. Dies würde erklären, warum die Verzeichnisgröße je nach Dateisystem unterschiedlich ist.
Madumlao
3

Ich denke, dass die anfängliche, leere Verzeichnisgröße vom Dateisystem abhängt. Auf ext3- und ext4-Dateisystemen, auf die ich Zugriff habe, erhalte ich auch leere Verzeichnisse mit 4096 Byte. Auf einem NFS-Mount-NAS erhalte ich ein leeres 80-Byte-Verzeichnis. Ich habe keinen Zugriff auf ein ReiserFS-Dateisystem, die dort neu erstellte, leere Verzeichnisgröße wäre interessant.

Traditionell war ein Verzeichnis eine Datei mit einem Bit im Inode (der Struktur auf der Festplatte, die die Datei beschreibt), die angibt, dass es sich um ein Verzeichnis handelt. Diese Datei wurde mit Datensätzen variabler Länge gefüllt. Folgendes /usr/include/linux/dirent.hsagt:

struct dirent64 {
    __u64       d_ino;
    __s64       d_off;
    unsigned short  d_reclen;
    unsigned char   d_type;
    char        d_name[256];
};

Sie können die Verzeichnisdateieinträge mithilfe der d_offWerte überspringen . Wenn ein Eintrag entfernt wurde ( unlink()Systemaufruf, vom rmBefehl verwendet), wurde der d_offWert des vorherigen Eintrags erhöht, um den fehlenden Datensatz zu berücksichtigen. Nichts hat Aufzeichnungen "komprimiert". Es war wahrscheinlich am einfachsten, die Zuordnung in Bezug auf die Anzahl der Bytes in den der Datei zugewiesenen Plattenblöcken anzuzeigen, anstatt zu versuchen, herauszufinden, wie viele Bytes in einem Verzeichnisdateikonto für alle Einträge vorhanden sind, oder nur bis zu letzter Eintrag.

Heutzutage haben Verzeichnisse interne Formate wie B-Bäume oder Hash-Bäume . Ich vermute, dass es entweder eine große Leistungsverbesserung ist, Verzeichnisse nach Blöcken zu erstellen, oder dass in ihnen "Leerzeichen" vorhanden sind, ähnlich wie bei Verzeichnissen der alten Schule. Daher ist es schwierig zu entscheiden, wie groß die "tatsächliche Größe" in Bytes eines Verzeichnisses ist Eine, die schon eine Weile in Gebrauch ist und deren Dateien häufig gelöscht und hinzugefügt wurden. Einfacher, nur die Anzahl der Blöcke multipliziert mit Bytes pro Block anzuzeigen.

Bruce Ediger
quelle
Aber warum ist es dann einfach, die tatsächliche Größe einer "normalen" Datei, aber nicht eines Verzeichnisses anzugeben?
Utku
1
@Utku - weil Programme die tatsächliche Größe einer normalen Datei verwenden können. Sie können einen Puffer mit der Größe der Datei zuordnen und die Datei in den Puffer einlesen. Sie können die Bytes einer Dateigröße aus der Datei lesen und über einen Socket senden. Die Verwendungsmöglichkeiten sind unendlich. Wenn Sie nur die Anzahl der Blöcke haben, können Sie die Anzahl der Blöcke nicht mehr lesen und dann alle Bytes untersuchen, um herauszufinden, wo sich das Bytende in den Blöcken befindet. Hat CP / M so etwas nicht getan und die Bytes einer Datei mit Control-Z-Zeichen auf 512-Byte-Vielfache aufgefüllt?
Bruce Ediger
1
Dann lautet die Antwort wie folgt: Dateien werden mit der tatsächlichen Größe gemeldet, da diese tatsächliche Größe verwendet werden kann, aber da ein solches Szenario für Verzeichnisse nicht möglich ist, tut dies das Dateisystem (oder was auch immer, ich bin nicht sicher, was) nicht sich die Mühe machen, die tatsächliche Größe eines Verzeichnisses zu bestimmen und zu melden?
Utku
@Utku - Ich denke, das klingt richtig und ist sehr prägnant.
Bruce Ediger
Ich denke auch, aber ich denke, dass es vielleicht einen anderen wichtigeren Grund gibt. Wie schwer kann es schließlich sein, die tatsächliche Größe eines Verzeichnisses anzugeben, selbst wenn es uns nicht nützen würde? Ich denke, es sollte nicht länger als ein paar Millisekunden dauern.
Utku
2

Einer Datei sind möglicherweise keine Blöcke zugeordnet. Das -sFlag to lszeigt diesen Unterschied an, während einem Verzeichnis eine bestimmte Anzahl von Mindestblöcken zugewiesen ist, daher die Standardgröße. (Es sei denn, Sie arbeiten in einem schicken modernen Dateisystem, das diese Begriffe aus dem Fenster wirft.) Zum Beispiel:

% mkdir testfoo
% cd testfoo/
% mkdir foodir
% touch foofile
% ln -s foofile foosln
% ls -ld foo*
drwxrwxr-x  2 jmates  jmates  512 Oct  5 19:48 foodir
-rw-rw-r--  1 jmates  jmates    0 Oct  5 19:48 foofile
lrwxrwxr-x  1 jmates  jmates    7 Oct  5 19:48 foosln -> foofile
% ls -lds foo*
8 drwxrwxr-x  2 jmates  jmates  512 Oct  5 19:48 foodir
0 -rw-rw-r--  1 jmates  jmates    0 Oct  5 19:48 foofile
0 lrwxrwxr-x  1 jmates  jmates    7 Oct  5 19:48 foosln -> foofile
% 

Beachten Sie, dass der Symlink hier keine Blöcke benötigt, obwohl sieben Bytes für die erforderlichen Details reserviert sind readlink(2), wie neugierig! Wie auch immer, lassen Sie uns jetzt foofilemit ein oder zwei Bytes auffüllen:

% echo >> foofile a
% ls -lds foo*
8 drwxrwxr-x  2 jmates  jmates  512 Oct  5 19:48 foodir
8 -rw-rw-r--  1 jmates  jmates    2 Oct  5 19:49 foofile
0 lrwxrwxr-x  1 jmates  jmates    7 Oct  5 19:48 foosln -> foofile
%

Und man kann sehen , dass die zugewiesenen Blöcke für foofilebis gesprungen ist 8trotz nur zwei Bytes (das Wesen aund die Neue - Zeile echoauf gehefteten).

Dateien können auch spärlich sein. Dies ist eine weitere Möglichkeit, wie sich die gemeldete Dateigröße im Vergleich zum tatsächlichen Inhalt unterscheiden kann, je nachdem, wie das Tool, das mit der Datei interagiert, mit dieser Spärlichkeit umgeht.

Außerdem kann die Größe des Verzeichnisses erhöht werden, viele Dateien mit sehr langen Namen erstellen und überprüfen, was mit der Größe des Verzeichnisses (und den zugewiesenen Blöcken) geschieht, nachdem jeder neue lange Dateiname mit erstellt wurde ls -lds .

Thrig
quelle
[1] Um zu sehen, ob ich verstanden habe: Die Anzahl der zugewiesenen Blöcke foofilewar anfangs 0, weil sie leer war. Daher foofilezeigte nicht auf eine Inode. Nach einer kleinsten Änderung an foofilemusste ihm jedoch ein Inode zugewiesen werden, und das Dateisystem wies ihm die geringste Anzahl zuweisbarer Blöcke zu. Ist das richtig?
Utku
[2] Auch wenn es noch 3 Fragen gibt: 1) Warum belegt fooslnes keine Blöcke? Es ist seit dem Moment seiner Erstellung nicht leer. Daher fühlt es sich so an, als ob es bei der Schöpfung einige Blöcke einnehmen sollte. 2) Warum ist die kleinste Anzahl zuweisbarer Blöcke 8? (oder ist es?) Sollte es nicht 1 sein? 3) Und obwohl ich jetzt weiß, dass auch Dateien in Blöcken zugeordnet sind, weiß ich immer noch nicht, warum die Größe eines Verzeichnisses als Gesamtgröße der von ihm belegten Blöcke im Vergleich zur Größe einer Datei als angegeben wird seine wirkliche Größe?
Utku
Der "Inode" ist eine von den Datenblöcken getrennte Entität . Der Inode kann als Metadaten mit einem Zeiger auf die Blöcke (normalerweise eine Liste) betrachtet werden. Bei einem Symlink gibt es KEINE Blöcke - der Inode selbst enthält den Dateinamen, auf den verwiesen wird.
Madumlao
@madumlao Dann wird die Anzahl angegeben, da die Anzahl der Blöcke wirklich ist; "Die Anzahl der Blöcke, auf die der Inode dieser Datei zeigt"?
Utku
1
Ja. Inodes haben traditionell Blocklisten, und ls -s zeigt die Größe dieser Liste an. Symlinks haben Nullblöcke und melden daher immer Null, wenn Sie ihre Datenblöcke mit einfachen Werkzeugen bearbeiten. Ich denke nicht, dass Dateisysteme notwendigerweise an die Blocklisten-Metapher gebunden sind. RAM-basierte Dateisysteme oder Datenbankdateisysteme oder andere FUSE-Dinge können dies irgendwie "betrügen". Und ich bin mir ziemlich sicher, dass reiserfs "Unterstützung für kleine Dateien" hat, die die Daten einer kleinen Datei im Inode-Block speichern können, wenn sie passen. Ich weiß nicht, wie reiser ls -s für kleine Dateien meldet. Null? 1?
Madumlao