Login

Benvenuto, Ospite
Nome utente: Password: Ricordami
  • Pagina:
  • 1

ARGOMENTO:

Allocazione inode e datablock 4 Anni 5 Mesi fa #1

  • gica78r
  • Avatar di gica78r Autore della discussione
  • Offline
  • Platinum Member
  • Platinum Member
  • Messaggi: 166
  • Ringraziamenti ricevuti 9
Ciao a tutti,

in merito alle discrepanze osservate oggi negli esempi relativi all'utilizzo del filesystem, ed in particolare al conteggio di inode e blocchi di dati, la spiegazione è piuttosto semplice.

Inode

Partendo dallo stato inziale, in cui la partizione '/dev/sdb1' non è montata, eseguiamone il mount nel mountpoint /opt:
# lsblk --fs
sdb                                                                                           
└─sdb1                ext4        dati  42505318-534a-47a9-b46b-d4370d525260                  

# mount /dev/sdb1 /opt/
sdb                                                                                           
└─sdb1                ext4        dati  42505318-534a-47a9-b46b-d4370d525260      445M     0% /opt

Il filesystem è inizialmente vuoto, e possiamo ottenere informazioni circa blocchi e inode dal corrispondente superblocco, nonché tramite il comando df (l'opzione -i mostra info sugli inode):
# ls -ls /opt/
totale 12
12 drwx------ 2 root root 12288 nov 26 21:34 lost+found

# df -i /opt/
File system     Inode IUsati ILiberi IUso% Montato su
/dev/sdb1      128016     11  128005    1% /opt

# tune2fs -l /dev/sdb1 | grep -E "(Inode count|Block count|Free block|Free inodes)"
Inode count:              128016
Block count:              512000
Free blocks:              485316
Free inodes:              128005

Come si vede, gli inode liberi coincidono in entrambi i casi (128005).

Ora creiamo un semplice file di testo in /opt:
# echo "Hello!" > /opt/hello.txt

e ripetiamo il check sul numero di inode in uso:
# df -i /opt/
File system     Inode IUsati ILiberi IUso% Montato su
/dev/sdb1      128016     12  128004    1% /opt

# tune2fs -l /dev/sdb1 | grep -E "(Inode count|Block count|Free block|Free inodes)"
Inode count:              128016
Block count:              512000
Free blocks:              485316
Free inodes:              128005

I due comandi mostrano valori differenti; in particolare, il superblocco non risulta allineato con lo stato reale del filesystem, del quale abbiamo usato un inode per il nuovo file allocato. Il comando df mostra correttamente che c'è un inode disponibile in meno (128004 invece dei 128005 presenti prima di creare il file hello.txt).

Il motivo di questa discrepanza sta nel fatto che la versione aggiornata del superblocco è mantenuta in memoria, e viene effettivamente riportata sul filesystem solo al momento del umount dello stesso. Le opzioni sync/async in questo caso non hanno effetto sul superblocco; al più influiscono sulle modalità di scrittura dei blocchi di dati. Un eventuale spegnimento improvviso del sistema in questo momento, cioè prima che il filesystem sia smontato correttamente, provocherebbe una inconsistenza, tuttavia il recovery sarebbe estremamente rapido grazie al journal del filesystem (ext4).

Blocchi
Per quanto concerne i blocchi, vale lo stesso discorso. Il superblock del filesystem non è aggiornato in tempo reale sul disco perché la versione aggiornata è quella mantenuta dal kernel in memoria. Tuttavia si era detto che la dimensione del singolo file non poteva essere inferiore alla dimensione del blocco del filesystem (nel caso dell'esempio, il filesystem aveva blocchi di dimensione 1024 byte, ovvero 1kByte). L'output del comando ls, invece, mostrava la dimensione reale del contenuto del file, ovvero pochi byte. Il motivo, in questo caso, è relativo alle opzioni passate al comando ls, che di default mostra la dimensione effettiva del file, ovvero del suo contenuto (in questo caso 7 byte, cioè la lunghezza della stringa Hello! più un byte dovuto al terminatore di riga):
# ls -lh /opt/
totale 13K
-rw-r--r-- 1 root root   7 nov 27 00:10 hello.txt

# od -c /opt/hello.txt 
0000000   H   e   l   l   o   !  \n

Per mostrare la dimensione del file in termini di blocchi del filesystem, è necessario specificare l'opzione -s:
# ls -ls /opt/
totale 13
 1 -rw-r--r-- 1 root root     7 nov 27 00:10 hello.txt

Il numero di blocchi da 1k occupati dal file hello.txt è mostrato nella prima colonna, ed è pari a 1.

Un modo più comodo (ed esplicito) per verificare che effettivamente un file di pochi byte occupa comunque lo spazio di un intero blocco del filesystem è quello di usare il comando du:
# du -h /opt/*
1,0K	/opt/hello.txt

Come si osserva, la dimensione del file hello.txt è esattamente di 1K.

Memorizzazione dati inline (opzionale)
Una particolarità introdotta con ext4, ma in genere non attivata di default, è quella che permette di mantenere i dati di un file direttamente all'interno del corrispondente inode, senza necessariamente allocare un intero blocco di dati qualora lo spazio richiesto dai dati stesso sia molto ridotto. Infatti, in genere per un inode vengono allocati 128 o 256 byte, molti dei quali non vengono utilizzati per memorizzare i metadati. Nell'esempio del nostro filesystem ext4, la dimensione degli inode è ovviamente impostata al momento della formattazione ed è pari a 128 byte:
# tune2fs -l /dev/sdb1 | grep "Inode size"
Inode size:	          128

Tuttavia la funzione <strong>inline_data</strong> non è attiva:
# tune2fs -l /dev/sdb1 | grep "Filesystem features"
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir_nlink extra_isize metadata_csum

Nel nostro esempio, però, non è possibile impostare la feature inline_data su un filesystem esistente (o almeno non si può fare usando tune2fs):
# tune2fs -O inline_data /dev/sdb1 
tune2fs 1.44.5 (15-Dec-2018)
Setting filesystem feature 'inline_data' not supported.

Possiamo però allocare un nuovo filesystem su una nuova partizione, impostanto la feature inline_data al momento della formattazione:
# mke2fs -O inline_data /dev/sdb2 
mke2fs 1.44.5 (15-Dec-2018)
/dev/sdb2 contains a ext4 file system
	last mounted on /mnt on Wed Nov 27 00:52:44 2019
Proceed anyway? (y,N) y
Creating filesystem with 2493184 4k blocks and 623392 inodes
Filesystem UUID: 4f3e9c03-3408-4353-ae14-d626cdfd0557
Superblock backups stored on blocks: 
	32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            
Writing inode tables: done                            
Writing superblocks and filesystem accounting information: done 

# tune2fs -l /dev/sdb2 | grep "features"
Filesystem features:      ext_attr resize_inode dir_index filetype inline_data sparse_super large_file

In questo caso la dimensione dell'inode viene impostata a 256 bytes.

Se ora creiamo un nuovo file contenente pochi caratteri, vedremo che il numero di blocchi occupati dal file sarà comunque zero:
# mount /dev/sdb2 /opt/
...
sdb                                                                                           
├─sdb1                ext4        dati  42505318-534a-47a9-b46b-d4370d525260                  
└─sdb2                ext4              4f3e9c03-3408-4353-ae14-d626cdfd0557      8,9G     0% /opt

# echo "Ciao!" > /opt/ciao.txt

In realtà, anche in questo caso, l'output di ls -ls mostrerà sempre un numero di blocchi allocati diverso da zero. Idem usando il comando stat. L'unico modo per osservare il reale utilizzo di blocchi è attraverso il domando debugfs, invocato sul filesystem in questione, e all'interno della cui console si può eseguire il comando stat:
# debugfs /dev/sdb2 
debugfs 1.44.5 (15-Dec-2018)
debugfs:  stat ciao.txt


Inode: 12   Type: regular    Mode:  0644   Flags: 0x10000000
Generation: 4090753808    Version: 0x00000000:00000001
User:     0   Group:     0   Project:     0   Size: 2
File ACL: 0
Links: 1   Blockcount: 0
Fragment:  Address: 0    Number: 0    Size: 0
 ctime: 0x5dddbc96:b2966a20 -- Wed Nov 27 01:00:22 2019
 atime: 0x5dddbc96:b2966a20 -- Wed Nov 27 01:00:22 2019
 mtime: 0x5dddbc96:b2966a20 -- Wed Nov 27 01:00:22 2019
crtime: 0x5dddbc96:b2966a20 -- Wed Nov 27 01:00:22 2019
Size of extra inode fields: 32
Extended attributes:
  system.data (0)
Size of inline data: 60

Si prega Accedi a partecipare alla conversazione.

Ultima Modifica: da gica78r.
  • Pagina:
  • 1
Moderatori: Francesco.Alojpalombi