Woher kommt der Unterschied zwischen df und statfs?

03/06/2013 - 09:32 von Edzard Egberts | Report spam
Meine Software soll in der Lage sein, als Root das Filesystem bis auf
etwa 50 MB vollzuschreiben - dann soll sie aufhören, damit das System
noch etwas Platz hat. Den freien Platz bestimme ich mit

struct statfs disk;
int R= statfs("/dev/root",&disk);

und erhalte:

blocksize 4096
total blocks 1670215
free blocks 1073494
avail blocks 988652

Zum Vergleich ein Aufruf von df:

Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 6680860 2385416 3956076 38% /
tmpfs 14908 0 14908 0% /dev/shm

Das habe ich dann mal nachgerechnet:

statfs: total * block = 1670215 * 4096 = 6.8412e9
df: total * block = 6680860 * 1024 = 6.8412e9

Die gesamte Größe stimmt also überein. Allerdings:

statfs: free * block = 1073494 * 4096 = 4.39703e+09 = 4293980 kB
df: avail* block = 3956076 * 1024 = 4.05102e+09 = 3956076 kB

Für den Freiraum ergibt sich ein Unterschied von 337904 kB, also ca. 330
MB. Da wüßte ich gerne, wo der herkommt und welcher Wert verlàsslicher
ist. Wenn statfs weniger anzeigen würde, wàre es mir egal, aber so
erkennt mein Programm deutlich mehr Platz, als df und das ist mir etwas
unheimlich.
 

Lesen sie die antworten

#1 Peter Gertner
03/06/2013 - 13:22 | Warnen spam
On 03.06.2013 09:32, Edzard Egberts wrote:
[ statfs ]
blocksize 4096
total blocks 1670215
free blocks 1073494
avail blocks 988652

Zum Vergleich ein Aufruf von df:

Filesystem 1K-blocks Used Available Use% Mounted on
/dev/root 6680860 2385416 3956076 38% /
tmpfs 14908 0 14908 0% /dev/shm



Und dir ist nicht aufgefallen, daß statfs zwischen "free" und
"available" unterscheidet, als die die Aufgabe programmiert hast?

Dein Dateisystem reserviert (etwa 5%, diesen Wert kann man (auch
nachtràglich noch) àndern) Speicher für root, damit nur unprivilegierte
Benutzer alles vollschreiben können und das System damit unbenutzbar
machen, weil auch kein Platz mehr für z.B. ein Log ist. Das verhindert
also genau das, was du auch verhindern willst.


Da wüßte ich gerne, wo der herkommt und welcher Wert verlàsslicher
ist.



Siehe oben, die sind beide gleich verlàsslich. Beim genaueren Hinsehen
fàllt dir auch auf, daß bei df die Summe aus Used und Available nicht
6680860kB ergibt, sondern etwa 300MB weniger. Das Total ist bei beiden
das gleiche, das Available auch, das Free wird von df nicht angezeigt.

Wenn dein Programm als unprivilegierter Benutzer làuft, wird irgendwann
das Schreiben eh fehlschlagen, bevor die Platte ganz voll ist. Wenn du
auch für andere unprivilegierte Programme noch 50MB freihalten willst,
solltest du f_bavail aus statfs benutzen.

Bis spàter,
Peter

Ähnliche fragen