Ich bin neugierig und möchte wissen, wie die du
Anzahl 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 du
sich 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 du
Zählblöcke verwendet?
Antwort1
du
Verwendetstat(2)
um die Anzahl der von einer Datei verwendeten Blöcke zu ermitteln. Wenn Sie ausführen, stat big
sollten Sie sehen, dass die Anzahl der Blöcke mit der von angegebenen Zahl übereinstimmt du
.
Sie können du
mit 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
.