✦ Oplossingen · Server- en developerfouten

No space left on device terwijl er ruimte is: inode-limiet bereikt

‘No space left on device’ terwijl df -h nog ruimte toont? Dan zijn de inodes op. Zo vind je met df -i en du --inodes de map met te veel bestanden.

Zo ziet de foutmelding eruit

  • No space left on device
  • ENOSPC: no space left on device
  • OSError: [Errno 28] No space left on device
  • cannot create temp file for here-document: No space left on device

Waarom gebeurt dit?

Een bestandssysteem houdt niet alleen bytes bij, maar ook een tabel met inodes. Een inode is het registratiekaartje van één bestand, map of koppeling: eigenaar, rechten, grootte en waar de data staat. Op ext4 wordt het aantal inodes vastgelegd bij het aanmaken van het bestandssysteem. Zijn ze allemaal in gebruik, dan kan er geen nieuw bestand meer bij, hoe veel gigabytes er ook vrij zijn. Het systeem meldt dan dezelfde fout als bij een volle schijf: No space left on device.

De oorzaak is bijna altijd een map met enorm veel kleine bestanden. Bekende voorbeelden: PHP-sessiebestanden die niet worden opgeruimd, een cache van een applicatie of framework die per pagina of per afbeelding een bestand maakt, een mailwachtrij vol berichten die niet weg kunnen, mailboxen met per bericht een bestand, of een script dat elke minuut een tijdelijk bestand achterlaat.

Bij gedeelde hosting geldt vaak een inode-limiet per account, los van de schijfruimte. Elk bestand telt dan mee: websitebestanden, mail, cache en back-ups. Bereik je die limiet, dan kun je niets meer uploaden en kan mail niet meer worden afgeleverd.

Zo herken je dit probleem

  • df -h toont nog vrije ruimte, maar df -i laat bij hetzelfde bestandssysteem IUse% op 100% zien.
  • Is df -h zelf ook vol, dan gaat het om bytes: zie No space left on device.
  • Het lukt niet om een nieuw (zelfs leeg) bestand te maken, maar een bestaand bestand groter maken lukt soms nog wel.
  • Op gedeelde hosting toont het hostingpaneel een teller voor ‘bestanden’ of ‘inodes’ die aan het maximum zit.

Zo los je het op, stap voor stap

Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.

  1. Controleer het inodegebruik

    Vergelijk de ruimte en de inodes van hetzelfde bestandssysteem. Staat IUse% op of vlak bij 100%, dan weet je dat het om het aantal bestanden gaat en niet om de grootte.

    df -h /
    df -i /
    df -i
  2. Vind de map met de meeste bestanden

    Met du --inodes tel je per map het aantal inodes in plaats van bytes. Begin bij de root en ga steeds een niveau dieper in de map met het hoogste getal. -x zorgt dat je binnen hetzelfde bestandssysteem blijft. Dit kan bij miljoenen bestanden even duren.

    sudo du --inodes -x --max-depth=1 / 2>/dev/null | sort -n
    sudo du --inodes -x --max-depth=1 /var 2>/dev/null | sort -n
  3. Kijk naar sessies en cache

    Veelvoorkomende plekken zijn de PHP-sessiemap, de cache- en tijdelijke mappen van je applicatie en /tmp. Kijk wat de bestanden zijn en hoe oud ze zijn voordat je iets weghaalt. Waar de PHP-sessies staan, lees je af uit de instelling session.save_path; op Debian en Ubuntu is dat meestal /var/lib/php/sessions.

    sudo ls -f /var/lib/php/sessions | head
    sudo find /var/lib/php/sessions -type f | wc -l
    php -i | grep session.save_path
  4. Controleer de mailwachtrij

    Een mailserver die niet kan afleveren, of een gehackt formulier dat spam verstuurt, vult de wachtrij met duizenden berichten. Bij Postfix bekijk je de wachtrij met mailq en zie je het aantal onderaan. Zoek eerst de oorzaak (welke afzender of welk script) voordat je de wachtrij leegt; anders loopt hij meteen weer vol.

    mailq | tail -n 1
    sudo postqueue -p | head -n 40
    # na onderzoek, alleen uitgestelde berichten verwijderen:
    sudo postsuper -d ALL deferred
  5. Ruim op met find, niet met rm *

    Een rm * in een map met honderdduizenden bestanden faalt met ‘Argument list too long’. Gebruik find met -delete, en beperk het tot bestanden ouder dan een bepaalde leeftijd. Draai de opdracht eerst zonder -delete om te zien wat er weg zou gaan.

    sudo find /pad/naar/cache -type f -mtime +7 | head
    sudo find /pad/naar/cache -type f -mtime +7 -delete
  6. Zorg dat opruimen automatisch gebeurt

    Repareer de bron, anders sta je over een paar weken weer op 100%. Controleer of de opruimtaak voor PHP-sessies draait, geef de applicatiecache een maximale leeftijd en laat tijdelijke bestanden door het script zelf verwijderen. Een dagelijkse cronjob met find … -mtime +N -delete is een eenvoudige vangrail. Werkt die niet, kijk dan bij cronjob draait niet.

  7. Gedeelde hosting: tel je bestanden per onderdeel

    Bij gedeelde hosting heb je geen df -i voor de hele server, maar het paneel toont meestal het aantal bestanden. Ruim oude back-ups, cachemappen en ongebruikte installaties op, en leeg mailmappen als prullenbak en spam. Bewaar back-ups niet als losse bestanden in je account maar als één archief, of buiten de hosting.

  8. Overweeg een ander bestandssysteem of meer inodes

    Heb je structureel miljoenen kleine bestanden nodig, dan kan het bestandssysteem zelf de beperking zijn. Bij ext4 ligt het aantal inodes vast en kun je het alleen bij het opnieuw aanmaken verhogen (met de opties -i of -N van mkfs.ext4), wat al je data op die schijf wist. XFS en Btrfs wijzen inodes dynamisch toe. Vaak is het verstandiger de applicatie minder losse bestanden te laten maken, bijvoorbeeld door cache in Redis of de database te zetten.

