¿Cómo utilizar la nueva función de datos en línea Ext4? (almacenando datos directamente en el inodo)

9

Si leo la documentación de Ext4 correctamente, a partir de Linux 3.8, debería ser posible almacenar datos directamente en el inodo en el florero de un archivo muy pequeño.

Esperaba que dicho archivo tuviera un tamaño de 0 bloques, pero no es el 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

Esperaría que este último número aquí sea 0. ¿Me estoy perdiendo algo?

Manu
fuente
1
Probablemente es una opción de sistema de archivos que debe habilitarse durante la creación del sistema de archivos, para evitar problemas si eventualmente montara el sistema de archivos con un núcleo más antiguo.
wurtel

Respuestas:

7

Para habilitar los datos en línea ext4, necesitará e2fsprogs1.43 o posterior. El soporte para los datos en línea se agregó en el gitrepositorio en marzo de 2014, pero solo se lanzó en mayo de 2016.

Una vez que tenga eso, puede ejecutar mke2fs -O inline_dataen un dispositivo apropiado para crear un nuevo sistema de archivos con soporte de datos en línea; Esto borrará todos sus datos . Aparentemente todavía no es posible activar datos en línea en un sistema de archivos existente (al menos, tune2fsno lo admite).

Ahora cree un archivo pequeño y ejecútelo debugfsen el sistema de archivos. cdal directorio apropiado y ejecute stat smallfile; obtendrás 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 puede ver, los datos se almacenaron en línea. Esto también se puede ver usando df; antes de crear el archivo:

% 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

Después de crear el archivo:

% 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

El archivo está allí, usa un inodo pero el espacio de almacenamiento disponible no ha cambiado.

Stephen Kitt
fuente
4

Si su e2fsprogsversión es demasiado antigua, o el sistema de archivos ya está creado, puede configurar el indicador de función usando debugfs(el indicador es compatible desde 2012, mientras que mke2fsotras herramientas agregaron soporte en 2014+ y muchas distribuciones aún no se envían en 2016 , incluido Ubuntu Xenial).

Para hacerlo, abra la partición en modo lectura-escritura:

debugfs -w /dev/sdxx

Y luego agregue la bandera:

feature inline_data

(o feature -inline_datapara desactivarlo, ¡pero esa es probablemente una muy mala idea si ya hay archivos en línea!)

Sin embargo, tenga en cuenta que si su sistema e2fsprogses antiguo, se está arrinconando, ya que las utilidades (incluido él debugfsmismo) se negarán a tocar dicho sistema de archivos después de configurar la bandera.

También tenga en cuenta que current GRUB(2.02) no es compatible con esto, por lo que configurarlo en la partición de arranque hará que el sistema no se pueda arrancar. Hay un parche no combinado para agregar soporte.

Al momento de escribir esto, los archivos y directorios de hasta inode_size-128pueden estar en línea, por lo que 128 bytes para los inodos predeterminados de 256 bytes. Puede usar inodos más grandes si desea más alineación.

Ventilador en línea
fuente