리눅스 디스크 용량 부족 해결 방법 (No space left on device, 큰 파일 찾기)
어느 날 갑자기 MySQL이 멈추고, 워드프레스에 이미지가 안 올라가고, 터미널에는 “No space left on device”가 찍힌다. 디스크가 가득 찬 것이다. 이 글은 리눅스 디스크 용량 부족 상황에서 원인을 찾고 공간을 확보하는 순서를, 실제로 자주 범인이 되는 로그, 패키지 캐시, Docker, 백업 파일, DB 바이너리 로그 중심으로 정리한다. df와 du 같은 기본 명령은 리눅스 디스크 확인 및 마운트 방법에 먼저 정리해 두었다.

리눅스 디스크 용량 부족 1단계 어디가 찼는지 확인
# 파일 시스템별 사용량
df -h
# inode(파일 개수) 부족도 같은 오류를 낸다
df -idf -h에서 사용률(Use%)이 100%에 가까운 파일 시스템을 찾는다. 용량은 남았는데 오류가 난다면 df -i로 inode를 확인하자. 작은 파일이 수백만 개 쌓이면(세션 파일, 캐시 등) 용량과 상관없이 새 파일을 만들 수 없다.
리눅스 디스크 용량 부족 2단계 큰 디렉터리와 파일 찾기
# 최상위부터 디렉터리별 용량 (다른 디스크는 제외)
sudo du -xh --max-depth=1 / 2>/dev/null | sort -h
# 범위를 좁혀 가며 반복
sudo du -xh --max-depth=1 /var 2>/dev/null | sort -h
# 100MB 넘는 파일 찾기
sudo find / -xdev -type f -size +100M -exec ls -lh {} \; 2>/dev/null | sort -k5 -h보통 /var(로그, DB, Docker)나 /home(백업 파일)에서 범인이 나온다. find 사용법은 find와 grep 사용법을 참고하자.
리눅스 디스크 용량 부족 주요 원인과 정리 방법
로그 파일과 journald
# journald 로그가 쓰는 용량
journalctl --disk-usage
# 200MB만 남기고 정리
sudo journalctl --vacuum-size=200M
# 앞으로도 200MB를 넘지 않게: /etc/systemd/journald.conf
# SystemMaxUse=200M
sudo systemctl restart systemd-journald/var/log 아래 로그가 계속 커진다면 logrotate 설정을 점검한다. 로그 위치는 리눅스 로그 파일 위치, 자동 정리는 logrotate 사용법, journald는 journalctl 사용법에 정리해 두었다. journald 설정 항목은 journald.conf 공식 매뉴얼에 있다.
패키지 캐시와 오래된 커널
# Ubuntu / Debian
sudo apt clean
sudo apt autoremove --purge
# Rocky / RHEL 계열
sudo dnf clean all
sudo dnf autoremoveDocker 이미지와 컨테이너
docker system df # 무엇이 얼마나 쓰는지
docker system prune # 멈춘 컨테이너, 안 쓰는 이미지 정리–volumes 옵션은 데이터가 든 볼륨까지 지우니 신중히 쓰자. 자세한 내용은 Docker 기본 명령어에 있다.
쌓인 백업 파일
# 14일 지난 백업 확인 후 삭제
find /backup -name "*.sql.gz" -mtime +14 -ls
find /backup -name "*.sql.gz" -mtime +14 -delete백업 스크립트에 보관 기간 정리를 처음부터 넣어 두면 이런 일이 없다. 예제는 mysqldump 백업 글의 자동화 스크립트를 참고하자.
MySQL 바이너리 로그
MySQL 8.0은 바이너리 로그가 기본으로 켜져 있어, 쓰기가 많은 DB에서는 /var/lib/mysql 아래 binlog 파일이 빠르게 쌓인다. 복제를 쓰지 않는다면 보관 기간을 줄이자.
-- 7일 이전 바이너리 로그 삭제
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 7 DAY;
-- 보관 기간 7일로 (my.cnf 에도 binlog_expire_logs_seconds=604800)
SET PERSIST binlog_expire_logs_seconds = 604800;binlog 파일을 rm으로 직접 지우면 MySQL이 꼬일 수 있으니 반드시 PURGE 명령을 쓴다.
지웠는데도 공간이 안 늘어날 때
실행 중인 프로세스가 열고 있는 파일을 rm으로 지우면, 목록에서는 사라져도 프로세스가 닫을 때까지 디스크 공간은 그대로 남는다. 큰 로그 파일을 지웠는데 df가 그대로라면 이 경우다.
# 삭제됐지만 아직 열려 있는 파일
sudo lsof +L1
# 해결: 해당 서비스 재시작
sudo systemctl restart nginx
# 다음부터는 rm 대신 내용만 비우기
sudo truncate -s 0 /var/log/myapp/big.log리눅스 디스크 용량 부족 예방
- logrotate와 journald 용량 제한을 설정해 둔다.
- 백업 스크립트에 보관 기간(find -mtime -delete)을 넣는다.
- Docker를 쓴다면 주기적으로 docker system df를 확인한다.
- 스왑 파일도 디스크를 쓰니 크기를 적당히 잡는다(스왑 설정).
- 사용률이 80%를 넘으면 알리는 점검 스크립트를 crontab에 걸어 둔다.
#!/bin/bash
# /home/admin/scripts/disk_check.sh (crontab: */30 * * * *)
USE=$(df --output=pcent / | tail -1 | tr -dc '0-9')
if [ "$USE" -ge 80 ]; then
echo "[$(date '+%F %T')] 루트 디스크 사용률 ${USE}%" >> /var/log/disk_alert.log
fi스크립트와 예약 실행은 쉘 스크립트 기초와 crontab 사용법을 참고하자.
그래도 부족하다면 디스크 늘리기
정리할 것을 다 정리했는데도 모자라면 디스크를 늘려야 한다. 클라우드 서버라면 볼륨 크기를 키우거나 추가 디스크를 붙여 /backup 같은 디렉터리를 옮기면 된다. Lightsail은 스냅샷을 만든 뒤 더 큰 플랜으로 새 인스턴스를 만들거나 블록 스토리지 디스크를 붙이는 방식으로 늘린다. 새 디스크를 연결하는 방법은 디스크 확인 및 마운트에 있다.
리눅스 디스크 용량 부족 해결 정리
디스크가 가득 차면 DB와 웹 서비스가 한꺼번에 멈추기 때문에, 원인을 빨리 찾는 순서를 알아 두는 것이 중요하다. df -h로 어디가 찼는지 보고, du와 find로 범인을 좁히고, 로그·캐시·Docker·백업·binlog 순서로 정리하면 대부분 해결된다. 새 서버라면 리눅스 서버 초기 세팅 체크리스트 단계에서 로그 용량 제한부터 걸어 두자. 긴 정리 작업은 tmux 세션 안에서 돌리면 SSH가 끊겨도 안전하다.
첫 댓글을 남겨보세요