Let op: Verwijder geen bestanden op basis van alleen de mapnaam. Een map die op cache lijkt kan uploads van klanten of mail bevatten. Kijk eerst wat er staat en draai find altijd eerst zonder -delete.

Schijf vol of inodes op?

Beide geven dezelfde melding, maar ze hebben een andere oplossing:

  • Bytes op (df -h op 100%): weinig grote bestanden, zoals logs, back-ups en databasebestanden. Oplossen door grote bestanden op te ruimen.
  • Inodes op (df -i op 100%): heel veel kleine bestanden, zoals sessies, cache en mail. Oplossen door het aantal bestanden terug te brengen.
  • Een map met miljoenen bestanden maakt ook ls en back-ups traag; ook zonder deze fout is dat een signaal.

Wanneer schakel je hulp in?

  • Je vindt de map met te veel bestanden niet, of de teller loopt na opruimen snel weer op.
  • De mailwachtrij zit vol en je vermoedt dat er via je website of een account spam wordt verstuurd.
  • Je twijfelt of bestanden in een map weg mogen omdat er mogelijk klantdata tussen staat.
  • Je wilt de applicatie of de opslag zo inrichten dat dit niet meer gebeurt.

Lukt het niet? Wij helpen

Kom je er met deze stappen niet uit, of wil je het liever niet zelf doen? We kijken online mee of komen langs. Hulp op afstand kost €20 per uur; komen we langs, dan is de prijs op aanvraag. Je weet vooraf waar je aan toe bent.

Aanvraag

Hulp aanvragen

Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.

Veelgestelde vragen

Vragen over dit probleem

Wat is een inode?

Een inode is het registratiekaartje van één bestand of map in het bestandssysteem. Elk bestand gebruikt er één, hoe klein het ook is.

Hoe controleer ik of de inodes op zijn?

Met df -i. Staat IUse% op 100% terwijl df -h nog ruimte toont, dan is de inode-limiet bereikt.

Kan ik het aantal inodes verhogen?

Bij ext4 alleen door het bestandssysteem opnieuw aan te maken, wat de data wist. Meestal is het beter om het aantal bestanden terug te brengen.

Waarom krijg ik op mijn hostingpakket een inode-limiet?

Veel bestanden belasten de server en de back-ups, ook als ze klein zijn. Daarom geldt bij gedeelde hosting vaak een maximum aantal bestanden naast de schijfruimte.