Wie verwende ich die neue Ext4 Inline Data-Funktion? (Speichern von Daten direkt im Inode)

9

Wenn ich die Ext4-Dokumentation ab Linux 3.8 richtig gelesen habe, sollte es möglich sein, Daten direkt im Inode in der Vase einer sehr kleinen Datei zu speichern.

Ich hatte erwartet, dass eine solche Datei eine Größe von 0 Blöcken hat, aber das ist nicht der Fall.

#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

Ich würde erwarten, dass diese letzte Zahl hier 0 ist. Vermisse ich etwas?

Manu
quelle
1
Es handelt sich wahrscheinlich um eine Dateisystemoption, die während der Erstellung des Dateisystems aktiviert werden muss, um Probleme zu vermeiden, wenn Sie das Dateisystem zu einem späteren Zeitpunkt mit einem älteren Kernel bereitstellen würden.
Wurtel

Antworten:

7

Um Inline-Daten zu aktivieren ext4, müssen Sie e2fsprogs1.43 oder höher sein. Unterstützung für die Inline - Daten wurde im März 2014 hinzugefügt das gitRepository wurde aber erst Mai 2016 veröffentlicht.

Sobald Sie das haben, können Sie mke2fs -O inline_dataauf einem geeigneten Gerät ein neues Dateisystem mit Inline-Datenunterstützung erstellen. Dadurch werden alle Ihre Daten gelöscht . Es ist anscheinend noch nicht möglich, Inline-Daten in einem vorhandenen Dateisystem zu aktivieren (unterstützt dies zumindest tune2fsnicht).

Erstellen Sie nun eine kleine Datei und führen Sie sie debugfsauf dem Dateisystem aus. cdin das entsprechende Verzeichnis und ausführen stat smallfile; Du wirst so etwas bekommen

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

Wie Sie sehen, wurden die Daten inline gespeichert. Dies kann auch mit gesehen werden df; vor dem Erstellen der Datei:

% 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

Nach dem Erstellen der Datei:

% 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

Die Datei ist dort, sie verwendet einen Inode, aber der verfügbare Speicherplatz hat sich nicht geändert.

Stephen Kitt
quelle
4

Wenn Ihre e2fsprogsVersion zu alt ist oder das Dateisystem bereits erstellt wurde, können Sie das Feature-Flag mit setzen debugfs(das Flag wird seit 2012 unterstützt, während mke2fsdie anderen Tools ab 2014 Unterstützung bieten und viele Distributionen sie 2016 noch nicht ausliefern inkl. Ubuntu Xenial).

Öffnen Sie dazu die Partition im Lese- / Schreibmodus:

debugfs -w /dev/sdxx

Und dann fügen Sie die Flagge hinzu:

feature inline_data

(oder feature -inline_dataum es auszuschalten, aber das ist wahrscheinlich eine wirklich schlechte Idee, wenn es bereits Inline-Dateien gibt!)

Beachten Sie jedoch, dass Sie, wenn Ihr System e2fsprogsalt ist, selbst in eine Ecke fahren, da die Dienstprogramme (einschließlich sich debugfsselbst) sich weigern, ein solches Dateisystem nach dem Setzen des Flags zu berühren.

Beachten Sie auch, dass Current GRUB(2.02) dies nicht unterstützt. Wenn Sie es also auf der Boot-Partition festlegen, kann das System nicht mehr gestartet werden. Es gibt einen nicht zusammengeführten Patch , um Unterstützung hinzuzufügen.

Zum Zeitpunkt dieses Schreibens können Dateien und Verzeichnisse von bis inode_size-128zu inline eingefügt werden, also 128 Bytes für die Standard-256-Byte-Inodes. Sie können größere Inodes verwenden, wenn Sie mehr Inlining wünschen.

Inlining Lüfter
quelle