Come posso aumentare il numero di inode in un filesystem ext4?


61

Ho avuto un problema (nuovo per me) la scorsa settimana. Ho un filesystem ext4 (Fedora 15). L'applicazione in esecuzione sul server si è interrotta improvvisamente. Non riuscivo a trovare il problema a prima vista.

dfha mostrato il 50% di spazio disponibile. Dopo aver cercato per circa un'ora ho visto un post sul forum in cui il ragazzo ha usato df -i. L'opzione cerca l'utilizzo degli inode. Il sistema era privo di inode, un semplice problema che non avevo realizzato. La partizione aveva solo inode 3.2M.

Ora, le mie domande sono: posso fare in modo che il sistema abbia più inode? Dovrebbe / può essere impostato durante la formattazione del disco? Con gli inode 3.2M, quanti file posso avere?


1
Ogni file o directory utilizza un inode. Un collegamento reale a un file non crea un inode. en.wikipedia.org/wiki/Inode
Paul Tomblin

Risposte:


33

Sembra che tu abbia molti più file del previsto.

Non so se esiste una soluzione per modificare dinamicamente le dimensioni della tabella degli inode. Temo che sia necessario eseguire il backup dei dati, creare un nuovo file system e ripristinare i dati.

Per creare un nuovo filesystem con una tabella di inode così grande, devi usare l'opzione '-N' di mke2fs (8).

Consiglio di usare prima l'opzione '-n' (che non crea la fs, ma mostra le informazioni utili) in modo da poter ottenere il numero stimato di inode. Quindi, se necessario, usa '-N' per creare il tuo filesystem con un numero di inode specifico.


11
È possibile utilizzare mke2fs -iper specificare il numero di inode. La sua documentazione indica che "non è possibile espandere il numero di inode su un filesystem dopo che è stato creato".
Gilles 'SO- smetti di essere malvagio' il

2
@piovisqui: ogni file consuma sull'inode, che è un puntatore nel filesystem. se il file è un collegamento reale a un altro file ha lo stesso inode.
Hanan N.

6
@Gilles Le -iopzioni specificano la dimensione dell'inode, non quante ce ne sono. L' -Nopzione imposta gli inode numerici.
theillien,

1
La relazione tra inode e numeri di file non è necessariamente 1: 1. Il primo inode contiene un elenco di puntatori ai blocchi in cui è archiviato il file. Se l'elenco dei blocchi non può rientrare in un inode, l'inode contiene un elenco di puntatori agli inode che elencano i blocchi in cui è archiviato il file. Se non si adatta lì, va in profondità 3 serie di inode per
quell'elenco

2
@StuWhitby Non è proprio vero. Un singolo inode ha diversi puntatori diretti e un singolo, doppio e triplo puntatore indiretto. Se l'elenco di blocchi non può rientrare nei puntatori diretti, il singolo puntatore indiretto punterà a un blocco di dati (NON un altro inode) che contiene più puntatori. Se sono necessari più puntatori di quelli necessari, il doppio puntatore indiretto punta su un blocco che contiene singoli puntatori indiretti e il triplo indiretto su un blocco con doppio puntatore indiretto. Quindi, in effetti, un file usa solo un inode, indipendentemente dalle dimensioni.
user125355

11

Come ulteriore soluzione, potrei suggerire di prendere in considerazione la raccolta di enormi raccolte di file in un tararchivio non compresso (!) E quindi di utilizzarlo archivemountper montarlo come file system. Un archivio tar è migliore per la condivisione di un'immagine del filesystem e offre prestazioni simili quando si esegue il backup su un cloud o un altro archivio.


Se la raccolta dovrebbe essere di sola lettura, squashfspuò essere un'opzione, ma richiede alcune opzioni abilitate nel kernel e la xzcompressione è disponibile anche per tar con le stesse prestazioni.


2
Bel suggerimento.
piovisqui,

11

Con 3,2 milioni di inode, puoi avere 3,2 milioni di file e directory, in totale (ma più collegamenti fissi a un file usano un solo inode).

Sì, può essere impostato durante la creazione di un filesystem sulla partizione. Le opzioni -T usage-type, -N number-of-inodeso -i bytes-per-inodepossono tutte impostare il numero di inode. In genere uso -i, dopo aver confrontato l'output di du -se find | wc -lper una raccolta simile di file e aver consentito un po 'di gioco.

