‘No space left on device’ of ENOSPC op Linux? De schijf is vol. Zo vind je met df en du wat ruimte inneemt en ruim je logs, cache en binlogs veilig op.
No space left on device (in Node.js en andere programma’s ENOSPC, foutnummer 28) betekent dat het besturingssysteem een schrijfactie weigert omdat het bestandssysteem vol is. Dat raakt alles wat iets wegschrijft: logbestanden, uploads, sessies, de database, pakketupdates en tijdelijke bestanden. Een website kan daardoor ineens 500-fouten geven, een database stopt, mail blijft hangen en inloggen via SSH duurt lang of mislukt.
De gebruikelijke oorzaken op een server: logbestanden die nooit worden opgeruimd of geroteerd, het systeemjournaal van systemd dat blijft groeien, back-ups die op dezelfde schijf blijven staan, Docker-images en build-cache, database-binlogs (het wijzigingslog van MySQL of MariaDB) en oude pakketbestanden. Een lastig geval: een groot bestand is al verwijderd, maar een proces houdt het nog open. De ruimte komt dan pas vrij als dat proces stopt.
Er is ook een variant waarbij df -h nog ruimte toont, maar je toch deze melding krijgt. Dan zijn meestal niet de bytes maar de inodes op (het maximale aantal bestanden). Dat behandelen we apart op inode-limiet bereikt.
df -h toont bij een bestandssysteem Use% op of vlak bij 100%.df -h nog ruimte, maar staat df -i op 100%, dan heb je een inode-probleem.Menunamen kunnen per versie of toestel iets anders heten. Loop de stappen op volgorde af en stop zodra het werkt.
Kijk eerst welk bestandssysteem vol is; dat is niet altijd /. Vaak zijn /var, /home, /tmp of een losse dataschijf apart gekoppeld. Kijk in de kolom Mounted on waar het probleem zit.
df -h
df -h /var/lib/mysqlMet du zie je per map hoeveel ruimte hij inneemt. De optie -x blijft binnen hetzelfde bestandssysteem, zodat andere schijven en netwerkkoppelingen niet meetellen. Ga daarna steeds een niveau dieper in de grootste map tot je de boosdoener vindt.
sudo du -xh --max-depth=1 / 2>/dev/null | sort -h
sudo du -xh --max-depth=1 /var 2>/dev/null | sort -h
sudo find / -xdev -type f -size +500M -exec ls -lh {} + 2>/dev/nullHet journaal van systemd kan ongemerkt veel ruimte innemen. Met --vacuum-size houd je alleen de nieuwste gegevens tot de opgegeven grootte. Op Debian en Ubuntu ruimt apt clean gedownloade pakketbestanden op en verwijdert apt autoremove pakketten die niet meer nodig zijn, zoals oude kernels. Controleer bij autoremove de lijst voordat je bevestigt.
journalctl --disk-usage
sudo journalctl --vacuum-size=200M
sudo apt clean
sudo apt autoremoveEen logbestand van vele gigabytes moet je niet met rm verwijderen terwijl een dienst ernaar schrijft: de ruimte komt dan niet vrij. Maak het bestand leeg met truncate, of comprimeer en verplaats het eerst als je het nog nodig hebt. Zorg daarna dat logrotate het bestand voortaan roteert en oude versies opruimt. Met -d test je een configuratie zonder iets te doen.
sudo truncate -s 0 /var/log/app/groot.log
ls /etc/logrotate.d/
sudo logrotate -d /etc/logrotate.d/appZegt df dat de schijf vol is, maar vindt du veel minder, dan houdt een proces vaak een verwijderd bestand open. lsof +L1 toont bestanden met nul koppelingen die nog in gebruik zijn, met het proces erbij. Herstart dat proces of die dienst; dan komt de ruimte vrij.
sudo lsof +L1
sudo systemctl restart naam-van-de-dienstDocker bewaart images, gestopte containers, volumes en build-cache. docker system df laat zien hoeveel elk onderdeel inneemt. docker system prune verwijdert gestopte containers, ongebruikte netwerken, losse images en build-cache. Met -a gaan ook alle images weg die geen container gebruikt, en met --volumes ook ongebruikte volumes: daar kan databasedata in staan.
docker system df
docker system prune
# alleen als je zeker weet wat er weg mag:
# docker system prune -a --volumesMySQL en MariaDB schrijven met binlogs elke wijziging weg voor replicatie en herstel. Zonder bewaartermijn groeien die onbeperkt. Verwijder ze nooit met rm, maar via PURGE BINARY LOGS, en stel een bewaartermijn in. Gebruik je replicatie, controleer dan eerst dat de replica de logs al heeft verwerkt.
mysql -e "SHOW BINARY LOGS;"
mysql -e "PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY;"
# in de serverconfiguratie (my.cnf), bijvoorbeeld 3 dagen:
[mysqld]
binlog_expire_logs_seconds = 259200Kijk waar de groei vandaan kwam: een back-upscript dat lokaal blijft bewaren, een applicatie die op debugniveau logt of een cache zonder opruimregel. Zet een melding op een vrije-ruimtegrens, zodat je het merkt voordat diensten stoppen. Op ext4 houdt het systeem standaard een deel van de ruimte gereserveerd voor root; daardoor kan root soms nog schrijven terwijl andere gebruikers al deze fout krijgen.
Let op: Verwijder niet op de gok bestanden uit /var/lib, /usr of databasemappen. Een vol bestandssysteem is vervelend, maar een verwijderd databasebestand of een kapotte pakketinstallatie is veel lastiger te herstellen.
Is de schijf helemaal vol, dan werken soms zelfs tabaanvulling in de shell en sudo niet goed meer. Begin dan met snelle, veilige winst: het journaal inkorten, de pakketcache legen of één groot logbestand leegmaken. Daarmee heb je ruimte om rustig verder te zoeken.
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.
Het bestandssysteem waarop een programma wil schrijven is vol. Controleer met df -h welk bestandssysteem het is en met du wat er ruimte inneemt.
Waarschijnlijk houdt een proces de verwijderde bestanden nog open. Zoek ze met lsof +L1 en herstart dat proces.
Niet in één keer. Maak grote logbestanden leeg met truncate of laat logrotate oude versies opruimen, zodat diensten blijven werken en je recente logs behoudt.
Dan zijn vaak de inodes op: het maximale aantal bestanden. Controleer dat met df -i.
Hulp nodig van een mens? Website-onderhoud · Hosting en onderhoud · WordPress-support · Alle oplossingen