Wie kann ich die Anzahl der Inodes in einem ext4-Dateisystem erhöhen?

61

Ich hatte letzte Woche ein (für mich neues) Problem. Ich habe ein ext4 (Fedora 15) Dateisystem. Die Anwendung, die auf dem Server ausgeführt wird, wurde plötzlich gestoppt. Ich konnte das Problem auf den ersten Blick nicht finden.

dfzeigte 50% verfügbaren Speicherplatz. Nachdem ich ungefähr eine Stunde lang gesucht hatte, sah ich einen Forumsbeitrag, in dem der Typ verwendet hat df -i. Die Option sucht nach Inodes. Das System hatte keine Inodes mehr, ein einfaches Problem, das ich nicht erkannte. Die Partition hatte nur 3.2M Inodes.

Jetzt sind meine Fragen: Kann ich das System mehr Inodes haben lassen? Sollte / kann es beim Formatieren der Festplatte eingestellt werden? Wie viele Dateien kann ich mit den 3.2M-Inodes haben?

piovisqui
quelle
1
Jede Datei oder jedes Verzeichnis verwendet eine Inode. Ein fester Link zu einer Datei erzeugt keine Inode. en.wikipedia.org/wiki/Inode
Paul Tomblin

Antworten:

33

Es scheint, dass Sie viel mehr Dateien als erwartet haben.

Ich weiß nicht, ob es eine Lösung gibt, um die Größe der Inode-Tabelle dynamisch zu ändern. Ich fürchte, Sie müssen Ihre Daten sichern, ein neues Dateisystem erstellen und Ihre Daten wiederherstellen.

Um ein neues Dateisystem mit einer so großen Inode-Tabelle zu erstellen, müssen Sie die Option '-N' von mke2fs (8) verwenden.

Ich würde empfehlen, zuerst die Option '-n' zu verwenden (die das fs nicht erstellt, aber die nützlichen Informationen anzeigt), damit Sie die geschätzte Anzahl der Inodes erhalten. Verwenden Sie dann bei Bedarf '-N', um Ihr Dateisystem mit einer bestimmten Inode-Nummer zu erstellen.

Cinsk
quelle
11
Mit können Sie mke2fs -idie Anzahl der Inodes festlegen. Die Dokumentation besagt, dass es nicht möglich ist, die Anzahl der Inodes in einem Dateisystem zu erhöhen, nachdem es erstellt wurde.
Gilles 'SO- hör auf böse zu sein'
2
@piovisqui: Jede Datei verbraucht auf Inode, was ein Zeiger im Dateisystem ist. Wenn die Datei ein fester Link zu einer anderen Datei ist, hat sie denselben Inode.
Hanan N.
6
@Gilles Die -iOptionen geben die Größe des Inodes an , nicht wie viele. Die -NOption legt die Anzahl der Inodes fest.
Theillien
1
Das Verhältnis zwischen Inodes und Dateinummer ist nicht unbedingt 1: 1. Der erste Inode enthält eine Liste von Zeigern auf Blöcke, in denen die Datei gespeichert ist. Wenn die Liste der Blöcke nicht in einen Inode passt, enthält der Inode eine Liste von Zeigern auf Inodes, in denen die Blöcke aufgelistet sind, in denen die Datei gespeichert ist. Wenn es dort nicht passt, dann geht es 3 Sätze von Inodes tief für diese Liste von Blöcken usw.
StuWhitby
2
@StuWhitby Das stimmt nicht ganz. Ein einzelner Inode hat mehrere direkte Zeiger und einen einzelnen, doppelten und dreifachen indirekten Zeiger. Wenn die Liste der Blöcke nicht in die direkten Zeiger passt, zeigt der einzelne indirekte Zeiger auf einen Datenblock (NICHT auf einen anderen Inode), der mehr Zeiger enthält. Wenn mehr Zeiger benötigt werden, zeigt der doppelte indirekte Zeiger auf einen Block, der einzelne indirekte Zeiger enthält, und der dreifache indirekte auf einen Block mit doppelten indirekten Zeigern. Tatsächlich verwendet eine Datei nur einen Inode, unabhängig von der Größe.
user125355
11

