La ragione del problema
Il problema è dovuto al modo in cui XFS alloca gli inode. A differenza della maggior parte dei file system, l'allocazione avviene in modo dinamico quando vengono creati nuovi file. Tuttavia, se non diversamente specificato, gli inode sono limitati a valori a 32 bit, il che significa che devono rientrare nel primo terabyte di archiviazione sul file system. Quindi, se hai riempito completamente quel primo terabyte e poi ingrandisci il disco, non saresti ancora in grado di creare nuovi file, poiché gli inode non possono essere creati nel nuovo spazio.
Soluzione 1: modificare le opzioni di montaggio
Una soluzione è reinstallare il file system con l'opzione mount inode64
. Tuttavia alcune applicazioni si comportano in modo strano su questo (ad esempio MySQL) e NFS sarà molto confuso. Quindi, se non sei sicuro che il tuo sistema funzionerà con questa opzione, puoi passare all'opzione successiva.
Soluzione 2: spostare i file
La seconda soluzione è trovare alcuni dei file che sono attualmente memorizzati nel primo terabyte e spostarli in un'altra area del file system.
Muoversi per età
Nel nostro caso, questo è stato facile: il file system era in uso da anni, quindi potevamo semplicemente trovare i file più vecchi e spostarli dal file system, quindi spostarli indietro. Questo è stato fatto facilmente usando find:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
ci ha fornito un elenco contenente le dimensioni e il nome della directory per tutte le directory esattamente a 3 livelli al di sotto del mountpoint, che erano più vecchi di 2 anni. Potremmo quindi ordinare l'elenco per trovare le directory più grandi e utilizzarle mv
per spostarle in un altro file system e viceversa.
Spostamento per gruppo di allocazione
Se non puoi semplicemente andare per età, ad esempio quando sono stati creati molti file contemporaneamente, puoi comunque trovare i file giusti da spostare, ma ci vuole un po 'più di tempo.
XFS ha gruppi di allocazione (aka AG ), che iniziano con 0. È possibile controllare la dimensione e il numero di blocchi di ogni AG per capire quali gruppi si trovano sul primo terabyte, usando xfs_info /path/to/mountpoint
. Oppure puoi semplicemente controllare le prime AG per vedere quali sono piene e quindi cancellarle.
- Verifica dello spazio libero nelle prime quattro AG:
per ag in `seq 0 1 5`; fare eco allo spazio libero in AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total free"; fatto
Se lo spazio libero totale in qualsiasi gruppo è inferiore a 40, non sarà possibile creare nuovi file al suo interno.
- Trova i file in quella AG
Ciò richiede il controllo dei metadati per ciascun file sul filesystem. Ci vorrà molto tempo ... Ecco un suggerimento:
find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Puoi quindi grep per " 0 "
(che è uno spazio, uno zero e un altro spazio) per trovare tutti i file su AG 0, grep per " 1 "
trovare quelli su AG 1, ecc ... Inizia con AG 0, allontana i file più grandi (usando mv
, no cp
!) e poi di nuovo indietro. Ripeti finché non avrai una buona quantità di spazio libero.
Risultato
Una volta spostati abbastanza file da / extra e poi di nuovo indietro, c'era molto spazio in AG 0 ed era ancora possibile creare nuovi file.