Usando fallocate e mkfs.ext4 pode exceder o espaço em disco disponível

2

Histórico: Temos um cluster de computadores e, na alocação de nós, um job recebe seu próprio diretório tmp de tamanho solicitado. Percebi, no entanto, que poderia enviar dois trabalhos para a mesma máquina com o total de espaço em disco solicitado maior do que o disponível. Eu rastreei o bug até fallocate e mkfs.ext4 .

Em um nó de teste / computador com 1.1T de espaço em disco disponível, eu crio discos virtuais para montar diretórios tmp. Usando fallocate e mkfs.ext4 :

# fallocate -l 900G /tmp/disk-test1
# /sbin/mkfs.ext4 -F /tmp/disk-test1
# fallocate -l 900G /tmp/disk-test2
# /sbin/mkfs.ext4 -F /tmp/disk-test2

cria dois arquivos (aparentemente) de tamanho 900G

# ll --block-size=G /tmp/
...
-rw-r--r--. 1 root  root 900G Jul  4 14:03 disk-test1
-rw-r--r--. 1 root  root 900G Jul  4 14:03 disk-test2
...

e olhando para o espaço em disco disponível

# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vg.01-lv_root  1.1T  8.6G  1.1T   1% /
...

O diretório / tmp:

# df -h /tmp
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/vg.01-lv_root  1.1T  8.6G  1.1T   1% /

Eu não quero que isso aconteça. Os discos virtuais não devem ser criados se não houver espaço suficiente e, depois de montados, escrever para eles deve ser limitado por seu tamanho.

O que está acontecendo aqui?

    
por Kisi 05.07.2018 / 11:49

1 resposta

2

Sim, eu posso reproduzir isso:

# df -h .
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   14G   14G  51% /
# fallocate -l 8G test1.disk
# df -h .
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   22G  5.8G  80% /
# mkfs -text4 test1.disk
mke2fs 1.43.4 (31-Jan-2017)
Discarding device blocks: done                            
Creating filesystem with 2097152 4k blocks and 524288 inodes
...
# df -h .
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   14G   14G  51% /

O uso do disco sobe quando o arquivo é fallocate d, mas recua depois de mkfs . Observe o "Descartando blocos do dispositivo: concluído" na saída de mke2fs . ( frostschutz mencionou isso no comentários .)

A página man diz sobre -E discard :

discard
Attempt to discard blocks at mkfs time (discarding blocks initially is useful on solid state devices and sparse / thin-provisioned storage). ... This is set as default.

nodiscard para fazer o oposto, então vamos tentar:

# df -h .; fallocate -l 8G test2.disk; mkfs -text4 -Enodiscard test2.disk; df -h .
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   14G   14G  51% /
mke2fs 1.43.4 (31-Jan-2017)
Creating filesystem with 2097152 4k blocks and 524288 inodes
...
Filesystem           Size  Used Avail Use% Mounted on
/dev/root             30G   22G  5.9G  79% /

Agora, outro fallocate -l 8G falha.

    
por 05.07.2018 / 16:38

Tags