O Ext4 pode usar 1kB, 2kB ou 4kB como o tamanho do bloco; Tanto quanto eu sei o padrão no Ubuntu é de 4kB. Note que aqui, um bloco é o tamanho de um pedaço de arquivo, que é constante para um determinado sistema de arquivos. O arquivo que você descreve tem dois blocos que não são zeros: o que contém hello
(cercado por um monte de zeros - 3616 antes e 474 depois) eo contendo here
(precedido por um monte de zeros e contendo apenas 3148 bytes, após o qual o final do arquivo é atingido). O total é de dois blocos de 4kB.
Na saída ls
, os blocos são uma unidade arbitrária escolhida pelo comando ls
e cujo padrão é 1kB. Existem 2 blocos de 4kB alocados para conter os dados do arquivo, portanto, o tamanho alocado para o arquivo é 8kB.
Sua confusão pode ser devida a duas coisas. Primeiro, a figura de 2048 bytes para um bloco é possível, mas não é o valor padrão no Ubuntu (ou distribuições mais modernas), e aparentemente não é o valor em seu sistema. Você pode verificar o tamanho do bloco executando tune2fs -l /dev/sdz42
(use o caminho real para o seu dispositivo de sistema de arquivos).
Em segundo lugar, os arquivos esparsos consistem em não armazenar blocos feitos inteiramente de zeros. Se um bloco (que é necessariamente alinhado em um limite de tamanho de bloco, pelo menos para a maioria dos sistemas de arquivos incluindo ext4) contém zeros e outras coisas, então o bloco completo é armazenado no disco. Assim, nesse arquivo de 40012 bytes (como você chegou a 40013, a propósito), existem 4 blocos não armazenados todos os zero, então um bloco armazenado contendo hello
rodeado por zeros, então mais 4 todos os zeros blocos não armazenados e um bloco parcial final contendo zeros e there
.
Observe que seu utilitário pode ser escrito em termos de comandos padrão do shell:
n=20000
while IFS= read -r line; do
dd bs=1 seek=$n </dev/null
echo "$line"
done >testfile