df -h muestra una salida incorrecta en GB

df -h muestra una salida incorrecta en GB

Si enumero la salida df para KB, MB y GB, no coinciden, por ejemplo

$ 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, por lo que está ligeramente apagado, pero está bien.
  • 12796048 KB = 12,2 GB, 12407 MB también son 12,2 GB

Entonces, ¿por qué df muestra 13 GB?¿O me estoy perdiendo algo?

Aquí está el listado completo de df

$ 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

La versión de Coreutils parece 7.4 como info coreutilsse muestra

Este manual documenta la versión 7.4 de las utilidades principales de GNU,

Respuesta1

dfsiempre redondea la salida legible por humanos ( -hy -H).

Desde su código fuente en el paquete coreutils, lib/human.huna enumeración de opciones para la human_readablefunción que proporciona redondeo, conversión de unidades, etc.:

/* 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,
...

Tenga en cuenta el comentario:Round to plus infinity (default).

El redondeo real probablemente ocurre en la siguiente función en human.c, que agrega true(es decir 1, ) si no se establece ninguna otra opción de redondeo que se muestra arriba (no lo está, -hsolo establece human_autoscale | human_SI | human_base_1024, lo que resulta en una escala automática usando 1024 como incremento de unidad e imprimiendo el sufijo de estilo SI, es decir G) y el valor no es un número entero:

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

Respuesta2

Normalmente, esto se asocia con ineficiencias de un sistema de formato. Por ejemplo, un archivo puede tener solo 12,2 g (en lo cual tiene razón), pero en el disco físico puede ocupar 13 GB de espacio. Eso se debe a "bloqueando" y es el resultado de la fragmentación.

Wikipedia: Esto conduce a una ineficiencia de espacio debido a la fragmentación interna, ya que las longitudes de los archivos a menudo no son múltiplos enteros del tamaño del bloque y, por lo tanto, el último bloque de archivos permanecerá parcialmente vacío.Esto creará espacio libre, que en promedio ocupa medio bloque por archivo.Algunos sistemas de archivos más nuevos intentan resolver esto mediante técnicas llamadas subasignación de bloques y fusión de colas.

Editar:

La página de manual dice esto:

TAMAÑO puede ser (o puede ser un número entero seguido opcionalmente de) uno de los siguientes: kB 1000, K 1024, MB 1000*1000, M 1024*1024, y así sucesivamente para G, T, P, E, Z, Y .

Eso me lleva a creer que puede estar usando MB en lugar de M, por lo que mostraría 12,796, redondeando quizás a 13.

Respuesta3

Mi experiencia reciente con sistemas de archivos de varios terabytes es que la escala en 'df -h' puede ser confusa, porque la columna 'tamaño total' se redondea a un número entero, y siempre hacia arriba, mientras que las columnas 'usado' y 'disponible' están escalados y redondeados a 1 decimal. Esto puede hacer que el tamaño total se muestre como casi una "unidad" entera más grande de lo que es. El efecto es más obvio cuando el tamaño es tal que se trata de cantidades pequeñas, ya sean MB, GB o TB.

información relacionada