df -h zeigt falsche Ausgabe in GB

df -h zeigt falsche Ausgabe in GB

Wenn ich die df-Ausgabe für KB, MB und GB aufliste, stimmen sie nicht überein, z. B.

$ 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, also ein kleiner Unterschied, aber OK
  • 12796048 KB = 12,2 GB, 12407 MB sind auch 12,2 GB

warum zeigt df dann 13 GB anoder übersehe ich 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 zu sein, wie info coreutilszeigt

Dieses Handbuch dokumentiert die Version 7.4 der GNU-Kernprogramme.

Antwort1

dfrundet für Menschen lesbare Ausgabe immer auf ( -hund -H).

Aus dem Quellcode im Coreutils-Paket geht lib/human.heine Aufzählung der Optionen für die human_readableFunktion hervor, die Rundungen, Einheitenumrechnungen usw. ermöglicht:

/* 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 erfolgt wahrscheinlich in der folgenden Funktion in human.c, die true(dh 1) hinzufügt, wenn keine andere der oben gezeigten Rundungsoptionen gesetzt ist (ist sie nicht, -hsetzt nur human_autoscale | human_SI | human_base_1024, was zu einer automatischen Skalierung mit 1024 als Einheiteninkrement und dem Drucken des SI-Stil-Suffixes, dh , führt G) und der Wert keine Ganzzahl ist:

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;
}

Antwort2

Normalerweise ist das auf Ineffizienzen eines Formatierungssystems zurückzuführen. Beispielsweise kann eine Datei nur 12,2 g groß sein (was Sie richtig finden), aber auf der physischen Festplatte 13 GB Speicherplatz beanspruchen. Das liegt daran, dass „Blockierung" und ist ein Ergebnis der Fragmentierung.

Wikipedia: Dies führt zu einer Platzineffizienz aufgrund interner Fragmentierung, da die Dateilänge häufig kein ganzzahliges Vielfaches der Blockgröße ist und daher der letzte Dateiblock teilweise leer bleibt.Dadurch entsteht ungenutzter Speicherplatz, der durchschnittlich einen halben Block pro Datei beträgt.Einige neuere Dateisysteme versuchen, dieses Problem durch Techniken namens Block-Suballocation und Tail Merging zu lösen.

Bearbeiten:

Auf der Manpage steht Folgendes:

GRÖSSE kann (oder eine Ganzzahl optional gefolgt von) einer der folgenden Werte sein: kB 1000, K 1024, MB 1000*1000, M 1024*1024 und so weiter für G, T, P, E, Z, Y.

Das lässt mich glauben, dass möglicherweise MB statt M verwendet wird, sodass 12,796 angezeigt würde – möglicherweise gerundet auf 13.

Antwort3

Meine jüngsten Erfahrungen mit Multi-Terabyte-Dateisystemen sind, dass die Skalierung in „df -h“ verwirrend sein kann, da die Spalte „Gesamtgröße“ auf eine Ganzzahl gerundet wird und zwar immer nach oben, während die Spalten „Verwendet“ und „Verfügbar“ skaliert und auf eine Dezimalstelle gerundet werden. Dies kann dazu führen, dass die Gesamtgröße fast als eine ganze „Einheit“ größer angezeigt wird, als sie ist. Der Effekt ist am deutlichsten, wenn die Größe so ist, dass Sie in kleinen Zahlen vorliegen – ob MB, GB oder TB.

verwandte Informationen