디스크가 꽉 차면 서버는 갑자기 다운될 수 있습니다. 로그 파일이나 임시 파일이 쌓여 발생하는 디스크 부족 문제를 예방하고 대응하는 방법을 알아봅니다.

현재 디스크 상황 파악

# 전체 디스크 사용량 (사람이 읽기 쉬운 형식)
df -h

# 출력 예시:
# Filesystem      Size  Used Avail Use% Mounted on
# /dev/sda1        50G   38G  9.5G  80% /
# /dev/sdb1       500G  230G  245G  49% /data

# inode 사용량 확인 (파일 수가 많을 때 inode 부족 발생 가능)
df -i

du로 디렉터리별 사용량 분석

# 특정 디렉터리의 사용량
du -sh /var/log

# 현재 디렉터리의 하위 항목별 사용량 (1단계)
du -h --max-depth=1 /var | sort -rh

# 상위 10개 대용량 디렉터리 찾기
du -h /var | sort -rh | head -10

# /var/log 하위 정리
du -sh /var/log/*

대용량 파일 찾기

# 100MB 이상 파일 찾기
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null

# 1GB 이상 파일 (사람이 읽기 쉬운 정렬)
find / -type f -size +1G 2>/dev/null | xargs ls -lh | sort -k5 -rh

# 특정 디렉터리에서 최근 수정된 대용량 파일
find /var -type f -size +50M -mtime -7 -ls

로그 파일 정리

# Nginx 로그 수동 압축
gzip /var/log/nginx/access.log.1

# journald 로그 정리 (systemd)
sudo journalctl --disk-usage
sudo journalctl --vacuum-time=7d     # 7일 이상된 로그 삭제
sudo journalctl --vacuum-size=500M   # 500MB 초과분 삭제

# 오래된 로그 삭제
find /var/log -name "*.log" -mtime +30 -delete
find /var/log -name "*.gz" -mtime +60 -delete

임시 파일 정리

# /tmp 정리 (오래된 파일)
find /tmp -type f -atime +7 -delete

# apt 캐시 정리
sudo apt clean
sudo apt autoremove -y

# Docker 미사용 리소스 정리
docker system prune -a

# pip 캐시 정리
pip cache purge

# npm 캐시 정리
npm cache clean --force

디스크 사용량 모니터링 스크립트

#!/bin/bash
# /opt/disk-alert.sh
# 디스크 사용량이 임계값 초과 시 알림

THRESHOLD=80
ALERT_LOG="/var/log/disk-alert.log"

df -h | grep -vE '^Filesystem|tmpfs|cdrom' | while read line; do
    USAGE=$(echo $line | awk '{print $5}' | sed 's/%//')
    MOUNT=$(echo $line | awk '{print $6}')

    if [ "$USAGE" -gt "$THRESHOLD" ]; then
        MSG="[ALERT] $(date '+%Y-%m-%d %H:%M') - $MOUNT: ${USAGE}% 사용 중"
        echo "$MSG" >> $ALERT_LOG
        echo "$MSG"

        # 텔레그램 알림 (선택)
        # curl -s "https://api.telegram.org/bot토큰/sendMessage" \
        #     -d "chat_id=채팅ID&text=$MSG"
    fi
done
# 실행 권한 부여 및 cron 등록 (1시간마다 실행)
chmod +x /opt/disk-alert.sh
echo "0 * * * * root /opt/disk-alert.sh" | sudo tee /etc/cron.d/disk-alert

디스크 사용량 정기 리포트

#!/bin/bash
# /opt/disk-report.sh
# 매주 디스크 현황 리포트

REPORT=$(df -h | grep -v tmpfs)

echo "=== 서버 디스크 현황 $(date '+%Y년 %m월 %d일') ==="
echo "$REPORT"
echo ""
echo "=== 대용량 파일 TOP 10 ==="
find / -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -rh | head -10

디스크가 꽉 찬 경우 긴급 조치

# 1. 현황 파악
df -h && du -sh /* 2>/dev/null | sort -rh | head -20

# 2. 대용량 파일 즉시 삭제
find /var/log -name "*.log" -size +100M -delete

# 3. 오래된 백업 파일 삭제
find /backup -mtime +30 -delete

# 4. 패키지 캐시 정리
sudo apt clean

# 5. journald 로그 축소
sudo journalctl --vacuum-size=100M

# 6. 임시 파일 정리
sudo rm -rf /tmp/* /var/tmp/*

파티션 별 모니터링

# 디스크 I/O 통계
iostat -x 1 5

# 특정 프로세스의 디스크 사용량
sudo iotop

# 디스크 상태 확인 (SMART)
sudo apt install -y smartmontools
sudo smartctl -a /dev/sda

디스크 부족은 서버 장애의 흔한 원인입니다. logrotate 설정(별도 포스팅 참조)과 함께 주기적인 정리 스크립트를 운영하면 디스크 부족으로 인한 장애를 예방할 수 있습니다.