2009-06-08 10 views
5

Cuando uso el comando statvfs en una máquina Linux para obtener el espacio libre disponible en un sistema de archivos montado, el número que obtengo es ligeramente diferente de lo que informa df.Discrepancia entre call a statvfs y comando df

Por ejemplo, uno en la máquina que tengo con un disco duro de 500G, me sale el siguiente salida de df:

# df --block-size=1 --no-sync 
Filesystem   1B-blocks  Used Available Use% Mounted on 
/dev/md0    492256247808 3422584832 463828406272 1%/
tmpfs    2025721856   0 2025721856 0% /lib/init/rw 
varrun    2025721856 114688 2025607168 1% /var/run 
varlock    2025721856  4096 2025717760 1% /var/lock 
udev     2025721856 147456 2025574400 1% /dev 
tmpfs    2025721856  94208 2025627648 1% /dev/shm 

Una llamada a statvfs me da un tamaño de bloque de 4096 y 119344155 bloques libres, por lo que debería haber 488,833,658,880 bytes gratis. Sin embargo, df informa que hay 463,828,406,272 bytes gratis. ¿Por qué hay una discrepancia aquí?

Respuesta

7

Dado que su discrepancia es cercana al 5% [1], que es el porcentaje predeterminado asignado para la raíz, existe la posibilidad de comparar el resultado df con el -> f_bfree de statvfs y no con -> f_bavail, que es lo que usa df.

[1]: (488833.65888 millones - 463828406272)/492256247808 = 0,0508

+0

Ahh ... Ya veo. Sí, usando f_bavail los números son los mismos. Muchas gracias por la información. –

+0

Estoy encontrando una discrepancia en el cálculo de porcentajes de libre. Cuando calculo (f_bavail * 100.0)/f_blocks "- Espero tener (100 - use porcentaje de df). Sin embargo - esto está fuera de 4%. El error está más allá si uso f_bfree. –

0
#include <stdio.h> 
#include <sys/statvfs.h> 
int main(){ 
    struct statvfs stat; 
    int a=statvfs("/",&stat); 
    printf("total free disk space of the partition: %d GB \n",(stat.f_bavail)*8/2097152); 
    //512 is 2^9 - one half of a kilobyte. 
    //A kilobyte is 2^10. A megabyte is 2^20. A gigabyte is 2^30. A terabyte 
    //is 2^40. And so on. The common computer units go up by 10's of powers 
    //of 2 like that. 
    //So you need to divide by 2^(30-9) == 2^21 == 2097152 to get gigabytes. 
    //And multiply by 8 because 1 byte=8bit 
    return 0; 
} 

que hago en esta forma porque prefiero el resultado en GB, pero puede modificar las unidades que cambian el exponent.And es cierto la primera respuesta, como puedes ver, la uso también

Cuestiones relacionadas