Discrepância entre df e du

2

Eu tenho uma pergunta sobre a diferença de 'df -h' e 'du -bs'. Eu tenho visto várias perguntas aqui sobre isso, mas a questão era sempre que 'df -h' estava relatando mais espaço usado do que 'du -bs'. Eu tenho o problema oposto:

[root@CDPPRIM01 oracle-dbf]# du -bs
336178610176    .

[root@CDPPRIM01 datafiles]# df -h | grep dbf
/dev/sda2             360G  272G   85G  77% /opt/oracle-dbf

[root@CDPPRIM01 datafiles]# ls -la
total 284550000
drwxrwxr-x 2 oracle oinstall        4096 Apr  9 14:13 .
drwxr-xr-x 4 root   root            4096 Apr  3 10:33 ..
-rw-r----- 1 oracle dba          9748480 Apr 11 17:01 control01.ctl
-rw-r----- 1 oracle dba          9748480 Apr 11 17:01 control02.ctl
-rw-r----- 1 oracle dba        968892416 Apr 11 16:20 pn310_admin_DATA22.dbf
-rw-r----- 1 oracle dba        104865792 Apr 11 16:20 pn310_admin_DATA.dbf
-rw-r----- 1 oracle dba      32212262912 Apr 11 16:20 pn310_DATA11.dbf
-rw-r----- 1 oracle dba      32212262912 Apr 11 17:00 pn310_DATA12.dbf
-rw-r----- 1 oracle dba      32212262912 Apr 11 17:00 pn310_DATA13.dbf
-rw-r----- 1 oracle dba      32212262912 Apr 11 16:20 pn310_DATA14.dbf
-rw-r----- 1 oracle dba       5242888192 Apr 11 17:01 pn310_DATA15.dbf
-rw-r----- 1 oracle dba       1073750016 Apr 11 17:00 pn310_DATA.dbf
-rw-r----- 1 oracle dba       5798633472 Apr 11 16:20 pn310_dwe_DATA20.dbf
-rw-r----- 1 oracle dba       1073750016 Apr 11 16:20 pn310_dwe_DATA.dbf
-rw-r----- 1 oracle dba        104865792 Apr  3 10:42 pn310_dwe_TEMP.dbf
-rw-r----- 1 oracle dba       5263859712 Apr  3 11:28 pn310_dwe_temp_TEMP9.dbf
-rw-r----- 1 oracle dba      32212262912 Apr 11 16:20 pn310_ep_DATA16.dbf
-rw-r----- 1 oracle dba      32212262912 Apr 11 16:20 pn310_ep_DATA17.dbf
-rw-r----- 1 oracle dba      32212262912 Apr 11 16:20 pn310_ep_DATA18.dbf
-rw-r----- 1 oracle dba       9437192192 Apr 11 16:20 pn310_ep_DATA19.dbf
-rw-r----- 1 oracle dba       1073750016 Apr 11 16:50 pn310_ep_DATA.dbf
-rw-r----- 1 oracle dba        104865792 Apr  3 10:42 pn310_ep_TEMP.dbf
-rw-r----- 1 oracle dba      16001277952 Apr  3 11:27 pn310_ep_temp_TEMP8.dbf
-rw-r----- 1 oracle dba        104865792 Apr 11 06:00 pn310_TEMP.dbf
-rw-r----- 1 oracle dba      16001277952 Apr 11 17:01 pn310_temp_TEMP7.dbf
-rw-r----- 1 oracle dba      11811168256 Apr 11 16:51 pn310_xmp_DATA21.dbf
-rw-r----- 1 oracle dba       1073750016 Apr 11 17:00 pn310_xmp_DATA.dbf
-rw-r----- 1 oracle dba        104865792 Apr  3 10:42 pn310_xmp_TEMP.dbf
-rw-r----- 1 oracle dba       2042634240 Apr  3 11:29 pn310_xmp_temp_TEMP10.dbf
-rw-r----- 1 oracle dba        566239232 Apr 11 17:00 sysaux01.dbf
-rw-r----- 1 oracle dba       4802486272 Apr 11 16:57 sysaux_DATA24.dbf
-rw-r----- 1 oracle dba        754982912 Apr 11 16:58 system01.dbf
-rw-r----- 1 oracle dba       4613742592 Apr 11 17:00 system_DATA23.dbf
-rw-r----- 1 oracle dba       1073750016 Apr 10 23:07 temp01.dbf
-rw-r----- 1 oracle dba       1073750016 Apr  3 10:38 temp02.dbf
-rw-r----- 1 oracle dba       3221233664 Apr  3 11:31 temp_TEMP11.dbf
-rw-r----- 1 oracle dba       1073750016 Apr 11 17:01 undotbs01.dbf
-rw-r----- 1 oracle dba       1073750016 Apr 11 17:00 undotbs02.dbf
-rw-r----- 1 oracle dba      13958651904 Apr 11 17:01 undotbs1_DATA26.dbf
-rw-r----- 1 oracle dba          5251072 Apr 11 16:20 users01.dbf
-rw-r----- 1 oracle dba       1068507136 Apr 11 16:20 users_DATA25.dbf

