2009-03-17 6 views
175

Ich habe ein Laufwerk, wo die Inode-Nutzung 100% ist (mit df -i Befehl). Jedoch nach dem Löschen von Dateien im Wesentlichen bleibt die Verwendung 100%.Wie kann man die Inode-Nutzung freigeben?

Was ist der richtige Weg, es dann zu tun?

Wie ist es möglich, dass ein Laufwerk mit weniger Speicherplatzbedarf höhere Inode-Verwendung als ein Laufwerk mit höheren Speicherplatz verwenden kann?

+4

Möchten Sie 50 Punkte für diese Frage geben. Wie kann ich! :) – Sophy

+0

@Sophy Mach das nicht. du wirst automatisch gebannt bekommen –

+1

@StevenLu Danke für deine Infos! Ich möchte ihm danken, weil ich ein paar Tage damit verbracht habe, mein Problem zu lösen. Aber dieses Problem kann mir helfen. Nochmals vielen Dank, – Sophy

Antwort

122

Es ist ziemlich einfach für eine Platte, eine große Anzahl von Inodes zu verwenden, selbst wenn die Festplatte nicht sehr voll ist.

Ein Inode ist einer Datei zugeordnet. Wenn Sie also mehrere Dateien haben, die alle 1 Byte umfassen, haben Sie lange keine Inodes mehr, bevor Sie keine Festplatte mehr haben.

Es ist auch möglich, dass das Löschen von Dateien die Inode-Anzahl nicht verringert, wenn die Dateien mehrere feste Verbindungen haben. Wie gesagt, gehören Inodes zu der Datei, nicht der Verzeichniseintrag. Wenn eine Datei mit zwei Verzeichniseinträgen verknüpft ist, wird beim Löschen einer Datei der Inode nicht freigegeben.

Zusätzlich können Sie einen Verzeichniseintrag löschen, aber wenn ein laufender Prozess die Datei geöffnet hat, wird der Inode nicht freigegeben.

Mein erster Ratschlag wäre, alle Dateien zu löschen, die Sie können, dann starten Sie die Box neu, um sicherzustellen, dass keine Prozesse mehr offen bleiben.

Wenn Sie das tun und Sie immer noch ein Problem haben, lassen Sie es uns wissen.

#!/bin/bash 
# count_em - count files in all subdirectories under current directory. 
echo 'echo $(ls -a "$1" | wc -l) $1' >/tmp/count_em_$$ 
chmod 700 /tmp/count_em_$$ 
find . -mount -type d -print0 | xargs -0 -n1 /tmp/count_em_$$ | sort -n 
rm -f /tmp/count_em_$$ 
+9

Natürlich funktioniert das '>/tmp/count_em _ $$' nur, wenn Sie Platz dafür haben ... wenn das der Fall ist, sehen Sie @ simons Antwort. – alxndr

+1

@alxndr, deshalb ist es oft eine gute Idee, Ihre Dateisysteme getrennt zu halten - auf diese Weise hat das Auffüllen von etwas wie '/ tmp' keinen Einfluss auf Ihre anderen Dateisysteme. – paxdiablo

+0

Ihre Antwort ist perfekt geeignet für "System wird nicht bleiben verwenden Sie die Datei nach dem Neustart, wenn das gelöscht wurde". Aber die Frage wurde gefragt, "wie die Inodes zurückgewinnen oder wiederverwenden, nachdem der Inode-Zeiger gelöscht wurde?". Grundsätzlich erstellt der Linux-Kernel bei jeder Erstellung einen neuen Inode für eine Datei und fordert den Inode beim Löschen einer Datei nicht automatisch zurück. – Mohanraj

152

Wenn Sie sehr unglücklich sind Sie 100% aller Inodes verwendet haben und können:

By the way, wenn Sie für die Verzeichnisse suchen, die viele Dateien enthalten, kann dieses Skript helfen Erstelle keinen Scipt. Sie können dies mit df -ih überprüfen.

Dann ist dieser Bash-Befehl können Ihnen helfen:

sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n 

Und ja, das wird einige Zeit dauern, aber Sie können das Verzeichnis mit den Dateien suchen.

+0

Vielen Dank! – Eby

+5

das tut Der Trick: mein Problem bestand darin, unglaublich viele Sitzungen im Verzeichnis/lib/php/sessions zu haben.vielleicht hat jemand das gleiche Problem – SteMa

+0

Parallels Plesk wird nicht geladen, ftp nicht in der Lage, eine Sitzung zu öffnen, Quote Internet Disk exceded (122) einige der Probleme sind Sie erhalten, wenn Sie die maximale Anzahl der Inodes erreicht haben (~ Files) Ihr Dienstanbieter legt den Höchstwert auf bis zu 20.000 Inodes (~ Files) fest, selbst wenn Sie UNBEGRENZTEN Speicherplatz haben. – normeus

1

Eaccelerator könnte das Problem verursachen, da es PHP in Blöcke kompiliert ... Ich hatte dieses Problem mit einem Amazon AWS-Server auf einer Website mit hoher Auslastung. Geben Sie Inodes frei, indem Sie den eaccelerator-Cache in/var/cache/eaccelerator löschen, wenn weiterhin Probleme auftreten.

