Warum meldet der Linux-Kernel "nicht genügend Speicherplatz", obwohl er in Wirklichkeit keine i-Knoten mehr hat?

10

Ein Freund von mir, der gerne in der Linux-Umgebung programmiert, aber nicht viel über die Verwaltung von Linux weiß, stieß kürzlich auf ein Problem, bei dem sein Betriebssystem (Ubuntu) "nicht genügend Speicherplatz auf XXX-Volume" meldete. Aber als er die Lautstärke überprüfte, waren noch 700 GB übrig. Nach viel Zeitverschwendung konnte er schließlich herausfinden, dass er keine Inodes mehr hatte. (Er hat viele kleine inkrementelle Updates von einem Backup-System auf diesem Volume gespeichert und alle seine Inodes durchgebrannt.)

Er fragte mich, warum der Linux-Kernel die Fehlermeldung ("out of disk space") gemeldet habe, anstatt sie ordnungsgemäß zu melden ("out of inodes"). Ich wusste es nicht, also dachte ich mir, ich würde StackExchange fragen.

Weiß jemand warum das passiert? und warum wurde es nach all den Jahren nicht behoben? (Ich erinnere mich an einen anderen Freund, der mir 1995 von diesem Problem erzählte.)

Brezel
quelle

Antworten:

18

Eine einzelne Fehlernummer ENOSPCwird verwendet, um beide Situationen zu melden, daher dieselbe Fehlermeldung.

Um die Einhaltung der Standards ISO Cund zu POSIXgewährleisten, haben die Kernel-Entwickler keine andere Wahl, als für beide Ereignisse eine einzige Fehlernummer zu verwenden. Das Hinzufügen einer neuen Fehlernummer würde vorhandene Programme beschädigen.

Da das Festhalten an herkömmlichen Fehlermeldungen jedoch nicht AFAIK-obligatorisch ist, sollte nichts einem Entwickler verbieten, die einzelne Nachricht klarer zu gestalten, wie zum Beispiel out of disk/inode space

Technisch gesehen ist es gleich, ob der Inode-Speicherplatz oder der Datenbereich nicht mehr vorhanden ist, dh, es ist nicht genügend freier Speicherplatz vorhanden, damit der Systemaufruf erfolgreich ausgeführt werden kann.

Ich denke, Sie wollten sich nicht beschweren, wenn Ihre Festplatte als voll gemeldet wird, solange noch freie Inodes-Steckplätze vorhanden sind.

Beachten Sie, dass Dateisysteme wie JFS, XFS, ZFSund btrfszuteilen Inodes mehr dieses Problem kein Exponat dynamisch so tun.

jlliagre
quelle
Aktuelle Dateisysteme enthalten ext4?
Camilo Martin
@CamiloMartin Ich glaube nicht.
Jlliagre
@CamiloMartin Leider nein, weist ext4Inodes zur Erstellungszeit von fs wie ext2 / 3 zu und kann später nicht mehr geändert werden.
Matt
@ Mindthemonkey Darn! Das ist wahrscheinlich eine Abwärtskompatibilitätssache, denke ich. Welches andere Dateisystem hat nette Funktionen, ist aber stabil genug (ist btrfs stabil)? ext4 scheint eine Art "Standardauswahl" zu sein (zumindest aus meiner Anfängerperspektive).
Camilo Martin
1
Ja, ext's waren schon immer Erweiterungen der vorherigen Version und abwärtskompatibel, also keine größeren Änderungen, aber das bedeutet, dass es ziemlich solide und stabil geblieben ist. Ich persönlich mache meinen gesamten großen Speicher auf Freebsd-Boxen mit ZFS. BTRFS wird immer noch als "instabil" betrachtet, obwohl die meisten Distributionen es zumindest zulassen, dass Sie es verwenden.
Matt
2

Ich gehe davon aus, dass Ihr Freund ein ext fs verwendet, weil es eines der wenigen vernünftigen fs ist, denen die Inodes ausgehen können.

Es scheint, dass Ihr Freund entweder an seinem Dateisystem herumgespielt und es kaputt gemacht hat oder ein lächerlich großes Volumen von mehreren TB hat. Inodes sind keine einmalige Sache. Wenn ihm wirklich die Inodes ausgehen, bedeutet dies, dass er lächerlich viele Dateien und Verzeichnisse hat ... was auf einem Volume mit> 4 TB (fundierte Vermutung) passieren kann, auf dem "nur" 700 GB frei sind. Für die ext-Familie von fs wird die Anzahl der Inodes bestimmt, wenn das fs erstellt wird. Von der mkfs.ext4Manpage:

-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.

Um den Rest dieser Antwort zu verkürzen: Dies bedeutet, dass mkfsentweder ein solches Verhältnis angegeben ist oder eines angenommen wird. Wenn Ihr Freund das fs anders verwendet als angenommen, kann das gewählte Verhältnis für seinen Anwendungsfall falsch sein und er erhält diesen Fehler ... Das Auffüllen eines einzelnen Multi-TB-Volumes mit Tonnen kleiner Dateien kann als solches gelten.

Verwendet Ihr Freund eine Desktop-Umgebung, die das Konzept eines "Papierkorbs" für Dateien oder andere Formen von Sicherungen implementiert, die möglicherweise große Mengen an Dateien erstellen? Vielleicht kann er sein Problem beheben, indem er einfach nicht benötigte Dateien entfernt.

Ich erinnere mich an dieses Problem mit ext2 aus der Zeit, als Kernel 2.4 noch ziemlich neu war. Als Faustregel verwende ich XFS immer für Volumes, die im Vergleich zu den derzeit üblichen sehr groß sind. Derzeit würde ich alles zwischen 250 GB und 1 TB für ein einzelnes Volume als üblich bezeichnen, und wir können 4 TB-Festplatten kaufen. Für alles> 3 TB würde ich lieber XFS als ext verwenden. Nur eine Faustregel, aber die Inodes sind schon lange nicht mehr ausgegangen ...

Bananguin
quelle
1
Ich fürchte, Sie beantworten die gestellte Frage nicht.
Jlliagre
Wahr. Ich habe versucht, die erste Inline-Frage zu beantworten, die ich auf "Weiß jemand, warum das passiert?" Drückte, aber nicht die im Titel.
Bananguin
Richtig. Mein Freund weiß, was passiert ist. Er führte eine Art Backup-System durch, in dem inkrementelle Änderungen UNkomprimiert (noch TAR-gespeichert) gespeichert wurden, sodass all diese winzigen kleinen Dateien Speicherplatz beanspruchten. Ich glaube nicht, dass er jemals zuvor einen so großen FS hatte, daher war es eine neue Sache für ihn, keine Inodes mehr zu haben. Ergo war er frustriert, als er "df -h" tippte und dachte: "Huh, ich habe noch eine Menge Platz übrig" - Ehrlich gesagt stimme ich ihm zu. Es ist sehr verwirrend, wenn der Kernel "out of space" sagt, obwohl er eine separate Meldung "out of inodes" haben sollte.
Brezel
@ Bananguin - Wissen Sie, wie hoch das Standard-Byte / Inode-Verhältnis ist?
Brezel
@Pretzel: Ich denke, ich erinnere mich, dass der Standardwert ein Inode pro 4k ist. Ich habe gerade meinen Computer überprüft ( tune2fs -l /dev/sda1) und habe zufällig ein Verhältnis von 1 Inode pro vier Blöcke und jeder Block ist 1 KB groß. Wie viel dies als "Standard" angesehen werden kann, weiß ich jedoch nicht.
Bananguin