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


2 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