No space left on device. 서버 운영에서 가장 자주 만나는 경고입니다. 추측하지 말고 위에서 아래로 좁혀갑니다: 어느 파티션이 → 어느 디렉터리가 → 어느 파일이.
1단계 — 어느 파티션이 찼나 (df)
로컬 터미널
df -h
Use%가 100%에 가까운 마운트를 찾습니다. /가 찼는지, 별도 마운트(/var, /data)가 찼는지부터 가립니다. inode 고갈도 흔하니 함께 봅니다.
로컬 터미널
df -i # inode 사용률 (작은 파일이 너무 많을 때)
2단계 — 어느 디렉터리가 무거운가 (du)
찬 파티션의 최상위부터 큰 디렉터리를 따라 내려갑니다.
로컬 터미널
du -h --max-depth=1 / | sort -rh | head
# 큰 디렉터리로 cd 후 반복
du -h --max-depth=1 /var | sort -rh | head
흔한 범인: /var/log(로그 폭증), /var/lib/docker(이미지·컨테이너), 애플리케이션 업로드 디렉터리.
3단계 — 지웠는데 왜 안 줄지? (lsof)
파일을 rm 했는데 df가 그대로라면, 프로세스가 그 파일을 아직 열고 있어서 공간이 반환되지 않은 것입니다(deleted but open).
로컬 터미널
lsof +L1 | grep deleted
해당 프로세스를 재시작(또는 안전하게 로그를 truncate)하면 공간이 돌아옵니다.
로컬 터미널
: > /var/log/huge.log # 파일을 비움(프로세스 유지)
흔한 빠른 해결
- 로그:
journalctl --vacuum-size=200M, logrotate 점검 - 도커:
docker system df로 확인 후docker system prune(주의: 사용 안 하는 리소스 삭제) - inode 고갈: 작은 파일 대량 디렉터리(캐시·세션) 정리
순서 요약
로컬 터미널
df -h # 어느 파티션
df -i # inode도
du -h --max-depth=1 <마운트> | sort -rh | head # 어느 디렉터리
lsof +L1 | grep deleted # 지워도 안 줄 때
df·du·lsof로 디스크 문제를 직접 추적하는 실습과 로그·프로세스 운영 감각은 리눅스 트랙에서 무료로 익힐 수 있습니다.