Als eine weitere Problemumgehung könnte ich vorschlagen, riesige Dateisammlungen in ein unkomprimiertes (!) tarArchiv zu packen und es dann archivemountals Dateisystem bereitzustellen. Ein Tar-Archiv ist besser für die Freigabe als ein Dateisystem-Image und bietet eine ähnliche Leistung beim Sichern in einer Cloud oder einem anderen Speicher.


Wenn die Sammlung schreibgeschützt sein soll, squashfskann dies eine Option sein, für die jedoch bestimmte Optionen im Kernel aktiviert sein müssen. Die xzKomprimierung ist auch für tar mit derselben Leistung verfügbar.

tijagi
quelle
2
Netter Vorschlag.
piovisqui
11

Mit 3,2 Millionen Inodes können Sie insgesamt 3,2 Millionen Dateien und Verzeichnisse haben (mehrere Hardlinks zu einer Datei verwenden jedoch nur einen Inode).

Ja, es kann festgelegt werden, wenn ein Dateisystem auf der Partition erstellt wird. Die Optionen -T usage-type, -N number-of-inodesoder -i bytes-per-inodekönnen alle die Anzahl der Inodes festlegen. Ich benutze im Allgemeinen -i, nachdem ich die Ausgabe von du -sund find | wc -lfür eine ähnliche Sammlung von Dateien verglichen habe und ein wenig Spielraum zugelassen habe.

Nein, es kann nicht direkt in einem vorhandenen Dateisystem geändert werden. Jedoch:

  • Wenn Sie LVM ausführen oder sich das Dateisystem auf einer SAN-LUN befindet (entweder direkt auf der LUN oder als letzte Partition auf der LUN) oder wenn Sie nach der Partition leeren Speicherplatz auf der Festplatte haben, können Sie die Partition vergrößern und dann Verwenden Sie resize2fs, um das Dateisystem zu erweitern. Dies fügt ungefähr im Verhältnis zum hinzugefügten Raum mehr Inodes hinzu. Wenn Sie vermeiden möchten, dass die Inodes vor dem Speicherplatz ausgehen, vorausgesetzt, dass zukünftige Dateien im Durchschnitt ungefähr dieselbe Größe haben, legen Sie mit einen ausreichend hohen Prozentsatz für reservierte Blöcke fest tune2fs -m.
  • Wenn Sie über genügend Speicherplatz verfügen und das Dateisystem offline schalten können, schalten Sie es offline, erstellen Sie ein neues Dateisystem mit mehr Inodes und kopieren Sie alle Dateien.
  • Wenn nur eine Teilmenge der Dateien viele Inodes verwendet und Sie über genügend freien Speicherplatz verfügen, erstellen Sie ein Dateisystem auf einem Loop-Gerät, das durch eine Datei im Dateisystem gesichert ist, und erstellen Sie ein Dateisystem mit mehr Inodes (und möglicherweise auch kleineren Blöcken). darauf, und verschieben Sie die beleidigenden Verzeichnisse hinein. Das ist wahrscheinlich ein Leistungseffekt und ein Wartungsproblem, aber es ist eine Alternative.
  • Und wenn Sie viele nicht benötigte Dateien löschen können, sollte das natürlich auch helfen.
David
quelle
6

Ich habe eine alternative Lösung für diese Situation. Nehmen wir an, Sie haben 1000 Inodes in einer Partition von 10G. Aufgrund der Beschränkung der Inodes wird jedoch nicht angenommen, dass Sie den gesamten Raum der Partition verwenden . In dieser Lösung können Sie jedoch den verbleibenden Speicherplatz der Partition nutzen, ohne sie zu formatieren .

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

