Depois de pesquisar o código fonte e o padrão POSIX, eu diria que a resposta de @ antje-me @Gilles está correta.
Vale citar o comentário do POSIX.1-2008 , como um resumo:
O uso de unidades de 512 bytes é prática histórica e mantém a compatibilidade com sl e outros utilitários neste volume do POSIX.1-2008. Isso não exige que o próprio sistema de arquivos seja baseado em blocos de 512 bytes. A opção -k foi adicionada como uma medida de compromisso. Foi acordado pelos desenvolvedores padrão que 512 bytes era a melhor unidade padrão por causa de sua completa consistência histórica no Sistema V (versus o uso misto de 512/1024 bytes em sistemas BSD) e a opção -k para mudar para 1024- unidades de bytes foi um bom compromisso. Os usuários que preferem a quantidade mais lógica de 1024 bytes podem facilmente alias df a df -k sem quebrar muitos scripts históricos que dependem das unidades de 512 bytes.
Para o tamanho do bloco em ls -s
:
O POSIX diz que o tamanho do bloco padrão é definido pela implementação, a menos que a -k
opção seja fornecida.
O tamanho do bloco padrão implementado em GNU coreutils
ls
é definido em GNU gnulib
:
gnulib/lib/human.c
/* The default block size used for output. This number may change in
the future as disks get larger. */
#ifndef DEFAULT_BLOCK_SIZE
# define DEFAULT_BLOCK_SIZE 1024
#endif
que vem de um commit antigo:
commit 96e78d1f64d7c8d2acc5ad27dc3e73b96ae80585
Author: Jim Meyering <[email protected]>
Date: Mon Jun 29 15:23:04 1998 +0000
A própria mensagem de confirmação não disse nada sobre o número 1024.
E observe que o tamanho do bloco usado du
e df
também é 1024, ls
apenas escolheu consistir com eles. Embora para du
e df
seja um conflito com o padrão POSIX (então aqui a variável de ambiente POSIXLY_CORRECT
vem). Parece ser uma decisão da equipe GNU, veja a página da Wikipédia POSIX sobre essa controvérsia.
Para o comando stat
.
Não faz parte do padrão POSIX, mas é a chamada do sistema . No entanto, a unidade para o tamanho do bloco não é padronizada ( sys_stat.h ):stat
A unidade para o membro st_blocks da estrutura stat não está definida no POSIX.1-2008.
O stat
comando simplesmente exibe as informações fornecidas pela stat
chamada do sistema e, usando o tamanho de 512 blocos, com poucas exceções (elas não são Linux, por exemplo, HP-UX, IBM AIX etc., consulte as macros definidas em gnulib/lib/stat-size.h
).
Portanto, o número 512 é mais uma escolha histórica e uma convenção do Linux.
O GNU coreutils
(daí o ls
comando) não faz parte do kernel do Linux (daí a stat
chamada), eles têm como alvo aspectos diferentes do sistema, GNU coreutils
são mais para humanos (mais fáceis de ler) e o kernel do Linux para abstratos de hardware (portanto, mais próximos do hardware).
Edit: o tamanho do bloco 4096 é o tamanho "IO block", o tamanho real do bloco físico provavelmente ainda é de 512 bytes, conforme explicado nesta pergunta .