Kann mir der Speicherplatz ausgehen, wenn ich eine sehr große Anzahl leerer Dateien erstelle?


35

Es ist bekannt, dass leere Textdateien null Bytes haben:

Bildbeschreibung hier eingeben

Jede von ihnen enthält jedoch Metadaten , die nach meinen Recherchen in Inodes gespeichert sind und Platz beanspruchen .

In Anbetracht dessen erscheint es mir logisch, dass es möglich ist, eine Diskette zu füllen, indem lediglich leere Textdateien erstellt werden. Ist das richtig? Wenn ja, wie viele leere Textdateien würde ich benötigen, um eine Festplatte von beispielsweise 1 GB zu füllen?


Um einige Überprüfungen df -idurchzuführen, führe ich einen Lauf durch, aber dies zeigt anscheinend den Prozentsatz der verwendeten Inodes (?), Anstatt wie viel sie wiegen.

Filesystem             Inodes  IUsed    IFree IUse% Mounted on
udev                   947470    556   946914    1% /dev
tmpfs                  952593    805   951788    1% /run
/dev/sda2            28786688 667980 28118708    3% /
tmpfs                  952593     25   952568    1% /dev/shm
tmpfs                  952593      5   952588    1% /run/lock
tmpfs                  952593     16   952577    1% /sys/fs/cgroup
/dev/sda1                   0      0        0     - /boot/efi
tmpfs                  952593     25   952568    1% /run/user/1000
/home/lucho/.Private 28786688 667980 28118708    3% /home/lucho

Antworten:


40

Diese Ausgabe schlägt 28786688insgesamt Inodes vor, nach denen der nächste Versuch, eine Datei im Root-Dateisystem (Gerät /dev/sda2) zu erstellen, zurückgegeben wird ENOSPC("Kein Platz mehr auf dem Gerät").

Erläuterung: Im ursprünglichen * nix-Dateisystemdesign wird die maximale Anzahl von Inodes zum Zeitpunkt der Dateisystemerstellung festgelegt. Ihnen wird ein eigener Platz zugewiesen. Sie können keine Inodes mehr haben, bevor Ihnen der Speicherplatz für Daten ausgeht, oder umgekehrt. Das gebräuchlichste Standard-Linux-Dateisystem unterliegt ext4immer noch dieser Einschränkung. Informationen zu Inode-Größen in ext4 finden Sie in der Manpage für mkfs.ext4.

Linux unterstützt andere Dateisysteme ohne diese Einschränkung. Ein btrfs, Speicherplatz wird dynamisch zugewiesen. "Die Inode-Struktur ist relativ klein und enthält keine eingebetteten Dateidaten oder erweiterten Attributdaten." (ext3 / 4 reserviert etwas Platz in den Inodes für erweiterte Attribute ). Natürlich kann Ihnen immer noch der Speicherplatz ausgehen, wenn Sie zu viele Metadaten / Verzeichniseinträge erstellen.

Wenn Sie darüber nachdenken, ist tmpfs ein weiteres Beispiel, bei dem Inodes dynamisch zugewiesen werden. Es ist schwer zu sagen, was die maximale Anzahl der von gemeldeten Inodes df -iin der Praxis für diese Dateisysteme bedeuten würde. Ich würde dem angezeigten Wert keine Bedeutung beimessen.


"XFS ordnet Inodes auch dynamisch zu. JFS auch. Reiserfs auch. F2FS auch. Traditionelle Unix-Dateisysteme ordnen Inodes zur mkfs-Zeit statisch zu, und moderne FSes wie ext4, die ihr Erbe darauf zurückführen, aber heutzutage ist das so die Ausnahme, nicht die Regel.

"Übrigens, mit XFS können Sie den maximalen Prozentsatz des von Inodes verwendeten Speicherplatzes begrenzen, damit Sie keine Inodes mehr haben, bevor Sie zu dem Punkt gelangen, an dem Sie keine vorhandenen Dateien mehr anhängen können. (Standard ist 25% für FSes unter 1 TB, 5% für Dateisysteme bis zu 50 TB, 1% für größere Dateisysteme.) Wie auch immer, diese Speicherplatznutzung auf Metadaten (Inodes und Extent Maps) wird in regelmäßigen Abständen wiedergegeben df -h"- Peter Cordes in einem Kommentar zu dieser Antwort


