Wie zählt `du` die verwendeten Blöcke?

Wie zählt `du` die verwendeten Blöcke?

Ich bin neugierig und möchte wissen, wie die duAnzahl der in einer Datei verwendeten Blöcke berechnet wird.

Szenario

dd bs=1 seek=2GiB if=/dev/null of=big
0+0 records in
0+0 records out
0 bytes (0 B) copied, 2.3324e-05 s, 0.0 kB/s

ls -lh big
-rw-r--r-- 1 roaima roaima 2.0G May 19 15:55 big

du -h big
0       big

Ich habe immer akzeptiert, dass ich unterschiedliche Antworten auf erhalten werde ls, und das ist in Ordnung, da sie unterschiedliche Dinge messen.

Jetzt habe ich ein Cloud-basiertes Dateisystem, bei dem mir nicht nur die Speicherung, sondern auch jeder Datendownload in Rechnung gestellt wird. Daher muss ich die Datenmenge minimieren, auf die durch allgemeine Verwaltungsaktivitäten zugegriffen wird, z. B. „Wie viel Speicherplatz wird in diesem Baum verwendet?“

Mir ist kein Bibliotheks-/Systemaufruf bekannt, der mir die Anzahl der verwendeten Blöcke mitteilt, obwohl es durchaus einen geben könnte. Ich glaube nicht, dass es dusich durch alle Dateien durchliest, die es in Betracht zieht, da es nicht zwischen einer Datei voller Nullen und einer Datei mit wirklich spärlichem Inhalt unterscheidet.

Wie werden also duZählblöcke verwendet?

Antwort1

duVerwendetstat(2)um die Anzahl der von einer Datei verwendeten Blöcke zu ermitteln. Wenn Sie ausführen, stat bigsollten Sie sehen, dass die Anzahl der Blöcke mit der von angegebenen Zahl übereinstimmt du.

Sie können dumit der Option das Zählen von Bytes erzwingen -b. Die Ausgabe entspricht dann ls's.

In beiden Fällen wird stat(2)(oder besser gesagt, fstatat(2)zumindest in der Version, die ich habe) Folgendes verwendet:

$ strace du big|&grep big
execve("/usr/bin/du", ["du", "big"], [/* 57 vars */]) = 0
newfstatat(AT_FDCWD, "big", {st_mode=S_IFREG|0644, st_size=2147483648, ...}, AT_SYMLINK_NOFOLLOW) = 0
write(1, "0\tbig\n", 60 big

Der Unterschied in der Verarbeitung istsichtbar indu.c.

verwandte Informationen