Comment utiliser la nouvelle fonctionnalité Ext4 Inline Data? (stockage des données directement dans l'inode)

9

Si je lis correctement la documentation Ext4, à partir de Linux 3.8, il devrait être possible de stocker des données directement dans l'inode dans le vase d'un très petit fichier.

Je m'attendais à ce qu'un tel fichier ait une taille de 0 bloc, mais ce n'est pas le cas.

#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

Je m'attends à ce que ce dernier numéro soit 0. Suis-je en train de manquer quelque chose?

Manu
la source
1
Il s'agit probablement d'une option de système de fichiers qui doit être activée lors de la création du système de fichiers, pour éviter les problèmes s'il vous arrivait de monter le système de fichiers avec un noyau plus ancien ultérieurement.
wurtel

Réponses:

7

Pour activer les données en ligne ext4, vous devez avoir la version e2fsprogs1.43 ou ultérieure. Prise en charge des données en ligne a été ajoutée en Mars 2014 le gitdépôt , mais n'a été publié en mai ici 2016.

Une fois que vous avez cela, vous pouvez exécuter mke2fs -O inline_datasur un périphérique approprié pour créer un nouveau système de fichiers avec prise en charge des données en ligne; cela effacera toutes vos données . Il n'est apparemment pas encore possible d'activer des données en ligne sur un système de fichiers existant (au moins, tune2fsne le prend pas en charge).

Créez maintenant un petit fichier et exécutez-le debugfssur le système de fichiers. cddans le répertoire approprié et exécutez stat smallfile; vous obtiendrez quelque chose comme

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

Comme vous pouvez le voir, les données ont été stockées en ligne. Cela peut également être vu en utilisant df; avant de créer le fichier:

% 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

Après avoir créé le fichier:

% 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

Le fichier est là, il utilise un inode mais l'espace de stockage disponible n'a pas changé.

Stephen Kitt
la source
4

Si votre e2fsprogsversion est trop ancienne ou que le système de fichiers est déjà créé, vous pouvez définir l'indicateur de fonctionnalité à l'aide de debugfs(l'indicateur est pris en charge depuis 2012, tandis mke2fsque les autres outils ont ajouté la prise en charge sur 2014+ et de nombreuses distributions ne les expédient toujours pas en 2016 , y compris Ubuntu Xenial).

Pour ce faire, ouvrez la partition en mode lecture-écriture:

debugfs -w /dev/sdxx

Et puis ajoutez le drapeau:

feature inline_data

(ou feature -inline_datapour le désactiver, mais c'est probablement une très mauvaise idée s'il existe déjà des fichiers en ligne!)

Notez cependant que si votre système e2fsprogsest ancien, vous vous retrouvez dans un coin, car les utilitaires (y compris debugfslui-même) refuseront de toucher un tel système de fichiers après avoir défini l'indicateur.

Notez également que la version actuelle GRUB(2.02) ne prend pas en charge cela, donc le définir sur la partition de démarrage rendra le système impossible à démarrer. Il existe un correctif non fusionné pour ajouter la prise en charge.

Au moment d'écrire ces lignes, les fichiers et répertoires de jusqu'à inode_size-128peuvent être alignés, donc 128 octets pour les inodes de 256 octets par défaut. Vous pouvez utiliser des inodes plus grands si vous voulez plus d'inlining.

Ventilateur intégré
la source