Arquivos deletados e espaço em disco não liberado

Olá pessoal, vamos para mais uma dica sobre File Systems…

Alguém já presenciou uma situação em que um grande arquivo ou milhares de pequenos arquivos foram eliminados com rm -rf e o espaço em disco não foi liberado ? pois bem, eu já presenciei várias vezes em FileServers Samba e hosts com bancos de dados Oracle.

Trata-se de uma situação comum que dependendo da situação pode ser uma dor de cabeça e tanto. Quando temos um arquivo sendo usado por um processo de aplicativo, e que durante este “lock” o removemos o filesystem marca este arquivo como deletado e não libera os blocos usados pelo(s) arquivo(s)… Um dia destes, presenciei um host Oracle segurando dois temporary datafiles de 32Gb em disco, pois estes foram removidos da tablespace TEMP da instância em questão (removidos via Oracle) e ainda estavam sendo usados pelo processo de servidor ora_dbw…

Pois bem, podemos identificar rapidamente se temos algum arquivo marcado para deleção em um determinado filesystem (ponto de montagem) utilizando o aplicativo lsof. De quebra conseguimos também saber o PID do processo que está “segurando” o arquivo em disco. Vamos ao esclarecimento prático:

Temos uma unidade mapeada em /u1 de 79Gb, com 78Gb livres:

[root@vostrolab2 u1]# df -h /u1
Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/vg01-u1    79G  184M   78G   1% /u1

Criamos nesta unidade um arquivo de 500Mb:

[root@vostrolab2 u1]# dd if=/dev/zero of=cialinux.teste bs=1M count=500
500+0 records in
500+0 records out
524288000 bytes (524 MB) copied, 2.28967 s, 229 MB/s
[root@vostrolab2 u1]# df -h /u1
Filesystem                         Size  Used Avail Use% Mounted on
/dev/mapper/vg01-u1    79G  686M   78G   1% /u1

Podemos notar o comportamento esperado da unidade, que é mostrar os ≃500Mb usados…

Vamos criar um processo que faça o “lock” do arquivo em questão, simplesmente abrindo o arquivo vazio com o vi:

[root@vostrolab2 u1]# vi cialinux.teste

Agora, como se não soubéssemos do processo, vamos remover o arquivo com o comando rm -rf, e notar que o espaço usado em disco não será liberado…

[root@vostrolab2 u1]# rm -rf cialinux.teste

[root@vostrolab2 u1]# df -h /u1
Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/vg01-u1    79G  684M   78G   1% /u1

Para descobrirmos se há arquivos marcados para deleção nesta unidade usamos o lsof conforme abaixo:

[root@vostrolab2 u1]# lsof /u1 |grep deleted
vi      2896 root    3r   REG  253,1 524288000   12 /u1/cialinux.teste (deleted)

Aí está o indivíduo… 🙂  Podemos observar que o pid é o 2896, logo, se tivermos certeza disso podemos “matar” o processo e observar que o espaço será liberado:

[root@vostrolab2 u1]# kill -15 2896
[root@vostrolab2 u1]# df -h /u1
Filesystem                        Size  Used Avail Use% Mounted on
/dev/mapper/vg01-u1    79G  184M   78G   1% /u1

Obviamente que em serviços mais críticos como uma base de dados Oracle é estritamente recomendado parar o serviço de forma segura, para que o PID seja eliminado e consequentemente o(s) arquivo(s) retido(s) em disco também…

Até a próxima…

Por: Franklin Moretti

Uma interação sobre “Arquivos deletados e espaço em disco não liberado

  1. Legal é o shred:

    shred – overwrite a file to hide its contents, and optionally delete it..

    Com ele é posível apagar *mesmo*, de verdade, sem deixar rastro, sem possibilidade de recuperação daqueles inodes.

    shred -zvn cialinux.teste

    Pronto! Morte pra ele.

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Retype the CAPTCHA code from the image
Change the CAPTCHA codeSpeak the CAPTCHA code