keine inodes mehr frei

L

Leno

Guest
Hi, nachdem ich es geschafft habe meinen Laptop endlich ins Internet zu bringen (ist ein anderer thread) habe ich nun versucht ein cvs Update zu machen. Das runterladen der Sourcen klappt wunderbar, aber sobald ich diese von /home/dcvs nach /usr/* kopieren will, bricht der Rechner nach ein paar Minuten ab, da keine inodes mehr frei sind? Wie kann das passieren? Wo kann ich nachschauen was die inodes belegt und evtl. etwas löschen? Kann ich evtl beim formatieren einstellen wieviele inodes ich will?

Die genaue Befehlsfolge von mir war:
Code:
# get the CVS pository (it is placed in /home/dcvs)
cvsup /usr/share/examples/cvsup/DragonFly-supfile
# install the source from the CVS hierarchy
cd /usr
cvs -R -d /home/dcvs checkout src
Sprich eigentlich alles wie im README geschildert.


Leno
 
bei FreeBSD 4.X mit

df -ir

damit kannste die inodes des gesamten systems anschaun, also nehme ich mal an das es bei DFBSD auch klappen sollte.


hatte ich auch mal den fehler der grund war bei mir das ich mir selber mit nem verbuggten script /var mit lauter 0 bytes grossen files zugespammt hab.
 
Danke für den Tip.

df -i kannte ich, bzw. hatte ichb schon gemacht, aber das sagt mir nur, dass alle inodes belegt sind. Die -r Option gibt es aber nicht. Nicht unter DragonFly, und laut online Manpages auf www.freebsd.org auch nicht in FreeBSD 4.10 stable. Bist du dir sicher, dass du -r gemeint hast?



Leno
 
Was mir gerade auffällt: df -i gibt aus, dass meine 10G /usr-Partition weniger inodes hat als meine /home-Partition welche knapp 6,8G groß ist. Um Zahlen zu nennen: /usr hat 650494 inodes und /home hat 1729150. Das ist ja deutlich mehr als Faktor 2 größer obwohl die Partition nur 2/3 der Größe hat. Sollte es nicht so sein, dass die inodes linear mit der Größe der Partition zunimmt?
 
sind inodes nicht einfach die Einträge der Dateien in der Directorytabelle?
dann muss es nicht so wachsen. wenn du eine grosse Datei hast, die das Slice komplett ausfüllt, hat die ja bloss einen i-node. Viele kleine dateien haben natürlich ebensoviele i-nodes.
Man berichtige mich, wenn ich falsch liege.
 
Ich dachte, dass ich eine bestimmte Anzahl von inodes habe, denen eine bestimmte Blockgröße zugeordnet wird. Und eine bestimmte Datei nimmt dann eine bestimmte Anzahl von Blöcken und somit inodes an. Aber dein Vorschlag klingt auch gut, werde gleich mal danach googlen.

Aber falls du recht hast, wie kommt es dann, dass ich von vorneherein sagen kann, wievieles inodes noch frei sind?
 
Vielleicht sollte ich noch ein wenig den Aufbau des UFS-Dateisystems erläutern. Jedes Dateisystem hat eine Inode-Tabelle. Jede Datei in diesem Dateisystem belegt einen Eintrag in der Inode-Tabelle. Denn das System muß wissen, bei welchem Block eine bestimmte Datei beginnt (das Ende ist ja dann sowieso durch EOF gekennzeichnet). In der Tabelle steht z.B. drin (ganz, ganz vereinfacht ausgedrückt): Die Datei abc beginnt bei Block 123456. Und wenn nun diese Tabelle voll ist, also keine Inodes darin mehr frei sind, kannst du keine Dateien mehr anlegen, unabhängig davon, wieviel freier Speicherplatz auf dem Dateisystem noch vorhanden sein mag. Wie gesagt, freier Speicherplatz alleine bringt nichts, das Dateisystem muß in der Tabelle aufzeichnen, bei welchem Block eine Datei beginnt, sonst findet es nichts wieder.

Die Größe der Inode-Tabelle läßt sich bei FreeBSD mit dem Schalter -i von newfs festlegen (keine Ahnung, ob das bei DragonFly anders ist). Wenn man z.B. angibt, daß eine Inode-Dichte von 8 KB angelegt werden soll, so hätte man auf einem 1 GB großen Dateisystem eine Inode-Tabelle, die Platz für 131.072 Einträge (= Dateien) hat.

Legt man jetzt theoretisch 131.072 Dateien mit einer Größe von 1 KB an, ist die Tabelle voll, man kann keine Dateien mehr auf dem Dateisystem anlegen, obwohl nur 128 MB des physischen Speicherplatzes belegt ist.

Jetzt könnte man hingehen, und die Inode-Dichte auf 1 KB verringern. Dazu müßte man aber ein neues Dateisystem erstellen. Mir ist keine Möglichkeit bekannt, die Inode-Dichte eines bestehenden Dateisystems zu ändern. Jedenfalls könnte man dann theoretisch 1.024.000 Dateien anlegen (wenn einem nicht vorher der physische Speicherplatz ausgeht).

Ich sage bei der Anzahl der Dateien deshalb immer "theoretisch", weil man nicht ganz so viele Dateien anlegen kann. Die Inode-Tabelle muß ja auch irgendwo gespeichert werden. Heißt, je größer die Inode-Dichte, desto größer wird die Inode-Tabelle, desto weniger Speicherplatz habe ich letztendlich für Nutzdaten auf dem Dateisystem.

Man sollte also überlegen, welche Inode-Dichte man auf welchem Dateisystem verwendet. Eventuell hat DragonFly dahingehend schon optimiert, woraus sich die unterschiedlichen Inode-Dichten ergeben würden, die Leno festgestellt hat. So geht man davon aus, daß unter /usr eher größere Dateien (Binaries, Libs, usw.) liegen. Ich brauche da also weniger Inodes und habe damit mehr Netto-Speicherplatz auf /usr.

Auf /home werden dann wohl eher kleinere Dateien angelegt, z.B. eben Dateien aus einem CVS-System. Da brauche ich dann viele Inodes, das ist in dem Falle wichtiger als der Netto-Speicherplatz (der mir ja nichts bringt, wenn die Inode-Tabelle frühzeitig voll ist). Nur scheint bei Leno trotzdem noch die Inode-Dichte für /home zu klein gewählt.

Wie gesagt, IMO bleibt da nur das Neuanlegen des Dateisystems mit newfs und Verwendung des Schalters -i.
 
Zuletzt bearbeitet:
Danke 0815Chaot für die ausführliche Erklärung. Ich werde mich mal schlau machen ob DragonFly Optimierungen was die Inode Dichte der einzelnen Partitionen angeht. Beim Installieren mit dem Installer gibt es jedenfalls keine Möglichkeit diese einzustellen. Habe das System jetzt nochmal komplett neu aufgesetzt, und bisher klappt noch alles, also der CVS Update hat funktioniert. Also muss ich die von mir gemachten Systemeinstellungen nacheinander durchgehen um herauszufinden welche zum "Füllen" der Inodes führt.

Wahrscheinlich hat SadButTrue recht und es ist ein Script daran Schuld. Werde mich mal auf die Suche machen.


Also vielen Dank an alle für die Hilfe ;^)


Leno
 
0815Chaot, woher weisst du das, wo kann man das nachlesen?
FreeBSD interne Doku, oder was anderes? Wenn 2. dann sags mir bitte :-)
 
Man kann seine Inodes ganz einfach ein bisschen hochschrauben.

Benutze am besten ein eigenes Label fuer die /usr/ports , die schlucken naemlich Deine ganzen inodes.

Wenn das Label angelegt ist diese mit #newfs -O2 -b4096 -f 3072 -i 512 formatieren.
Das Label fuer die Ports sollte um die 300MB gross sein, weil die ports auch nicht groesser sind. Hoffe das war richtig herum, wenn das nicht geht einfach newfs -O2 -b 4096 -f 512 -i 3072 ausprobieren. Sorry habe das gerade nicht im Kopf. Kann man aber auch unter "man ufs" nachlesen.

CAT
 
Danke für den Tip cat1510. Aber werden nicht bei einem make install die work Verzeichnise in /usr/ports/<welche Kategorie auch immer>/<irgendein Programm>/work angelegt. Sind diese dann verlinkt nach z.B. /usr? Sonst läuft ja gleich mein Filesystem über.
 
Zuletzt bearbeitet von einem Moderator:
Bevor du mit newfs um dich schlägst, solltest du dir erstmal überlegen, wo du 650.000 inodes, respektive Dateien und Verzeichnisse, rumliegen hast.
Das ist ein /Haufen/ Holz: wenn das z.b. alles mp3s mit durchschnittlich 3 min Spielzeit sind, dann könntest du ununterbrochen über dreieinhalb Jahre Musik hören!
Also erstmal schauen, was da los ist, bevor du was unüberlegtes mit newfs machst.
Ich habe auf meinem 14G /usr bisher gerade mal knapp 200.000 inodes verbraucht.

@Leno:
man ports, Abschnitt ENVIROMENT
 
Danke Tron werd' ich lesen.

Dass es zu wenig indodes sind ist ja auch sicher nicht das Problem, es muss wirklich ein verbuggtes Script (oder viel eher irgendeines an dem ich rumgedreht habe) gewesen sein, denn beim zweiten Anlauf gab es gar keine Probleme. Wahrscheinlich habe ich beim änern irgendeiner Datei einen Fehler gemacht der dann Mist produziert hat.
 
Kannst mal ein
Code:
find /usr | sed 's#/[^/]*$##' | sort | uniq -c | sort -nr | head
laufen lassen.
Das sollte dir die 10 Verzeichnisse mit den meißten Dateien darin ausspucken.
 
Leno schrieb:
Danke für den Tip cat1510. Aber werden nicht bei einem make install die work Verzeichnise in /usr/ports/<welche Kategorie auch immer>/<irgendein Programm>/work angelegt. Sind diese dann verlinkt nach z.B. /usr? Sonst läuft ja gleich mein Filesystem über.

in die make.conf einfach folgendes reinschreiben:

WORKDIR= /irgendwo/wo/platz/ist
DISTFILES= /wo/alle/runtergeladenen/files/hinsollen

Dann klappt es auch mit dem Nachbarn... ;)

CAT
 
menace schrieb:
0815Chaot, woher weisst du das, wo kann man das nachlesen?
FreeBSD interne Doku, oder was anderes? Wenn 2. dann sags mir bitte :-)

A Fast Filesystem for UNIX, McKusick, Joy, Leffler, Fabry
oder gleich
The Design and Implementation of the 4.4BSD Operating System, McKusick, et al.
 
menace schrieb:
0815Chaot, woher weisst du das, wo kann man das nachlesen?
FreeBSD interne Doku, oder was anderes? Wenn 2. dann sags mir bitte :-)
Kann man alles in /usr/src/sys nachlesen ;) Wo ich das ursprünglich her habe, weiß ich aber nicht mehr. Kann sein, daß ich das mal vor Urzeiten in einer Referenz zu Solaris gelesen hatte. Es gibt schon lange einige Dateisysteme, die Dateien mittels Inode-Tabellen organisieren, z.B. auch ext2 und sicher noch viele andere.

Ich dachte zunächst, ich finde im FreeBSD Architecture Handbook etwas - das Kapitel 9 ist aber wohl noch in Vorbereitung. Ansonsten such mal mit Google, ich konnte bei einer kurzen Suche leider nichts vernünftiges finden.

Oder du kaufst dir eines der Bücher, die Mr. Fixit genannt hat.
 
Wie ist denn die default Einstellung der Inode-Dichte (kein System zur Hand im Moment)? Und heisst das, dass Inode-Tablle immer gleichgroß ist, egal ob Einträge vorhanden sind oder nicht?

Gruß, I.MC
 
@ badbubiman: Ja der ist interessant. Matt gibt auch eine Lösung. Das Problem liegt demnach beim Installer, da der das /usr Verzeichnis mit einer zu geringen Inode Dichte/Anzahl anlegt. Es gibt einen Workaround indem man bei der Installation mit dem Installer einfach die Konsole wechselt und das /usr Verzeichnis von Hand erstellt. Aber genaueres steht im Thread.

Aber Danke für den Link.

@I.MC: Falls du dich auf DragonflyBSD beziehst, dann findest du das auch im Thread. Laut Matt beutzt Dragonfly per default 2K/16K für die Fragment und Blocksize. Aber für /usr wird wohl fälschlicherweise 4K/32K benutzt, was die Inode Anzahl halbiert. Er empfiehlt für /usr dann 1K/4K und für die restlichen Verzeichnisse 2K/8K.
 
Der Workaround sieht folgenedermaßen aus:

Installation ganz normal mit dem Installer. Auch die Filesysteme ganz normal wie immer anlegen. Dann, BEVOR die Files installiert werden, auf einen neue Screen wechseln, und dort als root einloggen. Nun entweder mit
Code:
newfs -U -f 2048 -b 16384 /dev/ad0s2f
oder mit
Code:
newfs -U -f 1024 -b 8192 /dev/ad0s2f
, je nachdem was für eine Inode Dichte ihr wollt, das /usr Verzeichnis neu anlegen. Es empfiehlt sich hier letztere Varinate zu wählen, um einem erneuten Ausgehen der Inodes vorzubeugen. In meinem Fall war das System allerdings auf /dev/ad0s1 und nicht auf /ad0s2 installiert. Nun wieder auf den Installationsscreen wechslen und die Files installieren wie bisher auch.
 
Zurück
Oben