No, non può essere modificato sul posto su un filesystem esistente. Però:

  • Se stai eseguendo LVM o il filesystem si trova su un LUN di SAN (o direttamente sul LUN o come ultima partizione sul LUN), oppure hai spazio vuoto sul disco dopo la partizione, puoi espandere la partizione e quindi usare resize2fsper espandere il filesystem. Ciò aggiunge più inode in proporzione allo spazio aggiunto, approssimativamente. Se si desidera evitare l'esaurimento degli inode prima dello spazio presupponendo che i file futuri abbiano in media le stesse dimensioni, impostare una percentuale di blocco riservata abbastanza elevata utilizzando tune2fs -m.
  • Se hai abbastanza spazio e puoi portare offline il filesystem, quindi portalo offline, crea un nuovo filesystem con più inode e copia tutti i file.
  • Se solo un sottoinsieme dei file utilizza molti inode e hai abbastanza spazio libero, crea un filesystem su un dispositivo loop supportato da un file sul filesystem, crea un filesystem con più inode (e forse anche blocchi più piccoli) su di esso e spostare le directory offensive in esso. Questo è probabilmente un successo di prestazioni e una seccatura di manutenzione, ma è un'alternativa.
  • E ovviamente, se puoi eliminare molti file non necessari, anche questo dovrebbe aiutare.

6

Ho una soluzione alternativa per questa situazione. Diciamo che hai 1000 inode in una partizione di 10G. Ma a causa del limite di inode non si suppone di utilizzare tutto lo spazio della partizione . Ma in queste soluzioni sarai in grado di utilizzare lo spazio rimanente della partizione senza formattarlo .

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

per montaggio permanente

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
Benvenuto in U&L. Mi sono preso la libertà di riformattare la tua risposta alla rappresentazione più abituale del codice qui, inserendo un prompt ( $) per distinguere chiaramente tra comandi e output (se fossero solo comando, il prompt è normalmente escluso). Ho anche cambiato SHOUTING nell'enfasi enfasi della fase, che è quello che penso tu abbia voluto. Puoi annullare le modifiche se travisassi le cose
Anthon,

Penso che questa soluzione abbia una logica, ma è necessario gestire le dimensioni quando si esegue dd.
Piovisqui,

3
I dettagli sono errati, avresti bisogno di usare un dispositivo loop e forse anche unionfs a seconda dell'applicazione, ma questa è l'unica soluzione che evita la formattazione e il ripristino dal backup che non è divertente quando si ha fretta con milioni di file. Ci sono circostanze in cui questo potrebbe salvare la giornata!
medoc

6

Di recente si è verificato questo problema durante l'utilizzo dell'aggiornamento apt o aptitude.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Comando emesso:

du /|sort -k1 -n

La maggior parte dei file rivelati erano nelle sottocartelle per diverse versioni del kernel all'interno di:

/usr/src/linux-headers

Rimosse quelle sottocartelle e il problema con l'inode era risolto.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

"du / | sort -k1 -n" mostra gli inode?
Orfani,

No. Era quello di ordinare le directory, mostrando quali avevano il maggior numero di file, cartelle che consumavano molti inode ma meno utilizzo dello spazio effettivo: la situazione del 30% di spazio libero su disco e del 100% di utilizzo degli inode mostrata sopra.
kph0x1

Sinceramente non capisco come "du" abbia mostrato quanti file ci sono con qualsiasi flag? Potresti spiegare più in dettaglio?
Orfani,

Nessun flag per il ducomando. L'uso è per la radice del file system nell'esempio sopra, guardando solo allo spazio. L'output viene reindirizzato per ordinare in modo da mostrare quali directory contengono la maggior parte dei file. Nell'esempio sopra riportato non viene conteggiato un numero di file, la parte "quanti file" della domanda. I sorgenti del kernel erano però i colpevoli mostrati dunell'output; ad esempio, molti piccoli file, sottocartelle delle compilazioni passate, la cosa ideale per la rimozione per liberare gli inode. Resta ancora una revisione manuale, umana dudell'output, /usr/src/linux-headersera quindi ovvio.
kph0x1,

1
du mostra SOLO byte, non file. E stai eseguendo il piping dell'output solo dal comando du in ordine. Quindi come fa l'ordinamento -k1 -n a ordinare l'output nel modo in cui hai proposto? L'unica cosa che posso vedere è che "du / | sort -k1 -n" ordina solo ogni riga in base alla dimensione in byte. Nient'altro
Orphans

2

prova du -s --inodes * 2>/dev/null |sort -gil cd nell'ultima directory in uscita e ripeti.

Divulgazione completa: non tutti i --inodesflag di supporto del SO per du command (il mio Mac OS no) ma molti SO Linux lo fanno.

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.