
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 coreutils
se muestra
Este manual documenta la versión 7.4 de las utilidades principales de GNU,
Respuesta1
df
siempre redondea la salida legible por humanos ( -h
y -H
).
Desde su código fuente en el paquete coreutils, lib/human.h
una enumeración de opciones para la human_readable
funció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á, -h
solo 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.