Perché il kernel di Linux segnala "spazio su disco insufficiente" quando in realtà è privo di i-nodi


10

Un mio amico a cui piace programmare in ambiente Linux, ma non sa molto dell'amministrazione di Linux recentemente ha riscontrato un problema in cui il suo sistema operativo (Ubuntu) riportava "spazio su disco insufficiente sul volume XXX". Ma quando è andato a controllare il volume, restavano ancora 700 GB. Dopo aver perso molto tempo, alla fine è stato in grado di capire che era fuori dagli inode. (Stava memorizzando molti piccoli aggiornamenti incrementali da un sistema di backup su questo volume e ha bruciato tutti i suoi inode.)

Mi ha chiesto perché il kernel Linux ha segnalato il messaggio di errore ("spazio su disco insufficiente") invece di riportare correttamente ("out of inode"). Non lo sapevo, quindi ho pensato di chiedere a StackExchange.

Qualcuno sa perché questo accade? e perché non è stato risolto dopo tutti questi anni? (Ricordo un altro amico che mi parlava di questo problema nel 1995.)

Risposte:


18

Un singolo numero di errore ENOSPC, viene utilizzato per segnalare entrambe le situazioni, quindi lo stesso messaggio di errore.

Per mantenere la conformità con gli standard ISO Ce POSIX, gli sviluppatori del kernel non hanno altra scelta che utilizzare un singolo numero di errore per entrambi gli eventi. L'aggiunta di un nuovo numero di errore interromperebbe i programmi esistenti.

Tuttavia, poiché attenersi ai tradizionali messaggi di errore non è obbligatorio AFAIK, nulla dovrebbe impedire a uno sviluppatore di rendere più chiaro il singolo messaggio, come ad esempio out of disk/inode space

Tecnicamente, se essere fuori dallo spazio di inode o dallo spazio di dati è lo stesso, significa che non c'è abbastanza spazio libero su disco per il successo della chiamata di sistema.

Suppongo che non ti lamenterai se il tuo disco viene segnalato come pieno mentre ci sono ancora slot di inode gratuiti.

Si noti che i file system piace JFS, XFS, ZFSe btrfsallocano inode dinamicamente in modo da fare non presentano questo problema più.


I filesystem recenti includono ext4?
Camilo Martin,

@CamiloMartin Non credo.
jlliagre,

@CamiloMartin Purtroppo no, ext4alloca gli inode al momento della creazione di fs come ext2 / 3 e non può essere modificato in seguito.
Matt,

@mindthemonkey Darn! Probabilmente è una questione di compatibilità con le versioni precedenti, immagino. Quale altro filesystem ha delle belle funzioni ma è abbastanza stabile (btrfs è stabile)? ext4 sembra essere una sorta di "scelta predefinita" (almeno dalla mia prospettiva da principiante).
Camilo Martin,

1
Sì, gli ext sono sempre stati estensioni della versione precedente e retrocompatibili, quindi nessun cambiamento importante, ma ciò significa che è rimasto abbastanza solido e stabile. Personalmente faccio tutto il mio grande volume di archiviazione su scatole freebsd con ZFS. BTRFS è ancora considerato "instabile", anche se la maggior parte delle distribuzioni ti permetterà almeno di usarlo.
Matt,

2

Suppongo che il tuo amico stia usando un ext fs, perché è uno dei pochi fs sensibili che può rimanere senza inode.

Sembrerebbe che il tuo amico abbia armeggiato con il suo filesystem e lo abbia rotto o abbia un volume ridicolmente grande di diversi TB. Gli Inodi non sono una cosa da usare una volta sola. Se ha davvero finito gli inode, significa che ha ridicolmente molti file e directory ... che può accadere su un volume> 4 TB (ipotesi plausibile), dove "solo" 700 GB sono gratuiti. Per la famiglia ext di fs il numero di inode viene determinato al momento della creazione di fs. Dalla mkfs.ext4pagina man:

-i bytes-per-inode
          Specify  the  bytes/inode ratio.  mke2fs creates an inode for every bytes-per-inode
          bytes of space on the disk.  The larger the bytes-per-inode ratio, the fewer inodes
          will  be  created.  This value generally shouldn't be smaller than the blocksize of
          the filesystem, since in that case more inodes would be made than can ever be used.
          Be  warned  that  it is not possible to expand the number of inodes on a filesystem
          after it is created, so be careful deciding the correct value for this parameter.

Per abbreviare il resto di questa risposta: Questo significa che mkfsviene fornito con un tale rapporto, o ne assumerà uno. Se il tuo amico usa le fs in modo diverso da quanto ipotizzato, il rapporto scelto potrebbe essere errato per il suo caso d'uso e ottiene quell'errore ... riempire un singolo volume multi-TB con tonnellate di piccoli file può essere considerato tale.

Il tuo amico usa un ambiente desktop che implementa il concetto di "cestino" per i file o qualsiasi altra forma di backup che può creare grandi quantità di file? Forse può risolvere il suo problema semplicemente eliminando i file non necessari.

Ricordo questo problema con ext2 dal momento in cui il kernel 2.4 era abbastanza nuovo. Come regola generale, uso sempre XFS per volumi molto grandi rispetto a ciò che è attualmente comune. Attualmente chiamerei qualsiasi cosa tra 250 GB a 1 TB comune per un singolo volume e possiamo acquistare HDD da 4 TB. Quindi per tutto> 3 TB preferirei usare XFS piuttosto che ext. Solo una regola empirica, ma non si esauriscono gli inode da molto tempo ...


1
Temo che tu non stia rispondendo alla domanda posta.
jlliagre,

Vero. Stavo cercando di rispondere alla prima domanda in linea che ho premuto "Qualcuno sa perché questo accade?", Ma non quello nel titolo.
Bananguin,

Giusto. Il mio amico sa cosa è successo. Stava facendo una sorta di sistema di backup in cui stava memorizzando cambiamenti incrementali non compressi (né TAR) in modo che ci fossero tutti questi piccoli file che occupavano spazio. Non penso che abbia mai avuto un FS così grande in precedenza, quindi a corto di inode è stata una novità per lui. Ergo, era frustrato quando digitava "df -h" e pensava "eh, mi resta ancora un sacco di spazio" - Francamente, sono d'accordo con lui. Per il kernel dire "fuori dallo spazio", quando in realtà dovrebbe avere un messaggio separato "fuori dagli inode" è molto confuso.
Pretzel,

@Bananguin - Sai qual è il rapporto byte / inode predefinito?
Pretzel,

@Pretzel: penso di ricordare che il valore predefinito è un inode per ogni 4K. Ho appena controllato il mio computer ( tune2fs -l /dev/sda1) e mi è capitato di avere un rapporto di 1 inode per ogni quattro blocchi e ogni blocco ha una dimensione di 1k. Quanto possa essere considerato "predefinito", tuttavia, non lo so.
Bananguin,
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.