How to Force Remove “Device or Resource Busy” Files in Linux When Docker Processes Are Holding Locks


11 views

Many Linux administrators encounter this frustrating scenario when trying to clean up Docker files:

$ sudo rm -rf /var/lib/docker/
rm: cannot remove '/var/lib/docker/aufs': Device or resource busy

Standard tools like lsof and ps often fail to identify the culprit:

$ sudo lsof +D /var/lib/docker/
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system
$ ps aux | grep docker
user   5349  0.0  0.0  14224  1024 pts/18 S+ 15:21 0:00 grep docker

Try these more thorough approaches:

$ sudo fuser -vm /var/lib/docker/
                     USER        PID ACCESS COMMAND
/var/lib/docker:     root     kernel mount /var/lib/docker

For systems without fuser:

$ sudo apt install psmisc  # For Debian/Ubuntu
$ sudo yum install psmisc  # For RHEL/CentOS

Check for mounted filesystems:

$ mount | grep docker
aufs on /var/lib/docker/aufs type aufs (rw,relatime,si=abc123)

When all else fails:

$ sudo umount -l /var/lib/docker/aufs
$ sudo rm -rf /var/lib/docker/

Always stop Docker service first:

$ sudo systemctl stop docker
$ sudo systemctl stop docker.socket
$ sudo rm -rf /var/lib/docker/

For containerized processes:

$ sudo lsns -t mnt
$ sudo nsenter -t [PID] -m -- umount /var/lib/docker/aufs

When attempting to remove Docker directories like /var/lib/docker/, you might encounter the frustrating "Device or resource busy" error. This typically occurs when:

  • Docker daemon or containers are still running
  • Filesystems are mounted from that location
  • Kernel processes maintain open file handles

The standard lsof approach often fails with Docker storage drivers. Here are more effective alternatives:

# Check for mount points
mount | grep /var/lib/docker

# Find processes using the directory (more reliable than lsof)
sudo fuser -vm /var/lib/docker/

# Alternative if fuser isn't available
sudo ls -l /proc/*/fd/ 2>/dev/null | grep /var/lib/docker

When you've confirmed no critical processes are running:

# First attempt graceful shutdown
sudo systemctl stop docker docker.socket containerd

# If still busy, use namespace inspection
sudo nsenter -m -u -n -i -p -t $(pgrep dockerd) -- umount /var/lib/docker/aufs

# Nuclear option (only if absolutely necessary)
sudo umount -l /var/lib/docker/aufs
sudo rm -rf /var/lib/docker

For production systems, consider these safer alternatives:

# Proper Docker cleanup
sudo docker system prune --all --volumes --force

# Reinitialize Docker storage
sudo systemctl stop docker
sudo rm -rf /var/lib/docker/*
sudo systemctl start docker