Como usar o novo recurso Ext4 Inline Data? (armazenando dados diretamente no inode)

6

Se eu leio a documentação do Ext4 corretamente, a partir do Linux 3.8, deve ser possível armazenar dados diretamente no inode no vaso de um arquivo muito pequeno.

Eu esperava que esse arquivo tivesse um tamanho de 0 blocos, mas não é o caso.

#creating a small file
printf "abcde" > small_file

#checking size of file in bytes
stat --printf='%s\n' small_file
5

#number of blocks used by files
stat --printf='%b\n' small_file
8

Espero que este último número seja 0. Estou com saudades de algo?

    
por Manu 21.04.2015 / 16:02

2 respostas

3

Para ativar os dados em linha em ext4 , você precisará e2fsprogs 1.43 ou posterior. O suporte para dados incorporados foi adicionado em março de 2014 ao repositório git , mas foi lançado somente em Maio de 2016.

Depois de ter isso, você pode executar mke2fs -O inline_data em um dispositivo apropriado para criar um novo sistema de arquivos com suporte de dados embutido; isso apagará todos os seus dados . Aparentemente, ainda não é possível ativar dados em linha em um sistema de arquivos existente (pelo menos, tune2fs não suporta isso).

Agora crie um arquivo pequeno e execute debugfs no sistema de arquivos. cd para o diretório apropriado e execute stat smallfile ; você vai ter algo parecido com

Inode: 32770   Type: regular    Mode:  0644   Flags: 0x10000000
Generation: 2302340561    Version: 0x00000000:00000001
User:  1000   Group:  1000   Size: 6
File ACL: 0    Directory ACL: 0
Links: 1   Blockcount: 0
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x553731e9:330badf8 -- Wed Apr 22 07:30:17 2015
 atime: 0x553731e9:330badf8 -- Wed Apr 22 07:30:17 2015
 mtime: 0x553731e9:330badf8 -- Wed Apr 22 07:30:17 2015
crtime: 0x553731e9:330badf8 -- Wed Apr 22 07:30:17 2015
Size of extra inode fields: 28
Extended attributes:
  system.data (0)
Size of inline data: 60

Como você pode ver, os dados foram armazenados em linha. Isso também pode ser visto usando df ; antes de criar o arquivo:

% df -i /mnt/new 
Filesystem                           Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg--large--mirror-inline  65536    12 65524    1% /mnt/new
% df /mnt/new 
Filesystem                           1K-blocks  Used Available Use% Mounted on
/dev/mapper/vg--large--mirror-inline   1032088  1280    978380   1% /mnt/new

Depois de criar o arquivo:

% echo Hello >| smallfile
% ls -l
total 1
-rw-r--r-- 1 steve steve 6 Apr 22 07:35 smallfile
% df -i /mnt/new
Filesystem                           Inodes IUsed IFree IUse% Mounted on
/dev/mapper/vg--large--mirror-inline  65536    13 65523    1% /mnt/new
% df /mnt/new
Filesystem                           1K-blocks  Used Available Use% Mounted on
/dev/mapper/vg--large--mirror-inline   1032088  1280    978380   1% /mnt/new

O arquivo está lá, ele usa um inode, mas o espaço de armazenamento disponível não mudou.

    
por 22.04.2015 / 07:37
1

Se a versão e2fsprogs for muito antiga ou o sistema de arquivos já estiver criado, você poderá definir o sinalizador de recurso usando debugfs (o sinalizador é suportado desde 2012, enquanto mke2fs e outras ferramentas adicionaram suporte em 2014 + e muitas distribuições ainda não são enviadas em 2016, incluindo o Ubuntu Xenial).

Para fazer isso, abra a partição no modo de leitura / gravação:

debugfs -w /dev/sdxx

Em seguida, adicione o sinalizador:

feature inline_data

(ou feature -inline_data para desativá-lo, mas provavelmente é uma péssima ideia se já existem arquivos embutidos!)

Observe, no entanto, se o seu sistema e2fsprogs é antigo, você estará se colocando em um canto, já que os utilitários (incluindo o debugfs ) se recusarão a tocar em um sistema de arquivos depois de definir o sinalizador.

Observe também que o GRUB (2.02) atual não suporta isso, portanto, configurá-lo na partição de inicialização tornará o sistema não inicializável. Existe um patch não mesclado para adicionar suporte.

No momento da redação deste artigo, arquivos e diretórios de até inode_size-128 podem ser embutidos, portanto, 128 bytes para os inodes padrão de 256 bytes. Você pode usar inodes maiores se quiser mais inlining.

    
por 11.09.2016 / 22:57

Tags