‘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.
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.
df -h toont nog vrije ruimte, maar df -i laat bij hetzelfde bestandssysteem IUse% op 100% zien.df -h zelf ook vol, dan gaat het om bytes: zie No space left on device.Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.
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 -iMet 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 -nVeelvoorkomende 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_pathEen 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 deferredEen 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 -deleteRepareer 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.
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.
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.
Beide geven dezelfde melding, maar ze hebben een andere oplossing:
df -h op 100%): weinig grote bestanden, zoals logs, back-ups en databasebestanden. Oplossen door grote bestanden op te ruimen.df -i op 100%): heel veel kleine bestanden, zoals sessies, cache en mail. Oplossen door het aantal bestanden terug te brengen.ls en back-ups traag; ook zonder deze fout is dat een signaal.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.
Schrijf kort wat er misgaat en wat je al hebt geprobeerd. Kies of we bellen, online meekijken of langskomen.
Een inode is het registratiekaartje van één bestand of map in het bestandssysteem. Elk bestand gebruikt er één, hoe klein het ook is.
Met df -i. Staat IUse% op 100% terwijl df -h nog ruimte toont, dan is de inode-limiet bereikt.
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.
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.
Hulp nodig van een mens? Website-onderhoud · Hosting en onderhoud · WordPress-support · Alle oplossingen