Uso de disco na saída stat e inode

1

Abaixo está minha saída de estatística:

[alankoh@SJOAM swap]$ stat myswapfile 
  File: 'myswapfile'
  Size: 2147483648  Blocks: 4194312    IO Block: 4096   regular file
Device: fd03h/64771d    Inode: 1179650     Links: 1
Access: (0600/-rw-------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2015-08-06 16:22:28.672852866 +0800
Modify: 2015-07-02 07:39:04.781064916 +0800
Change: 2015-07-02 07:39:04.809064917 +0800

Os blocos alocados (4194312) incluem o tamanho do próprio inode ou se referem à parte "dados reais"?

Como encontramos um tamanho do inode acima?

the size of the physical block is 512 x 4194312 blocks allocated = 2147487744 bytes

the size of of the file is 2147483648 bytes

2147487744 - 2147483648 = 4096 bytes

4096 bytes = IO Block

Como o cálculo relacionado acima está relacionado ao Bloco IO? é E / S Bloquear a unidade de alocação cada vez que um arquivo precisar de espaço? 4096 = 8 blocos x 512 bytes?

    
por Noob 06.08.2015 / 19:20

2 respostas

0

Use o tune2fs para determinar o tamanho do inode do sistema de arquivos.

$ df -k /
Filesystem     1K-blocks    Used Available Use% Mounted on
/dev/sda1        9156984 7509468   1159324  87% /
$ tune2fs -l /dev/sda1|grep "^Inode size:"
Inode size:               256
$
    
por 06.08.2015 / 20:28
0

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]).

    
por 07.08.2015 / 10:26