Der Grund für das Problem
Es stellt sich heraus, wie XFS Inodes zuweist. Im Gegensatz zu den meisten Dateisystemen erfolgt die Zuordnung dynamisch, wenn neue Dateien erstellt werden. Sofern Sie nichts anderes angeben, sind Inodes jedoch auf 32-Bit-Werte beschränkt. Dies bedeutet, dass sie in das erste Terabyte des Speichers im Dateisystem passen müssen. Wenn Sie also dieses erste Terabyte vollständig ausfüllen und dann die Festplatte vergrößern, können Sie immer noch keine neuen Dateien erstellen, da die Inodes nicht auf dem neuen Speicherplatz erstellt werden können.
Lösung 1 - Mount-Optionen ändern
Eine Lösung besteht darin, das Dateisystem mit der Einhängeoption neu einzuhängen inode64
. Einige Anwendungen (z. B. MySQL) verhalten sich jedoch komisch, und NFS ist sehr verwirrt. Wenn Sie nicht sicher sind, ob Ihr System mit dieser Option funktioniert, können Sie mit der nächsten Option fortfahren.
Lösung 2 - Dateien verschieben
Die zweite Lösung besteht darin, einige der Dateien zu finden, die derzeit im ersten Terabyte gespeichert sind, und sie in einen anderen Bereich des Dateisystems zu verschieben.
Umzug nach Alter
In unserem Fall war dies einfach - das Dateisystem war jahrelang in Gebrauch, sodass wir einfach die ältesten Dateien finden und sie aus dem Dateisystem entfernen und dann zurückschieben konnten. Dies war einfach mit find möglich:
find /extra -mindepth 3 -maxdepth 3 -type d -mtime +730 -exec du -sh {} \; > /tmp/olddirs.txt
gaben uns eine Liste mit der Größe und dem Verzeichnisnamen für alle Verzeichnisse auf genau 3 Ebenen unterhalb des Einhängepunkts, die älter als 2 Jahre waren. Wir könnten dann die Liste sortieren, um die größten Verzeichnisse zu finden und mv
sie in ein anderes Dateisystem und wieder zurück zu verschieben.
Umzug nach Zuordnungsgruppe
Wenn Sie nicht einfach nach Alter gehen können, z. B. wenn viele Dateien gleichzeitig erstellt wurden, können Sie immer noch die richtigen Dateien zum Verschieben finden, aber es dauert etwas länger.
XFS hat Zuordnungsgruppen (aka AG s), beginnend mit 0. Sie können die Blockgröße und die Anzahl der Blöcke jeder AG sind auf der ersten Terabyte , welche Gruppen , um herauszufinden , zu überprüfen, verwenden xfs_info /path/to/mountpoint
. Oder Sie können einfach die ersten AGs überprüfen, um festzustellen, welche voll sind, und diese dann löschen.
- Überprüfen des freien Speicherplatzes in den ersten vier AGs:
für ag in `seq 0 1 5`; Echo-Freiraum in AG $ ag; xfs_db -r -c "freesp -s -a $ ag" / dev / CACHE / CACHE; grep "total frei"; getan
Wenn der gesamte freie Speicherplatz in einer Gruppe weniger als 40 beträgt, können Sie keine neuen Dateien darin erstellen.
- Finden Sie Dateien in dieser AG
Dies erfordert die Überprüfung der Metadaten für jede Datei im Dateisystem. Es wird lange dauern ... Hier ist ein Vorschlag:
find / extra -mindepth 3 -type f -exec xfs_bmap -v {} \; > /tmp/agfilelist.txt
Sie können dann nach " 0 "
(das ist ein Leerzeichen, eine Null und ein anderes Leerzeichen) suchen, um alle Dateien auf AG 0 " 1 "
zu finden, nach den Dateien auf AG 1 suchen, usw. ... Beginnen Sie mit AG 0, und verschieben Sie die größten Dateien mit mv
nicht cp
!) und dann wieder zurück. Wiederholen Sie diesen Vorgang, bis genügend Speicherplatz frei ist.
Ergebnis
Sobald wir genug Dateien von / extra und dann wieder zurück verschoben hatten, war in AG 0 viel Platz und es war wieder möglich, neue Dateien zu erstellen.