28786688-667980=28118708Wollen Sie damit sagen, dass mir beim Erstellen leerer Dateien praktisch die Inodes ausgehen und "mein System kaputt machen"?
Luchonacho

1
XFS weist Inodes auch dynamisch zu. JFS auch. Reiserfs auch. Das Gleiche gilt für F2fs . Herkömmliche Unix-Dateisysteme ordnen Inodes zur mkfs-Zeit statisch zu, ebenso wie moderne FSes wie ext4, die ihr Erbe darauf zurückführen, aber heutzutage ist dies die Ausnahme, nicht die Regel. (Es sei denn, Sie gewichten die Dinge nach der installierten Basis, in der es wahrscheinlich richtig ist, zu sagen, dass die meisten Dateisysteme, die sich derzeit in freier Wildbahn auf * nix-Systemen befinden, statisch zugewiesene Inodes haben.)
Peter Cordes

Mit XFS können Sie übrigens den maximalen Prozentsatz des von Inodes verwendeten Speicherplatzes begrenzen, sodass Sie keine Inodes mehr haben, bevor Sie zu dem Punkt gelangen, an dem Sie keine vorhandenen Dateien mehr anhängen können. (Die Standardeinstellung ist 25% für Dateisysteme mit weniger als 1 TB, 5% für Dateisysteme mit bis zu 50 TB und 1% für größere Dateisysteme.) Wie auch immer, diese Speicherplatznutzung auf Metadaten (Inodes und Extent Maps) wird in df -h@luchonacho angezeigt.
Peter Cordes

26

Das Erstellen leerer Dateien umfasst Folgendes:

  • Inodes, einer pro Datei;
  • zusätzliche Verzeichniseinträge, auch einer pro Datei, jedoch aggregiert.

Die Anzahl der verfügbaren Inodes wird häufig beim Erstellen eines Dateisystems festgelegt und kann nicht geändert werden (einige Dateisysteme wie Btrfs oder XFS weisen Inodes dynamisch zu). Das ist es, woran gemessen wird df -i. Wenn Ihnen die Inodes ausgehen, können Sie keine neuen Dateien oder Verzeichnisse erstellen, selbst wenn Sie über verfügbaren Speicherplatz verfügen.

Verzeichniseinträge belegen ebenfalls Speicherplatz auf der verfügbaren Festplatte. Dies können Sie an der Größe eines Verzeichnisses ablesen: Es ist immer ein Vielfaches der Blockgröße, und wenn ein Verzeichnis viele Dateien enthält, nimmt seine Größe zu. Wenn Ihnen der Festplattenspeicher ausgeht, können Sie möglicherweise keine neuen Dateien oder Verzeichnisse in einem Verzeichnis erstellen, das „voll“ ist ( dh , das Hinzufügen einer neuen Datei würde das Zuweisen eines neuen Blocks erfordern ), selbst wenn Inodes verfügbar sind.

Ja, es ist möglich, dass nur leere Dateien nicht mehr genügend Speicherplatz bieten.


Also müsste ich genug leere Dateien erstellen, um eine 100% ige Nutzung der Inodes zu erreichen?
Luchonacho

@luchonacho ja, effektiv eine leere Datei pro Inode.
Stephen Kitt

Beachten Sie auch die erweiterten Attribute, die darüber hinaus Platz schaffen können. Wenn das Verzeichnis beispielsweise viele Standard-ACLs enthält, benötigt das Erstellen einer Datei darin Speicherplatz zum Speichern dieser ACLs.
Stéphane Chazelas

