Ich verwende den folgenden Befehl, um eine große Anzahl von Dateien auf meinem Server zu finden und zu verschieben:
find SomeDir/ -maxdepth 10 -type f -mtime +90 -exec mv {} SomeDir2/ \;
Nach dem Verschieben von etwa 700.000 Dateien erhalte ich diese Fehlermeldung:
mv: cannot move ‘SomeDir/Dir1/Dir2/Dir3/file.jpg.gz’ to ‘SomeDir2/file.jpg.gz’: No space left on device
df -i
hat folgendes Ergebnis:
/dev/sdb1 322125824 144163358 177962466 45% /files
df -h
hat folgendes Ergebnis:
/dev/sdb1 4.8T 3.5T 1.1T 78% /files
Ich mache alle Operationen auf /files
und keine anderen Verzeichnisse
Das Dateisystem ist ext4
.
AKTUALISIEREN
Wie vorgeschlagen, führe ich es aus dmesg -Hwx
und die Ausgabe istEXT4-fs warning (device sdb1): ext4_dx_add_entry:2016: Directory index full!
Antwort1
Sie überschreiten wahrscheinlich den max_dir_size_kb
beim Einhängen des Verzeichnisses festgelegten Wert (oder belassen ihn als Standardwert):
max_dir_size_kb=n This limits the size of the directories so that any attempt to expand them beyond the specified limit in kilobytes will cause an ENOSPC error. This is useful in memory-constrained environments, where a very large directory can cause severe performance problems or even provoke the Out Of Memory killer. (For example, if there is only 512 MB memory available, a 176 MB directory may seriously cramp the system's style.)
( ENOSPC
entspricht der Fehlermeldung No space left on device
mit perror
)
Stellen Sie daher sicher, dass diese Option beim Mounten nicht angegeben wurde (oder mit einer sehr großen Zahl angegeben wurde).
Außerdem Bemerkungen:
- zu viele Dateien in einem Ordner klingt nach keiner guten Idee. Möchten Sie stattdessen vielleicht eine relationale Datenbank? Objektspeicher?
- 4,8 TB: Das ist bei modernen Festplatten keine Seltenheit, aber mal ehrlich: Wenn Sie heutzutage das nächste Mal etwas einrichten, verwenden Sie einen Speicherpool wie LVM. Damit können Sie beispielsweise Snapshots von Live-Systemen erstellen.
Antwort2
Mit den neu gewonnenen Informationen:
Wenn ich also die Zeile 2007 von linux/fs/ext4/namei.c im Git-Tag v3.10 (also Ihrem Kernel) lese, glaube ich, dass Sie Pech haben und Ihr Dateisystem anpassen müssen.
tune2fs -O large_dir /dev/sdb1
sollte es Ihnen ermöglichen, mehr pro Verzeichnis zu haben dx_entries
, aber ehrlich gesagt habe ich das nie gemacht. Machen Sie wie immer Backups.
Stellen Sie sicher, dass Sie Backups haben, oder wenden Sie dies auf ein neues Dateisystem an, in das Sie diese Dateien kopieren, anstatt sie innerhalb desselben Dateisystems zu verschieben. Es klingt vielleicht so, als wäre ich ein XFS-Fanboy (bin ich nicht, es funktioniert einfach), aber ich denke, das klingt wirklich nicht so, als wäre ein nicht optimiertes ext4 ein großartiges Dateisystem für diesen Anwendungsfall.