Fixing 'No Space Left on Device' Errors When Your Disk Isn't Full

intermediate🐧 Linux2026-07-17| Any Linux distribution (Ubuntu, Debian, CentOS, RHEL) using filesystems like Ext4 or XFS.

Error Message

No space left on device (despite having free disk space)
#linux#inode#sysadmin#troubleshooting

The 'Ghost' Space Problem

It is a frustrating scenario. You check your disk with df -h and it shows 50GB of free space, yet every time you try to save a file, Linux screams: No space left on device. This usually means you have run out of Inodes.

Think of an Inode as a record in a filesystem's database. Every single file, directory, or symlink requires one Inode. If your filesystem was formatted to allow 1 million Inodes and you create 1 million tiny files, you cannot create a 1,000,001st file—even if you have 500GB of physical space left.

1. Confirm the Inode Shortage

The standard disk check doesn't show Inode health. You need the -i flag instead:

df -i

Check the IUse% column. If a partition shows 99% or 100% usage, you have hit the wall. On a standard 20GB Ext4 partition, you typically have about 1.3 million Inodes. Once those are gone, the system stops dead.

2. Track Down the File Hoarders

Next, you need to find where those millions of files are hiding. This usually isn't one giant file, but millions of tiny 0KB or 1KB files. Run this command to count files per directory (this may take several minutes on slow disks):

sudo find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n | tail -n 20

This command lists the top 20 directories with the highest file counts. If you see a directory with 500,000+ files, you’ve found your target.

3. Purge the Junk

When a directory contains millions of files, running rm * will likely crash with an "Argument list too long" error. This happens because the shell cannot handle that many arguments at once. Use find to delete them safely in batches:

sudo find /path/to/bloated/dir -type f -delete

Common Culprits and Real-World Scenarios

Why does this happen? Usually, it is a background process or a misconfigured app. On an average web server, the usual suspects are:

  • Abandoned PHP Sessions: If php.ini isn't cleaning up, /var/lib/php/sessions can easily balloon to 2 million tiny files.
  • The Maildrop Nightmare: If local system mail is broken, /var/spool/postfix/maildrop can fill up with hundreds of thousands of small error notifications.
  • Unmanaged Microservices: Docker containers or Node.js apps generating millions of small temporary cache files or logs that never rotate.
  • Deeply Nested Directories: Automated build tools that create massive dependency trees without cleaning up old versions.

Advanced Recovery Methods

Method 1: Selective Deletion

If you need to keep recent data but clear out the old junk—like session files older than three days—use this command:

sudo find /var/lib/php/sessions -type f -mtime +3 -delete

Method 2: Emptying Postfix Queues

If your mail spool is the bottleneck, don't just delete files manually. Use the dedicated tool to clear the queue safely:

sudo postsuper -d ALL

Method 3: Hunting Ghost File Descriptors

Sometimes you delete millions of files, but df -i still shows 100% usage. This happens because a running process (like Nginx or Apache) still has those files open. The Linux kernel won't release the Inode until the process closes the file. Find these "ghost" files here:

sudo lsof | grep deleted

If you see a service holding onto thousands of deleted files, restart it to force the Inode release:

sudo systemctl restart [service_name]

How to Prevent a Recurrence

Cleaning up is only half the battle. To stop this from happening again, implement these three checks:

  • Fix Logrotate: Ensure your logs are compressed and deleted after a certain period. A single unrotated log directory can eat 100k Inodes in a month.
  • Set Inode Alerts: Most monitoring tools (like Nagios or Zabbix) only watch disk GB. Update your alerts to trigger when df -i hits 80%.
  • Check Cron Jobs: Ensure your automated scripts include a cleanup step. If a script creates a temp file every minute, it will consume 525,600 Inodes in a year.

Related Error Notes