디스크가 꽉 찼다 — 지금 당장 무엇을 해야 하나
리눅스 서버 운영 중 갑자기 애플리케이션이 로그를 못 쓴다거나, 파일 저장이 안 된다거나, 심한 경우 서비스가 아예 다운되는 상황이 발생합니다. 원인을 추적하다 보면 상당수가 디스크 사용률 100%에서 비롯된 문제입니다. 당황하지 않고 체계적으로 접근하면 대부분 30분 안에 해결할 수 있습니다. 원인 파악부터 즉시 조치, 재발 방지까지 단계별로 정리합니다.
1단계 — 디스크 상태 전체 파악
가장 먼저 어느 파티션이 꽉 찼는지 확인합니다.
df -h
출력 결과에서 Use% 항목이 100%인 마운트 포인트를 찾습니다. 자주 문제가 되는 파티션은 /, /var, /home, /tmp입니다.
Filesystem Size Used Avail Use% Mounted on
/dev/sda1 50G 50G 0 100% /
/dev/sdb1 200G 80G 120G 40% /data
여기서 한 가지 더 확인해야 할 것이 있습니다. 디스크 용량은 남아있는데 파일 생성이 안 되는 경우라면 inode 고갈을 의심해야 합니다.
df -i
IUse% 항목이 100%라면 inode가 부족한 것입니다. 이 경우 실제 디스크 공간이 남아있어도 파일을 새로 만들 수 없습니다. 소용량 파일이 수백만 개 이상 쌓인 환경(로그, 캐시, 세션 파일)에서 주로 발생합니다.
2단계 — 어디서 공간을 잡아먹는지 찾기
문제 파티션을 찾았다면 그 안에서 가장 많은 공간을 차지하는 디렉터리를 추적합니다.
대용량 디렉터리 찾기
du -sh /* 2>/dev/null | sort -rh | head -20
루트(/)가 꽉 찬 경우 위 명령으로 1차 범위를 좁히고, 용량이 큰 디렉터리 안으로 반복해서 파고들어 갑니다.
du -sh /var/* 2>/dev/null | sort -rh | head -20
du -sh /var/log/* 2>/dev/null | sort -rh | head -20
대용량 파일 직접 찾기
find / -xdev -type f -size +1G 2>/dev/null | xargs ls -lh
find /var -type f -size +500M 2>/dev/null | xargs ls -lh
-xdev 옵션은 다른 파일 시스템으로 넘어가지 않고 현재 마운트 포인트 안에서만 탐색합니다. 루트 파티션 점검 시 필수 옵션입니다.
삭제됐지만 공간이 반환되지 않은 파일 찾기
실무에서 자주 놓치는 함정이 있습니다. 파일을 삭제했는데 df에서 공간이 줄지 않는 경우입니다. 이는 프로세스가 해당 파일을 열어두고 있어 실제로 공간이 반환되지 않은 상태이기 때문입니다.
lsof +L1 | grep -i deleted
출력 결과에서 SIZE 컬럼이 큰 항목을 확인합니다. 해결 방법은 해당 프로세스를 재시작하거나, 열린 파일 디스크립터를 통해 파일 내용을 비우는 것입니다.
# 예: PID 1234번 프로세스가 /var/log/app.log를 잡고 있는 경우
> /proc/1234/fd/3 # 파일 디스크립터 번호는 lsof 출력에서 확인
3단계 — 즉시 공간 확보 방법
로그 파일 정리
디스크 풀의 가장 흔한 원인입니다. 무작정 삭제하지 말고, 확인 후 조치합니다.
ls -lh /var/log/*.log | sort -k5 -rh | head -20
# 오래된 압축 로그 삭제 (30일 이상)
find /var/log -name "*.gz" -mtime +30 -delete
find /var/log -name "*.log.*" -mtime +30 -delete
# 특정 로그 파일 내용만 비우기 (삭제 아님 — 서비스 유지 중 안전)
> /var/log/application.log
journal 로그 정리 (systemd 환경)
journalctl --disk-usage # 현재 journal 용량 확인
journalctl --vacuum-time=7d # 7일 이전 journal 삭제
journalctl --vacuum-size=500M # 500MB 이하로 줄이기
패키지 캐시 정리
# Ubuntu / Debian
apt-get clean
apt-get autoremove
# RHEL / CentOS
yum clean all
dnf clean all
/tmp 및 코어 덤프 정리
find /tmp -mtime +7 -delete # 7일 이상 된 임시 파일 삭제
find / -name "core" -type f -size +100M 2>/dev/null -delete # 코어 덤프 삭제
inode 고갈 해결
inode가 부족한 경우 소용량 파일이 대량으로 쌓인 디렉터리를 찾아 정리합니다.
# 디렉터리별 파일 수 확인
find / -xdev -type d 2>/dev/null | while read d; do
echo "$(find "$d" -maxdepth 1 -type f | wc -l) $d"
done | sort -rn | head -20
# PHP 세션 파일 등 오래된 소용량 파일 정리 예시
find /var/lib/php/sessions -type f -mtime +7 -delete
4단계 — 재발 방지 설정
logrotate 설정 점검
로그가 무한정 쌓이지 않도록 logrotate가 올바르게 동작하는지 확인합니다.
cat /etc/logrotate.d/application # 애플리케이션 logrotate 설정 확인
logrotate -d /etc/logrotate.conf # 드라이런 — 실제 실행 없이 동작 확인
logrotate 설정의 핵심 항목은 rotate(보존 개수), size 또는 daily/weekly(순환 기준), compress(압축 여부)입니다.
디스크 사용률 모니터링 알림 설정
디스크가 80% 이상이 되면 미리 알림을 받도록 간단한 cron 스크립트를 설정합니다.
#!/bin/bash
THRESHOLD=80
df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read line; do
USAGE=$(echo "$line" | awk '{print $5}' | tr -d '%')
MOUNT=$(echo "$line" | awk '{print $6}')
if [ "$USAGE" -ge "$THRESHOLD" ]; then
echo "[ALERT] $MOUNT 디스크 사용률: ${USAGE}%" | \
mail -s "[디스크 경고] $(hostname)" admin@example.com
fi
done
# crontab에 등록 (매 시간 실행)
0 * * * * /usr/local/bin/disk_check.sh
마무리
리눅스 디스크 풀 문제는 당황스럽지만, df → du → lsof 순서로 범위를 좁혀가는 체계적 접근이면 대부분 빠르게 해결됩니다. 특히 삭제해도 공간이 안 줄어드는 lsof +L1 케이스와 inode 고갈은 놓치기 쉬운 함정이니 반드시 기억해 두세요. 사후 조치만큼 중요한 것이 logrotate와 모니터링 알림 설정을 통한 재발 방지입니다.
'IT > 리눅스' 카테고리의 다른 글
| CentOS 7 EOL 완벽 대응 가이드 — Rocky Linux vs AlmaLinux 차이점 비교 및 마이그레이션 방법 (0) | 2026.03.19 |
|---|---|
| SSH 접속 지연·Connection refused 오류 해결 — 5가지 필수 점검 사항 완전 정리 (0) | 2026.03.19 |
| 리눅스 파일 타임스탬프 완전 정복 — ctime, mtime, atime 차이점과 실무 활용법 (0) | 2026.03.18 |
| 리눅스 시스템 엔지니어를 위한 필수 네트워크 트러블슈팅 명령어 총정리 (0) | 2026.03.18 |
| Bash 쉘 스크립트로 리눅스 서버 일일 점검(Daily Check) 완전 자동화하기 (0) | 2026.03.18 |