$ timeout 1 cat /dev/zero > file1
$ wc -c file1
270422016 file1
$ du file1
264084 file1
Perguntas :
(1) Como 270422016 caracteres nulos são 264084 bytes (ou seja, 258M).
$ truncate -s 270422016 file2
$ wc -c file2
270422016 file2
$ du file2
0 file2
Perguntas :
(2) file2
foi criado com o mesmo número de caracteres nulos file1
, mas o tamanho de file2
é zero, por quê?
(3) O que fez /dev/zero
que truncate
não fez ou vice-versa?
du
não mostra o tamanho em bytes, mas (neste caso) blocos de 1024 bytes. Então os números são realmente idênticos (264084 * 1024 = 270422016
)truncate
cria um arquivo esparso desde que o sistema de arquivos suporte essas coisas/dev/zero
na verdade produz bytes infinitos\0
que são então gravados no arquivo, e escrever zeros consome espaço como escrever qualquer outro conteúdo. Outra maneira de produzir um arquivo que consome espaço sem realmente escrever zeros seria usandofallocate
.Você pode usar
filefrag
para obter mais informações sobre esses arquivos.Arquivo 1 (
cat /dev/zero
) está totalmente escrito e também acabou fragmentado neste caso:A fragmentação depende de quanto espaço livre existe e de onde o sistema de arquivos decidiu começar a gravar no arquivo sem saber o tamanho que ele terá no final.
O arquivo 2 (
truncate
) é apenas um shell vazio, não há espaço reservado para ele, seu tamanho é meramente indicado por metadados, não por extensões físicas.O arquivo 3 (
fallocate
) está alocado, mas marcado como não escrito. Portanto, o espaço físico é reservado para ele e é até desfragmentado (já que o sistema de arquivos foi informado do tamanho de antemão). A leitura deste arquivo resultará em zeros, mesmo que fisicamente possa haver dados diferentes armazenados neste endereço. Isso ocorre porque a alocação instantânea de arquivos apenas reserva espaço, mas não substitui os dados no disco.