Adicionando todos os arquivos, obtemos 336178593792, que em GB é igual a: 336178593792/1024/1024/1024 = 313GB, que é mais do que os 272GB relatados por 'df -h'.

Eu já fiz um umount e fsck para verificar a partição e ela está limpa. Alguém sabe qual pode ser a razão por trás desse comportamento?

    
por Jose Miguel Dores 11.04.2013 / 18:12

2 respostas

1

Uma possibilidade seria arquivos esparsos . Se grandes partes de um determinado arquivo não contiverem dados, nenhum bloco físico terá que ser alocado para essas partes do arquivo, assumindo que o sistema operacional e o sistema de arquivos o suportem.

Para verificar arquivos esparsos, use o comando invocar ls com as opções -s (espaço de exibição ocupado no disco rígido) e -k (tamanhos de exibição nos blocos do kibibyte).

Exemplo de saída:

$ df -H /dev/sda1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       118G   38G   75G  34% /
$
$ dd if=/dev/zero of=1GB-normal bs=1GB count=1 # normal file (1 GB)
$
$ df -H /dev/sda1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       119G   38G   75G  34% /
$
$ dd if=/dev/zero of=1GB-sparse bs=1GB count=0 seek=1GB # sparse file (1 GB)
$
$ df -H /dev/sda1
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda1       119G   38G   75G  34% /
$
$ ls -lks
total 976568
976568 -rw-rw-r-- 1 dennis dennis 976563 Apr 11 13:05 1GB-normal
     0 -rw-rw-r-- 1 dennis dennis 976563 Apr 11 13:06 1GB-sparse

Como o arquivo esparso ocupa (quase) nenhum espaço físico no disco, a saída do df não muda depois de criá-lo.

    
por 11.04.2013 / 19:16
1

Eu não tenho certeza do que está acontecendo aqui, mas posso dar algumas dicas.

  1. du -b implica na opção --apparent-size . Na página du man:

    --apparent-size
          print  apparent  sizes,  rather than disk usage; although the apparent
          size is usually smaller, it may be larger due to holes in ('sparse')
          files,  internal  fragmentation, indirect blocks, and the like
    -b, --bytes
          equivalent to '--apparent-size --block-size=1'
    
  2. Não sei ao certo como a Oracle lida com seus arquivos de banco de dados, mas não me surpreenderia se alguns fossem realmente esparsos. Acho que esta é a razão mais provável, veja aqui para uma discussão de como isso pode afetar du .

  3. Esta página tem uma boa explicação sobre algumas das diferenças entre as maneiras pelas quais os dois programas calculam o uso do disco .

  4. Mais informações relevantes da página df man:

    -h, --human-readable
          print sizes in human readable format (e.g., 1K 234M 2G)
    Display values are in units of the first available  SIZE  from
    --block-size,  and the DF_BLOCK_SIZE, BLOCK_SIZE and BLOCKSIZE
    environment variables.  Otherwise, units default to 1024 bytes
    (or 512 if POSIXLY_CORRECT is set).
    
    SIZE  may be (or may be an integer optionally followed by) one
    of following: KB 1000, K 1024, MB 1000*1000, M 1024*1024,  and
    so on for G, T, P, E, Z, Y.
    
por 11.04.2013 / 19:19

Tags