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.