✦ Oplossingen · Server- en developerfouten

No space left on device (ENOSPC): schijf van de server vol

‘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.

Zo ziet de foutmelding eruit

  • No space left on device
  • ENOSPC: no space left on device, write
  • write error: No space left on device
  • OSError: [Errno 28] No space left on device
  • Errcode: 28 - No space left on device

Waarom gebeurt dit?

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.

Zo herken je dit probleem

  • df -h toont bij een bestandssysteem Use% op of vlak bij 100%.
  • Toont df -h nog ruimte, maar staat df -i op 100%, dan heb je een inode-probleem.
  • De melding verschijnt bij schrijven (opslaan, uploaden, installeren), niet bij lezen; de site toont soms gewoon pagina’s maar formulieren en inloggen falen.
  • Gaat het om je eigen Windows-pc, dan is het een ander probleem: zie C-schijf vol in Windows.

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. Stel vast welke schijf vol is

    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/mysql
  2. Zoek de grootste mappen

    Met 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/null
  3. Ruim het systeemjournaal en pakketcache op

    Het 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 autoremove
  4. Pak grote logbestanden aan

    Een 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/app
  5. Zoek verwijderde bestanden die nog open zijn

    Zegt 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-dienst
  6. Controleer Docker

    Docker 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 --volumes
  7. Ruim database-binlogs op via de database

    MySQL 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 = 259200
  8. Voorkom herhaling

    Kijk 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.

Eerste hulp als de server bijna niets meer doet

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.

  • Herstart diensten pas als er weer ruimte is; een database die opstart op een volle schijf kan opnieuw vastlopen.
  • Controleer daarna of de website, mail en database weer schrijven, bijvoorbeeld door in te loggen of een formulier te versturen.
  • Geeft de site daarna nog een fout, kijk dan bij 500 Internal Server Error of Error establishing a database connection.

Wanneer schakel je hulp in?

  • De database start niet meer op nadat de schijf vol is gelopen.
  • Je vindt niet wat de ruimte inneemt, of de schijf loopt na opruimen binnen korte tijd weer vol.
  • Je twijfelt of bepaalde bestanden, volumes of binlogs weg mogen.
  • Je wilt de schijf vergroten of monitoring en logrotatie goed laten inrichten.

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 betekent ‘No space left on device’?

Het bestandssysteem waarop een programma wil schrijven is vol. Controleer met df -h welk bestandssysteem het is en met du wat er ruimte inneemt.

Ik heb bestanden verwijderd, maar df toont nog steeds 100%.

Waarschijnlijk houdt een proces de verwijderde bestanden nog open. Zoek ze met lsof +L1 en herstart dat proces.

Mag ik /var/log leeggooien?

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.

Waarom krijg ik deze fout terwijl er nog ruimte vrij is?

Dan zijn vaak de inodes op: het maximale aantal bestanden. Controleer dat met df -i.