zur dauerhaften Montage

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab
SANJEET
quelle
2
Willkommen bei U & L. Ich habe mir die Freiheit genommen, Ihre Antwort auf die üblichere Darstellung von Code hier neu zu formatieren und eine Eingabeaufforderung ( $) einzufügen, um klar zwischen Befehlen und Ausgaben zu unterscheiden (wenn es sich nur um Befehle handelt, wird die Eingabeaufforderung normalerweise weggelassen). Ich habe auch das SCHREIEN in der Fettdruckphase geändert, und ich denke, das war deine Absicht. Sie können die Änderungen rückgängig machen, wenn ich die Dinge falsch dargestellt habe
Anthon,
Ich denke, diese Lösung hat Logik, aber Sie müssen die Größe verwalten, wenn Sie dd ausführen.
piovisqui
3
Die Details stimmen nicht, Sie müssten ein Loop-Gerät und möglicherweise sogar unionfs verwenden, je nach Anwendung. Dies ist jedoch die einzige Lösung, die das Formatieren und Wiederherstellen von Backups vermeidet. Dies macht keinen Spaß, wenn Sie es eilig haben, mit Millionen von Dateien. Es gibt Umstände, unter denen dies den Tag retten könnte!
Medoc
6

Vor kurzem trat dieses Problem bei Verwendung von apt oder aptitude upgrade auf.

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

Befehl ausgegeben:

du /|sort -k1 -n

Die meisten Dateien befanden sich in Unterordnern für verschiedene Kernelversionen innerhalb von:

/usr/src/linux-headers

Entfernte diese Unterordner und Inode-Problem wurde behoben.

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /
kph0x1
quelle
zeigt "du / | sort -k1 -n" Inodes?
Waisenkinder
Nein. Das war, um die Verzeichnisse zu sortieren und zu zeigen, welche die meisten Dateien enthielten, Ordner, die viele Inodes verbrauchten, aber weniger Speicherplatz beanspruchten: die oben gezeigte Situation von 30% freiem Speicherplatz und 100% Inode-Nutzung.
kph0x1
Ich verstehe ehrlich gesagt nicht, wie "du" angezeigt hat, wie viele Dateien es mit einer Flagge gibt? Könnten Sie das bitte näher erläutern?
Waisenkinder
Keine Flags für den duBefehl. Die Verwendung bezieht sich auf das Stammverzeichnis des Dateisystems im obigen Beispiel und bezieht sich nur auf den Speicherplatz. Die Ausgabe wird an die Sortierung weitergeleitet, um anzuzeigen, welche Verzeichnisse die meisten Dateien enthielten. Im obigen Beispiel wird keine Zählung für Dateien durchgeführt, der Teil "Wie viele Dateien" Ihrer Frage. Kernel-Quellen waren der Schuldige, der in der duAusgabe gezeigt wurde ; zB viele kleine Dateien, Unterordner aus früheren Zusammenstellungen, die sich ideal zum Entfernen eignen, um Inodes freizugeben. Es bleibt noch eine manuelle, menschliche Überprüfung der duAusgabe, /usr/src/linux-headerswar dann offensichtlich.
kph0x1
1
du zeigt NUR Bytes - keine Dateien. Und Sie leiten den Ausgang nur vom Befehl du in sort. Wie sortiert sort -k1 -n die Ausgabe auf die von Ihnen vorgeschlagene Weise? Das einzige, was ich sehen kann, ist, dass "du / | sort -k1 -n" jede Zeile nur nach der Größe in Bytes sortiert. Sonst nichts
Waisenkinder
2

versuche du -s --inodes * 2>/dev/null |sort -gdie cd in das letzte ausgabeverzeichnis und wiederhole es.

Vollständige Offenlegung: Nicht alle Betriebssysteme unterstützen den --inodesBefehl du (mein Mac OS nicht), aber viele Linux-Betriebssysteme.

Otto Leichliter
quelle