rm -rf /var/cache/eaccelerator/* 

(oder was auch immer Ihr Cache dir)

1

Wir erfahren dies auf einem HostGator Konto (die ihre Hosting auf alle inode Grenzen setzen) nach einer Spam-Attacke. Es hat eine große Anzahl von Warteschlangeneinträgen in /root/.cpanel/comet hinterlassen.Wenn dies geschieht, und Sie finden Sie keine freien Inodes haben, können Sie diese cPanel Dienstprogramm durch Shell ausgeführt:

/usr/local/cpanel/bin/purge_dead_comet_files 
33

Meine Lösung:

Versuchen zu finden, wenn dies ein Inodes Problem mit:

df -ih 

Versuchen Stammordner mit großen Inodes zu finden zählen:

for i in /*; do echo $i; find $i |wc -l; done 

Versuchen bestimmte Ordner zu finden:

for i in /src/*; do echo $i; find $i |wc -l; done 

Wenn dieser Linux-Header ist, versuchen zu entfernen älteste mit:

sudo apt-get autoremove linux-headers-3.13.0-24 

persönlich zog ich sie zu einem montierten Ordner (weil für mich letzten Befehl nicht) und installierte die neuesten mit:

sudo apt-get autoremove -f 

Das löste mein Problem.

+0

In meinem Fall war 'SpamAssasin-Temp'. 'find/var/spool/MailScanner/ankommend/SpamAssassin-Temp -mtime +1 -print | xargs rm -f' hat den Job gemacht :) Danke! – joystick

+0

Für mich dauerte das Stunden. Es gibt jedoch eine einfache Lösung: Wenn der zweite Befehl in einem bestimmten Verzeichnis hängt, kill den aktuellen Befehl und starten Sie die Änderung von/* in das Verzeichnis, in dem es sich befand. Ich war in der Lage, den Schuldigen zu untersuchen

47

Meine Situation war, dass ich keine Inodes mehr hatte und über alles, was ich konnte, gelöscht hatte.

$ df -i 
Filesystem  Inodes IUsed IFree IUse% Mounted on 
/dev/sda1  942080 507361  11 100%/

Ich bin auf einem ubuntu 12.04LTS und konnte das alte Linux-Kernel nicht entfernen, die etwa 400.000 Inodes aufnahm, weil apt wegen eines fehlenden Pakets gebrochen war. Und ich konnte das neue Paket nicht installieren, weil ich keine Inodes mehr hatte, also saß ich fest.

landete ich mit der Hand ein paar alte Linux-Kernel zu löschen etwa 10.000 Inodes zu befreien

$ sudo rm -rf /usr/src/linux-headers-3.2.0-2* 

Das war genug, um mich dann das fehlende Paket lassen installieren und reparieren meine apt

$ sudo apt-get install linux-headers-3.2.0-76-generic-pae 

und dann den Rest der alten Linux-Kernel mit Apt

$ sudo apt-get autoremove 

Dinge sind viel Wette ter jetzt

$ df -i 
Filesystem  Inodes IUsed IFree IUse% Mounted on 
/dev/sda1  942080 507361 434719 54%/
+3

Dies war meinem eigenen Ansatz in einer ähnlichen Situation am nächsten. Es ist erwähnenswert, dass ein vorsichtiger Ansatz gut dokumentiert ist unter https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels – beldaz

+0

Mein Fall genau! Aber musste mit "sudo apt-get autoremove -f" fortschreiten –

6

hatte ich das gleiche Problem, es

rm -rf /var/lib/php/sessions/ 

unter /var/lib/php5 durch Entfernen der Verzeichnis-Sitzungen von PHP festgelegt sein kann, wenn Sie eine ältere PHP-Version verwenden.

neu erstellen sie mit folgenden Erlaubnis

mkdir /var/lib/php/sessions/ && chmod 1733 /var/lib/php/sessions/ 

Berechtigung standardmäßig für Verzeichnis auf Debian zeigte drwx-wx-wt (1733)

+1

Irgendeine Idee, warum das passiert? – Sibidharan

+1

@Sibidharan in meinem Fall war es, weil der PHP Cron-Job, um die alten PHP-Sitzungen zu löschen, nicht funktionierte. – grim

1

Wir haben vor kurzem ähnliches Problem konfrontiert, Im Fall, wenn ein Prozess zu einer gelöschten Datei verweist, Der Inode darf nicht freigegeben werden, daher müssen Sie lsof/überprüfen, und wenn der Prozess abgebrochen/neu gestartet wird, werden die Inodes freigegeben.

Korrigieren Sie mich, wenn ich hier falsch liege.

1

Wie bereits gesagt, Dateisystem aus Inodes laufen kann, wenn es eine Menge von kleinen Dateien ist. Ich habe einige Mittel zur Verfügung gestellt, um Verzeichnisse zu finden, die die meisten Dateien here enthalten.

-2

Mail-Verzeichnis ist möglicherweise voll von Dateien sein:

/home/username/Maildir/new

0

Viele Antworten auf diese so weit und alle der oben genannten konkreten scheinen. Ich denke, dass Sie sicher sein werden, indem Sie stat verwenden, wie Sie gehen, aber Betriebssystem abhängig, können Sie einige Inode-Fehler schleichen kriechen auf Sie. Daher scheint die Implementierung Ihrer eigenen stat Anruffunktionalität unter Verwendung von 64bit, um Überlaufprobleme zu vermeiden, ziemlich kompatibel zu sein.