OK, ich stehe korrigiert. Die Sache ist, dass es mir sowohl mit den gerenderten als auch mit den Schriften mit fester Breite in meinem Browser komisch vorkommt. Wie fügt man sie aus Neugier ein? Hat Ihre Tastatur eine andere Taste für dieses Zeichen und die für U + 0022?
Stéphane Chazelas

Aus Neugier habe ich überprüft, ob sie in meinem britischen Tastaturlayout vorhanden sind und in der Tat AltGr + Shift + V / B (doppelte Anführungszeichen ohne Shift). Ich bleibe aber bei U + 0022.
Stéphane Chazelas

7

Rein logisches Argument:

Ein Dateiname besteht aus einer Anzahl von Bytes ungleich Null. Selbst mit theoretischer maximaler Kompression in einem hypothetischen Dateisystem entwickelt , um die absolute maximale Menge von Dateinamen zu ermöglichen, wird jeder Dateiname verbraucht noch mindestens ein Bit irgendwo auf einem physischen Datenträger. Wahrscheinlich mehr, aber "1 Bit pro Datei" ist das unbedeutende Minimum.

Berechnen Sie die Anzahl der Bits, die möglicherweise auf Ihre Platten passen. Dies ist die theoretische maximale Anzahl (leerer oder nicht leerer) Dateien, die Sie darauf speichern können.

Die Antwort lautet also ja. Letztendlich wird Ihnen der Speicherplatz ausgehen, egal welchen Speicher Sie verwenden, wenn Sie weiterhin leere Dateien hinzufügen. Offensichtlich werden Sie viel früher als das auf diese Weise berechnete Maximum ausgehen, aber Sie werden ausgehen.


0

Einfach nein, aber unter Linux können die Inodes ausgehen, was dasselbe ist, als würde Ihnen der Speicherplatz ausgehen.

Sie können so etwas in Ihrer Shell ausprobieren n=0; while :; do touch $n; let n=n+1; done

Stellen Sie einfach sicher, dass Sie es in der virtuellen Maschine ausführen, da Sie sonst sehr schnell keine Inodes mehr haben.


Was macht dieser Befehl?
Luchonacho

Es startet mit einer echten Endlosschleife, die in jeder Runde einen Dateinamen erzeugt, der eine Ganzzahl von 0 bis 1 2 3 ist. Es werden schließlich genug Dateien erzeugt, um alle Inodes des Dateisystems zu verwenden.
in1t3r

1
Wenn Sie diesen Befehl auf Ihrer / home-Partition ausführen, wenn er unabhängig ist, dann haben Sie kein Problem damit, dass Sie einfach nicht mehr auf Ihre / home-Partition schreiben können. Mein Vorschlag ist, ein Verzeichnis mit dem Namen inodetest cd darin zu erstellen und dann den Befehl auszuführen, nachdem Sie Fehler festgestellt haben, dass Sie keine Dateien mehr im Dateisystem erstellen können. Drücken Sie Strg + C und führen Sie den Befehl aus rm -fr inodetest, um alle leeren Dateien zu entfernen und wieder normal zu arbeiten. :)
in1t3r

0

Sie können die Festplatte nicht füllen, indem Sie leere Dateien erstellen - die Festplatte bietet immer noch ausreichend Platz für neue Dateien. Aber ja, Sie können den begrenzten Vorrat an freien Inodes des Dateisystems ausschöpfen - an diesem Punkt können Sie keine neuen Dateien erstellen (obwohl Ihre Festplatte - was den Speicherplatz betrifft - praktisch leer ist). Es wird nur die Liste der Inodes des Dateisystems verwendet, nicht die Festplatte. Das Dateisystem ist also voll, während die Festplatte praktisch leer ist. Die Inode-Tabelle belegt Speicherplatz auf der Festplatte, aber die Tabelle wächst nicht, wenn Sie Dateien hinzufügen - genau wie ein Blatt Papier nicht wächst, wenn Sie in seine Zeilen schreiben.

(eine Antwort in einem Kommentar von Baard Kopperud)


Sind wir nicht sicher, ob wir eine andere Antwort brauchen , die dasselbe sagt ?
Jeff Schaller
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.