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

9

Se eu li a documentação do Ext4 corretamente, a partir do Linux 3.8, seria 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

Eu esperaria que este último número aqui seja 0. Estou faltando alguma coisa?

Manu
fonte
1
É provavelmente uma opção do sistema de arquivos que precisa ser ativada durante a criação do sistema de arquivos, para evitar problemas se você montar o sistema de arquivos com um kernel mais antigo posteriormente.
wurtel

Respostas:

7

Para ativar os dados embutidos ext4, você precisará e2fsprogs1,43 ou mais tarde. Suporte para dados em linha foi adicionado março 2014 para o gitrepositório , mas só foi lançado em maio de 2016.

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

Agora crie um arquivo pequeno e execute debugfsno sistema de arquivos. cdpara o diretório apropriado e execute stat smallfile; você terá algo como

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.

Stephen Kitt
fonte
4

Se sua e2fsprogsversão é muito antiga ou o sistema de arquivos já foi criado, você pode definir o sinalizador de recurso usando debugfs(o sinalizador é suportado desde 2012, enquanto mke2fsas outras ferramentas adicionaram suporte no 2014+ e muitas distribuições ainda não os enviam em 2016 , incluindo o Ubuntu Xenial).

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

debugfs -w /dev/sdxx

E adicione a bandeira:

feature inline_data

(ou feature -inline_datapara desativá-lo, mas isso provavelmente é uma péssima idéia, se já houver arquivos embutidos!)

Observe, no entanto, que se o seu sistema e2fsprogsfor antigo, você estará se esquivando, pois os utilitários (inclusive o debugfspróprio) se recusarão a tocar nesse sistema de arquivos após definir a sinalização.

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

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

Ventilador embutido
fonte