No space left on device?

Nachdem der Server eigenartige Verhaltensweisen an den Tag legte und im syslog die Meldung „No space left on device“ erschien, war ich einigermaßen verwundert: Immerhin zeigte df an, dass alle relevanten Partitionen mehr als 50% freien Speicher haben. Ein Lesefehler auf der (virtuellen) Festplatte? Glücklicherweise nicht. Das Kommando

tune2fs -l /dev/mapper/vg0-var

brachte die entscheidende Information ans Licht:

...
Filesystem OS type:       Linux
Inode count:              10076160
Block count:              40296448
Reserved block count:     2014822
Free blocks:              12087119
Free inodes:              9
First block:              0
Block size:               4096
...

Free inodes 9. Das habe ich auch noch nicht erlebt, dass auf einer Linux (ext4) Partition die inodes ausgehen, aber natürlich kommt das nicht von ungefähr: Das Erstellen der Karten-Kacheln für den ganzen Alpenraum erzeugte die vielen Dateien.

Lösung

Hmm, laut Dokumentation kann man die Anzahl der inodes auf bestehenden ext4-Partitionen nicht vergrößern. Also eine neue Partition mit ausreichend inodes erzeugen und die Karten-Kacheln dorthin verschieben.

/var auf eine andere Partition linken

Das Problem: Kein Platz mehr auf /var

Es ist also wieder einmal passiert: Der Heimserver, der eigentlich nie für große Datenbank-Arbeiten gedacht war schlägt sich tapfer als Tileserver für Openstreetmap Karten. Nachdem das bei der Installation nicht abzusehen war, habe ich /var nicht auf eine eigene Partition gelegt und die root-Partition ist jetzt natürlich voll.

Jetzt könnte man ein bestehendes Logical Volume verkleinern (zuvor natürlich auch das unterliegende Filesystem) und den neu freigegebenen Platz für ein neues LV verwenden und dieses dann unter /var mounten. Der Quick-and-dirty-workaround ist /var einfach auf eine bestehende Partition zu verschieben und dann zu verlinken (softlink). Gesagt, getan, nur apparmor, der Sicherheitsdienst von Ubuntu-Linux ist damit nicht ganz einverstanden.

kernel: [11407.253478] type=1400 audit(1346434922.210:36): apparmor="DENIED" operation.....

OK, jetzt kann man die apparmor-Profile anpassen, aber das ist gar nicht ganz trivial und vor allem muss das für jede neue Software wieder gemacht werden.

bind bindet Verzeichnisse wie Mount-Points

Hier kommt eine seit Kernel 2.4 bestehende Erweiterung zu Hilfe: Die mount-Option bind kann Teile der Verzeichnisstruktur als eigenen Mount-Point einhängen. In der /etc/fstab kann das dann so aussehen:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
proc            /proc           proc    nodev,noexec,nosuid 0       0
/dev/mapper/vg1-root /               ext4    errors=remount-ro 0       1
/dev/mapper/vg1-swap none            swap    sw              0       0
/dev/mapper/vg1-mm	/media/mm	ext4	defaults	0	0
/media/mm/var /var  none bind

Jetzt ist liegt /var physikalisch auf der Partition mm und kann den ganzen Plattenplatz dieser Partition (LV in diesem Fall) verwenden.

Wie gesagt, ein Quick-and-dirty hack, aber dies können ja manchmal auch ganz nützlich sein …