Benvenuto,
Ospite
|
ARGOMENTO:
Allocazione inode e datablock 4 Anni 5 Mesi fa #1
|
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.
|
Moderatori: Francesco.Alo, jpalombi