Por que a diferença no tamanho do arquivo e seu tamanho são maiores que 4 KiB?

1

O sistema de arquivos ext4 geralmente usa blocos de 4 KiB. Desta forma, quando você escreve um arquivo pequeno, e seu tamanho é menor que 4 KiB, você verá a diferença em qualquer gerenciador de arquivos. Geralmente, existem dois valores: tamanho do arquivo e tamanho no disco. O primeiro tem o valor correto e o outro é a multiplicação dos 4 KiB.

No caso de arquivos maiores, sempre achei que o tamanho não pode diferir de mais de 4 KiB (o último bloco não totalmente escrito). Mas no caso de alguns arquivos no meu disco, posso ver que a diferença é maior do que 4 KiB, por exemplo 9425 bytes. Então a questão é simples, porque os tamanhos diferem mais de 4 KiB. É por causa da fragmentação ou algo mais? Não é estranho que alguns blocos no meio do arquivo não estejam totalmente escritos?

    
por Mikhail Morfikov 07.05.2017 / 20:14

2 respostas

3

A lista de blocos que compõem o arquivo deve ser armazenada em algum lugar. Normalmente, há pouco espaço no inode, mas se houver muitos blocos para caber no inode, o sistema de arquivos aloca blocos indiretos para armazenar o endereço dos blocos, além dos blocos que contêm arquivos dados. Pelo menos para o ext2 / ext3 / ext4 no Linux, e eu acho que para a maioria dos sistemas de arquivos do tipo Unix na maioria dos sistemas operacionais Unix-like, os blocos indiretos são levados em consideração no uso do disco pelo arquivo.

O Ext4 usa árvores de extensão para armazenar listas de bloqueio. Se um arquivo usa uma lista de blocos consecutivos em ordem, isso ocupa uma única entrada na árvore. Assim, um arquivo com pouca fragmentação não precisa de nenhum bloco indireto, apenas uma entrada na árvore que especifica o primeiro bloco e o número de blocos. Um arquivo maximamente fragmentado precisa de muitos blocos indiretos para armazenar uma entrada de árvore por bloco. Se o arquivo não estiver fragmentado ou apenas um pouco, então nenhum bloco indireto será necessário e o uso do disco do arquivo será arredondado para um número inteiro de blocos do sistema de arquivos. Arquivos fragmentados exigem blocos indiretos.

Ext2 e ext3 têm um esquema mais simples, em que a lista de bloqueios não é compactada . o número de entradas aumenta ligeiramente mais do que linearmente com o tamanho do arquivo, exigindo blocos indiretos se o arquivo usar mais de 12 blocos (isso é quantos blocos podem ser gravados diretamente no inode).

Você pode explorar um sistema de arquivos ext2 / ext3 / ext4 com o comando debugfs . Em debugfs, blocks /path/to/file lista os blocos usados por um arquivo; isso mostra como o arquivo é fragmentado. O comando filefrag /path/to/file fornece o número de fragmentos; para o ext4, isso se correlaciona com o número de blocos indiretos e, portanto, com a diferença entre o tamanho do arquivo e o uso do disco de arquivos.

    
por 08.05.2017 / 02:11
0

Acho que isso pode acontecer nesta situação :

If the FALLOC_FL_KEEP_SIZE flag is specified in mode, the behavior of the call is similar, but the file size will not be changed even if offset+len is greater than the file size. Preallocating zeroed blocks beyond the end of the file in this manner is useful for optimizing append workloads.

    
por 07.05.2017 / 23:01