Qual é o valor "Blocks" (o campo st_blocks
de um struct stat
) medidas exatamente não são padronizadas.
Tradicionalmente, conta o número de blocos usados para o conteúdo do sistema de arquivos; esse valor multiplicado pelo tamanho do bloco é igual ao tamanho do arquivo, arredondado para o múltiplo mais próximo do tamanho do bloco. Há uma exceção: se o arquivo for um arquivo esparso , ele usará menos blocos. Isso deixa várias coisas não contabilizadas:
- Espaço consumido pelos metadados do arquivo: timestamps, permissões, etc. No layout Unix tradicional, isso é armazenado em um inode, mas os sistemas de arquivos modernos podem ter metadados grandes (para listas de controle de acesso, atributos de segurança estendidos etc.) que nem sempre se encaixa em um inode de tamanho fixo.
- Espaço consumido por blocos indiretos: para arquivos grandes, a lista de blocos que contêm o conteúdo do arquivo pode usar vários blocos.
- Espaço consumido pela entrada de diretório (ou entradas, se o arquivo tiver vários links físicos). Esse espaço é contabilizado no tamanho do diretório em si.
Eu não sei de um sistema de arquivos que reporta o tamanho do inode como parte do valor st_blocks
. A maioria dos sistemas de arquivos Unix possui um layout que separa os inodes do restante do conteúdo e rastreia o uso do inode e bloqueia o uso separadamente. Alguns sistemas de arquivos incluem blocos indiretos em st_blocks
, outros não.
Existem outras coisas que podem causar diferenças entre o tamanho do bloco e o tamanho do conteúdo. Por exemplo, em um sistema de arquivos compactado, o relacionamento depende de quanto o arquivo pode ser compactado. Alguns sistemas de arquivos podem compartilhar um bloco entre vários arquivos pequenos ou caudas de arquivos maiores, por ex. um bloco de 1024 bytes poderia conter um arquivo de 200 bytes e os últimos 100 bytes de um arquivo de 1124 bytes, e esse bloco seria contado no valor de st_blocks
para os dois arquivos.
O valor "Bloco IO" ( st_blksize
field de struct stat
) não está relacionado ao valor "Blocks" de forma alguma. O valor st_blksize
é uma sugestão para os aplicativos que obterão melhor desempenho se usarem um buffer desse tamanho ao ler ou gravar no arquivo. Em um sistema moderno com características complexas de desempenho, pode ou não ter qualquer relevância.
Em muitos sistemas, a unidade do valor st_blocks
é o valor f_bsize
de struct statvfs
. Esta unidade pode variar entre sistemas de arquivos (mesmo sistemas de arquivos do mesmo tipo, por exemplo, o ext4 pode usar 1024, 2048 ou 4096). Eu acho que esse é sempre o caso do Linux, mas não é garantido pelo POSIX. No Linux, você pode exibir o valor f_bsize
com stat -f
.
O utilitário du
fará o cálculo correto quando calcular o uso do disco para um arquivo: o que du
faz é multiplicar o valor st_blocks
pelo tamanho de bloco apropriado (para não incluir o inode na maioria dos sistemas).
Não há uma maneira genérica de encontrar o tamanho de um inode. Alguns tipos de sistema de arquivos usam inodes de tamanho fixo, que você pode procurar na definição do sistema de arquivos. Alguns tipos de sistema de arquivos usam um tamanho fixo para um determinado sistema de arquivos, que você pode consultar com um utilitário (por exemplo, tune2fs
para ext [234]).