리눅스 서버 관리 중 디스크 용량이 100%(No space left on device)에 도달하여 서비스가 중단되었을 때, 원인을 신속하게 진단하고 디스크 공간을 확보하는 체계적인 가이드입니다.
1. 1단계: 디스크 사용량 및 Inode 상태 확인
가장 먼저 물리적 용량 부족인지, 아니면 파일 개수 초과(Inode 부족)인지 확인해야 합니다.
전체 디스크 용량 점검 (df -h)
df -h
- 특정 파티션(예:
/또는/var)의Use%가 100%에 달했는지 확인합니다.
Inode 사용량 점검 (df -i)
df -i
- 용량이 남아있어도 소형 파일이 너무 많으면 Inode 사용율(
IUse%)이 100%가 되어 파일 생성이 불가능해집니다.
2. 2단계: 대용량 파일 및 디렉토리 위치 탐색
어느 디렉토리에서 디스크를 과도하게 사용하고 있는지 추적합니다.
상위 용량 차지 디렉토리 탐색 (du)
# 루트(/) 기준 가장 많은 용량을 차지하는 상위 10개 디렉토리 확인
du -h --max-depth=1 /var 2>/dev/null | sort -hr | head -n 10
100MB 이상 대용량 파일 탐색 (find)
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | awk '{ print $5, $9 }' | sort -hr
인터랙티브 디스크 분석 도구 사용 (ncdu)
sudo apt install ncdu
ncdu /var
- 방향키로 디렉토리를 탐색하며 용량 소비 주범을 직관적으로 확인할 수 있습니다.
3. 3단계: 주요 용량 소비 요소별 안전 정리법
① 리눅스 시스템 로그 정리 (journalctl)
시스템 로깅 서비스인 systemd-journald의 오래된 로그를 비웁니다.
# 현재 저널 로그 용량 확인
journalctl --disk-usage
# 최근 3일치 로그만 남기고 삭제
sudo journalctl --vacuum-time=3d
# 용량을 500M 이내로 제한하고 이전 로그 삭제
sudo journalctl --vacuum-size=500M
② Docker 및 컨테이너 리소스 정리 (docker system prune)
Docker 빌드 캐시, 멈춘 컨테이너, 미사용 이미지 및 로그 파일은 디스크 부족의 주요 원인입니다.
# 도커 용량 사용 현황 분석
docker system df
# 미사용 컨테이너, 네트워크, 캐시 일괄 삭제
docker system prune -f
# 사용하지 않는 모든 이미지 포함 완전 삭제
docker system prune -a --volumes -f
# 특정 컨테이너의 json-log 파일 크기 초기화
truncate -s 0 /var/lib/docker/containers/*/*-json.log
③ APT 패키지 매니저 캐시 정리
sudo apt clean
sudo apt autoclean
sudo apt autoremove --purge
4. 4단계: 특수 상황 - 삭제했으나 용량이 확보되지 않는 경우 (Deleted Open Files)
파일을 삭제(rm)했음에도 프로세스가 해당 파일을 계속 쥐고(Open) 있으면 디스크 용량이 반환되지 않습니다.
삭제된 상태로 열려있는 파일 추적 (lsof)
lsof | grep deleted
해결 방법
해당 파일 프로세스를 재시작하거나 프로세스 PID를 확인 후 종료/파일 트렁케이트를 수행합니다.
# 예: 특정 PID가 잡고 있는 삭제 파일의 용량 즉시 비우기
cat /dev/null > /proc/<PID>/fd/<FD_NUMBER>
5. 예방법: 로그 로테이션(logrotate) 설정
/etc/logrotate.conf 또는 /etc/logrotate.d/ 하위에 앱 로그 로테이션 정책을 등록하여 파일 크기가 일정 수준을 넘거나 수일이 지나면 자동 압축/삭제되도록 유지합니다.
/var/log/my-app/*.log {
daily
missingok
rotate 7
compress
delaycompress
notifempty
create 0640 www-data www-data
}
마무리
디스크 장애 시 df -h -> du / ncdu -> journalctl/docker prune -> lsof | grep deleted 순서로 원인을 파악하면 서비스 장애를 빠르게 해결할 수 있습니다!