Come utilizzare la nuova funzionalità di dati in linea Ext4? (memorizzazione dei dati direttamente nell'inode)


9

Se ho letto correttamente la documentazione di Ext4, a partire da Linux 3.8 dovrebbe essere possibile archiviare i dati direttamente nell'inode nel vaso di un file molto piccolo.

Mi aspettavo che un file simile avesse una dimensione di 0 blocchi, ma non è così.

#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

Mi aspetto che l'ultimo numero qui sia 0. Mi sto perdendo qualcosa?


1
È probabilmente un'opzione del filesystem che deve essere abilitata durante la creazione del filesystem, per evitare problemi se si dovesse montare il filesystem con un kernel più vecchio in un secondo momento.
wurtel,

Risposte:


7

Per abilitare i dati in linea ext4, dovrai e2fsprogs1.43 o versioni successive. Il supporto per i dati in linea è stato aggiunto marzo 2014 per il gitrepository , ma è stato rilasciato solo maggio 2016.

Una volta ottenuto ciò, è possibile eseguire mke2fs -O inline_datasu un dispositivo appropriato per creare un nuovo file system con supporto dati inline; questo cancellerà tutti i tuoi dati . Apparentemente non è ancora possibile attivare i dati inline su un filesystem esistente (almeno, tune2fsnon lo supporta).

Ora crea un piccolo file ed eseguilo debugfssul filesystem. cdnella directory appropriata ed eseguire stat smallfile; otterrai qualcosa del genere

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

Come puoi vedere, i dati sono stati memorizzati in linea. Questo può anche essere visto usando df; prima di creare il file:

% 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

Dopo aver creato il file:

% 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

Il file è lì, usa un inode ma lo spazio di archiviazione disponibile non è cambiato.


4

Se la tua e2fsprogsversione è troppo vecchia o il filesystem è già stato creato, puoi impostare il flag delle funzionalità utilizzando debugfs(il flag è supportato dal 2012, mentre mke2fse gli altri strumenti hanno aggiunto il supporto su 2014+ e molte distribuzioni non li distribuiscono ancora nel 2016 , incluso Ubuntu Xenial).

Per fare ciò, apri la partizione in modalità lettura-scrittura:

debugfs -w /dev/sdxx

E quindi aggiungi la bandiera:

feature inline_data

(o feature -inline_dataper disattivarlo, ma probabilmente è una pessima idea se ci sono già file in linea!)

Nota, tuttavia, se il tuo sistema e2fsprogsè vecchio, stai guidando te stesso in un angolo, poiché le utility (incluso debugfsse stesso) rifiuteranno di toccare un tale file system dopo aver impostato la bandiera.

Si noti inoltre che corrente GRUB(2.02) non supporta questo, quindi impostarlo sulla partizione di avvio renderà il sistema non avviabile. Esiste una patch non unita per aggiungere supporto.

Al momento della stesura di questo documento, è inode_size-128possibile incorporare file e directory fino a , quindi 128 byte per gli inode predefiniti da 256 byte. Puoi usare inode più grandi se vuoi più inline.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.