df cálculo legível por humanos

2

Eu me pergunto por que existe uma diferença entre o tamanho relatado de um sistema de arquivos com df -h e o cálculo manual. por exemplo:

O tamanho de acordo com o LVM:

 # lvdisplay system/var | grep -i size
 LV Size                4.00 GiB

Legível para humanos:

# df -h /var
Filesystem              Size  Used Avail Use% Mounted on
/dev/mapper/system-var  4.0G  361M  3.4G  10% /var

Em tamanho de bloco KB:

# df -k /var
Filesystem             1K-blocks   Used Available Use% Mounted on
/dev/mapper/system-var   4128448 369480   3549256  10% /var

E calculando GB da KB:

# perl -E 'say $_/(1024*1024) foreach ( 4128448 , 369480 , 3549256 );'
3.93719482421875
0.352363586425781
3.38483428955078

3.93G é um pouco distante de 4G para compensar o arredondamento. Considerando 360.8203125 parece perto o suficiente para 361 como o 3.38G de 3.4G.

Então, por que há uma discrepância no tamanho total do sistema de arquivos? Se ele é arredondado, por que precisa ser definido quando o tamanho total deve ser fixado em 4 GB?

    
por DarkHeart 14.08.2015 / 03:28

1 resposta

1

POSIX define "espaço total" como:

The total size of the file system in 512-byte units. The exact meaning of this figure is implementation-defined, but should include "space used", "space free", plus any space reserved by the system not normally available to a user.

Usando meu sistema de arquivos Raspberry Pi como exemplo:

$ df -Ph /
Filesystem      Size  Used Avail Use% Mounted on
/dev/mmcblk0p2   14G  7.3G  5.8G  56% /

Mas,

$ df -P /
Filesystem     1024-blocks    Used Available Use% Mounted on
/dev/mmcblk0p2    14384136 7628204   6005548  56% /

$ dumpe2fs /dev/mmcblk0p2|grep -e 'Block count:' -e 'Block size:' -e 'Reserved block count:' 
dumpe2fs 1.43.9 (8-Feb-2018)
Block count:              3670016
Reserved block count:     183500
Block size:               4096

Fazendo o cálculo:

(3670016 - 183500) * 4 / 2**20 = 13.3 # block size
14384136 / 2 ** 20 = 13.7 # df calculation

O que significa que total inclui o espaço reservado usado, mas não o espaço reservado não alocado.

Olhando para o código fonte:

static void
get_field_values (...)
{
   bv->available_to_root = fsu->fsu_bfree
   ...
       bv->used = bv->total - bv->available_to_root;

sysvfs:

fsblkcnt_t     f_bfree;    /* Number of free blocks */

Compare:

fsblkcnt_t     f_bavail;   /* Number of free blocks for
                              unprivileged users */

TL; DR - é o espaço reservado free que faz a diferença entre os dois números. Como observou @cuonglm, o 'legível humano' é completado.

    
por 12.03.2018 / 05:48