df -h zeigt falsche Ausgabe in GB

1338
Anurag Uniyal

Wenn ich die Ausgabe von df für KB, MB und GB aufliste, stimmen sie nicht überein

$ df -k |grep xvdb /dev/xvdb1 12796048 732812 11413172 7% /xxx $ df -m |grep xvdb /dev/xvdb1 12497 716 11146 7% /xxx $ df -h |grep xvdb /dev/xvdb1 13G 716M 11G 7% /xxx 
  • 12796048 KB = 12496,14 MB, das ist zwar leicht, aber in Ordnung
  • 12796048 KB = 12,2 GB, 12407 MB sind auch 12,2 GB

warum zeigt df 13 GB an oder fehlt mir etwas?

Hier ist die vollständige Df-Liste

$ df -h Filesystem Size Used Avail Use% Mounted on /dev/xvda1 7.5G 1.7G 5.5G 24% / none 5.8G 128K 5.8G 1% /dev none 5.8G 0 5.8G 0% /dev/shm none 5.8G 44K 5.8G 1% /var/run none 5.8G 0 5.8G 0% /var/lock none 5.8G 0 5.8G 0% /lib/init/rw /dev/xvdb1 13G 716M 11G 6% /xxx 

Coreutils-Version scheint 7,4 wie info coreutilsgezeigt

Dieses Handbuch dokumentiert Version 7.4 der GNU-Kernprogramme,

0
Welche Version von `coreutils` haben Sie installiert? Sie können auch die Kopfzeile von `df` drucken, die die Einheiten anzeigt. Daniel Beck vor 11 Jahren 0
Ich habe df full output hinzugefügt und benutze Ubuntu 10.04. Wie kann ich die coreutils-Version überprüfen? Anurag Uniyal vor 11 Jahren 0
@DanielBeck coreutils 7.4 Anurag Uniyal vor 11 Jahren 0

3 Antworten auf die Frage

2
Daniel Beck

dfrundet immer die lesbare Ausgabe ( -hund -H) ab.

Aus dem Quellcode des coreutils-Pakets werden lib/human.hzahlreiche Optionen für die human_readableRundungsfunktion, die Einheitenumrechnung usw. aufgeführt:

/* Options for human_readable. */ enum { /* Unless otherwise specified these options may be ORed together. */  /* The following three options are mutually exclusive. */ /* Round to plus infinity (default). */ human_ceiling = 0, /* Round to nearest, ties to even. */ human_round_to_nearest = 1, /* Round to minus infinity. */ human_floor = 2, ... 

Beachten Sie den Kommentar: Round to plus infinity (default).

Die eigentliche Rundung geschieht wahrscheinlich in der folgenden Funktion in human.c, die addiert true(dh, 1wenn keine andere oben gezeigte Rundungsoption gesetzt ist (wird nicht gesetzt, sondern -hnur gesetzt) human_autoscale | human_SI | human_base_1024, was zur automatischen Skalierung mit 1024 als Einheitsinkrement führt und das Suffix des SI-Stils druckt. dh G) und der Wert ist keine ganze Zahl:

static long double adjust_value (int inexact_style, long double value) { /* Do not use the floorl or ceill functions, as that would mean checking for their presence and possibly linking with the standard math library, which is a porting pain. So leave the value alone if it is too large to easily round. */ if (inexact_style != human_round_to_nearest && value < UINTMAX_MAX) { uintmax_t u = value; value = u + (inexact_style == human_ceiling && u != value); }  return value; } 
0
nerdwaller

Dies ist normalerweise mit Ineffizienzen eines Formatierungssystems verbunden. Eine Datei kann beispielsweise nur 12,2 g groß sein (was Sie richtig machen), aber auf der physischen Festplatte kann sie 13 GB Speicherplatz beanspruchen. Das liegt an " Blockieren " und ist das Ergebnis der Fragmentierung.

Wikipedia : Dies führt aufgrund interner Fragmentierung zu einer Ineffizienz des Speicherplatzes, da Dateilängen oft keine ganzzahligen Vielfachen der Blockgröße sind und der letzte Dateiblock daher teilweise leer bleibt. Dadurch wird ein Leerraum geschaffen, der durchschnittlich einen halben Block pro Datei beträgt. Einige neuere Dateisysteme versuchen, dieses Problem durch Techniken zu lösen, die als Block-Suballocation und Tail Merging bezeichnet werden.

Bearbeiten :

Die Manpage sagt folgendes:

GRÖSSE kann (oder kann eine ganze Zahl sein, optional gefolgt von) eine der folgenden: kB 1000, K 1024, MB 1000 * 1000, M 1024 * 1024 usw. für G, T, P, E, Z, Y .

Das lässt mich glauben, dass MB anstelle von M verwendet wird, so dass sich 12.796 ergibt - eine Rundung auf 13.

es ist keine Datei, es ist selbst ein Gerät + warum würden dann die Werte für kb und mb nicht dasselbe zeigen, selbst für Datei .8 GB extra :) ist lächerlich Anurag Uniyal vor 11 Jahren 0
Aktualisiert, scheint es da draußen keine großartige Antwort zu geben. Abhängig von der verwendeten Methode (sie schlagen zwei vor, die das Programm verwenden kann), wird es auf 12 oder 13 gerundet. nerdwaller vor 11 Jahren 0
0
Richard Brittain

In letzter Zeit habe ich mit Dateisystemen mit mehreren Terabyte Erfahrung gemacht, dass die Skalierung in 'df -h' verwirrend sein kann, da die Spalte 'Gesamtgröße' auf eine ganze Zahl gerundet wird und immer auf, während die Spalten 'used' und 'available' immer oben sind werden skaliert und auf 1 Dezimalstelle gerundet. Dies kann dazu führen, dass die Gesamtgröße fast um eine ganze Einheit größer wird, als sie ist. Der Effekt ist am offensichtlichsten, wenn die Größe so ist, dass Sie in kleinen Zahlen sind - ob MB, GB oder TB.