지식
Linux
디스크 풀 문제 해결 — df·du·find로 공간 확보
No space left on device 오류가 발생했을 때 df, du, find, lsof를 이용해 원인을 단계적으로 좁히고 공간을 확보하는 방법, inode 고갈과 삭제된 파일 문제까지 다룹니다.
지난 글에서 로그인 실패 원인을 진단하는 법을 살펴봤습니다. 이번에는 No space left on device 오류가 발생했을 때의 대응법입니다. 서버가 갑자기 멈추는 가장 흔한 원인 중 하나입니다.
1단계: 어느 파티션인지 확인
# 파티션별 디스크 사용량 (사람이 읽기 편한 단위)
df -h
# Filesystem Size Used Avail Use% Mounted on
# /dev/sda1 50G 50G 0 100% /
# /dev/sda2 200G 80G 110G 42% /data
# inode 사용량 확인 (블록 여유 있어도 inode 고갈 가능)
df -i
# Filesystem Inodes IUsed IFree IUse% Mounted on
# /dev/sda1 3276800 3276800 0 100% / ← inode 고갈!
Use%가 100%여도 IUse%가 100%여도 “No space left”가 발생합니다. 반드시 두 가지 모두 확인해야 합니다.
2단계: 큰 디렉터리 찾기
# 루트부터 내려가며 단계적으로 찾기
du -sh /* 2>/dev/null | sort -rh | head -15
# 용의자 디렉터리로 좁히기 (예: /var)
du -sh /var/* 2>/dev/null | sort -rh | head -10
# 로그 디렉터리
du -sh /var/log/* | sort -rh
흔한 원인과 해결책
로그 파일 폭발
# 저널 크기 확인
journalctl --disk-usage
# 즉시 정리 (500MB로 제한)
sudo journalctl --vacuum-size=500M
# 또는 30일 이전 삭제
sudo journalctl --vacuum-time=30d
# 로그 파일 직접 정리
sudo truncate -s 0 /var/log/syslog
sudo find /var/log -name "*.gz" -mtime +7 -delete
sudo find /var/log -name "*.1" -delete
패키지 캐시
# apt 캐시 (Debian/Ubuntu)
sudo apt clean # 다운로드 캐시 삭제
sudo apt autoremove # 불필요한 패키지 삭제
# dnf/yum 캐시 (RHEL/CentOS/Fedora)
sudo dnf clean all
# pip 캐시
pip cache purge
Docker 데이터
# Docker 사용량 확인
docker system df
# 정지된 컨테이너, 미사용 이미지·볼륨 삭제
docker system prune -f
docker volume prune -f
docker image prune -a -f
코어 덤프 파일
# 코어 덤프 위치 확인
cat /proc/sys/kernel/core_pattern
# /var/crash/core.%e.%p
# 코어 덤프 정리
sudo find / -name "core.*" -type f -size +10M -ls 2>/dev/null
sudo find /var/crash -type f -delete
삭제된 파일이 공간을 차지하는 경우
df는 100%를 보여주는데 du로 합산해도 공간이 맞지 않는 경우, 프로세스가 파일 디스크립터를 열어 놓은 채로 파일을 삭제했을 가능성이 높습니다. 파일 디스크립터가 닫혀야 실제 블록이 해제됩니다.
# 삭제됐지만 열려있는 파일 찾기 (link count = 0)
lsof +L1
# COMMAND PID USER FD TYPE ... SIZE NLINK NAME
# nginx 1234 www 4w REG ... 8.5G 0 /var/log/nginx.log (deleted)
# 해결: 해당 프로세스 재시작
sudo systemctl restart nginx
# 또는 트런케이트 (파일 내용 비우기)
echo "" > /proc/1234/fd/4
inode 고갈 진단
# 어느 디렉터리에 파일이 많은지 찾기
find / -xdev -printf '%h\n' 2>/dev/null \
| sort | uniq -c | sort -rn | head -10
# 예: /var/spool/postfix/deferred 에 메일 큐 쌓임
ls /var/spool/postfix/deferred | wc -l
# 1234567 ← 소파일 수백만 개
# 빠르게 삭제 (rm은 인자 제한 있음)
find /var/spool/postfix/deferred -type f -delete
inode 고갈은 임시 파일 디렉터리(/tmp, /var/tmp, /var/spool)에서 소파일이 대량 생성될 때 발생합니다.
예방 — logrotate와 모니터링
# /etc/logrotate.d/nginx 예시
# /var/log/nginx/*.log {
# daily
# rotate 7
# compress
# delaycompress
# missingok
# notifempty
# }
# 디스크 사용량 경보 (cron)
# df -h | awk '$5+0 > 80 {print}' | mail -s "Disk Alert" admin@example.com
# 현재 상위 디렉터리 사용량 모니터링
watch -n 5 'df -h && echo "---" && du -sh /var/* 2>/dev/null | sort -rh | head -5'
빠른 응급 처치 체크리스트
# 1. 파티션 확인
df -h && df -i
# 2. 로그 정리
sudo journalctl --vacuum-size=200M
# 3. 패키지 캐시 정리
sudo apt clean 2>/dev/null || sudo dnf clean all 2>/dev/null
# 4. 임시 파일 정리
sudo find /tmp /var/tmp -mtime +7 -delete 2>/dev/null
# 5. 삭제 파일 FD 확인
lsof +L1 | awk '{if(NR>1) print $1,$2,$7,$NF}' | head -10
지난 글: 로그인이 안 될 때 — 계정·PAM·쉘 문제 진단
다음 글: Too many open files — 파일 디스크립터 한도 문제 해결
읽어주셔서 감사합니다. 😊