디스크 공간 부족
디스크를 차지하는 것이 무엇인지 빠르게 찾고, 기가바이트를 안전하게 확보하며, 삭제된 열린 파일과 소진된 inode 같은 함정을 이해하는 방법을 알아봐요.
업데이트 2026년 8월 23일
디스크가 가득 차면 모든 것이 한꺼번에 무너져요. 데이터베이스는 쓰기를 멈추고, 사이트는 오류를 뱉고, journalctl은 작동을 거부하고, 심지어 SSH도 세션 로그를 기록할 공간이 없어서 접속을 막아버리기도 해요. 순서대로 빠르게 대응해야 해요.
확인하기
df -h
df -i
첫 번째 명령은 공간을, 두 번째 명령은 아이노드를 보여줘요. 아이노드가 가득 차면 기가바이트가 남아 있어도 똑같이 "No space left on device" 오류가 발생해요. 디렉터리에 수백만 개의 작은 파일(PHP 세션, 캐시, 큐)이 쌓였을 때 이렇게 돼요.
제어판의 /hosting/vds/m/<id>에서도 사용 공간을 볼 수 있어요. "Overview" 탭의 링이 바로 그것인데, qemu-guest-agent가 보고한 데이터로 채워져요. 에이전트를 삭제했다면 링은 비어 있고, 제어판은 대신 설치 명령을 보여줘요.
원인 찾기
du -xh --max-depth=1 / 2>/dev/null | sort -h | tail -15
du -xh --max-depth=1 /var 2>/dev/null | sort -h | tail -15
ncdu -x / # apt install ncdu, interactive
find / -xdev -type f -size +500M -exec ls -lh {} \; 2>/dev/null
-x 플래그는 검색 범위를 하나의 파일 시스템 안으로 제한해서 /proc나 마운트된 디렉터리로 새어 나가는 것을 막아줘요.
흔한 원인은 /var/log의 로그, /var/cache의 패키지 캐시, /var/lib/docker의 Docker 이미지와 볼륨, 데이터베이스 덤프, /root와 /tmp에 잊힌 압축 파일, 예전 애플리케이션 릴리스 파일이에요.
공간 확보하기
journalctl --vacuum-size=200M
apt clean # Debian, Ubuntu
dnf clean all # AlmaLinux, CentOS Stream
docker system prune -af --volumes # careful: will remove unused volumes
find /tmp -type f -mtime +7 -delete
저널 크기를 영구적으로 제한하려면 /etc/systemd/journald.conf를 편집하세요(SystemMaxUse=300M). 자세한 내용은 systemd journals 문서를 참고하세요. 애플리케이션 파일에는 logrotate를 설정하세요. 로테이션이 없으면 app.log 하나가 수십 기가바이트까지 쉽게 커질 수 있어요.
함정: 삭제했지만 아직 열려 있는 파일
거대한 로그를 삭제했는데 df가 같은 숫자를 보여줘요. 프로세스가 파일을 열고 있는 한 공간은 반환되지 않아요.
lsof +L1 | head -20
올바른 해결책은 파일을 잡고 있는 서비스를 재시작하거나(systemctl restart nginx), 파일을 삭제하지 않고 비우는 거예요.
: > /var/log/nginx/access.log
함정: 아이노드 부족
df -i
find /var/www -xdev -type d -printf '%h\n' | sort | uniq -c | sort -rn | head
파일이 수십만 개 쌓인 디렉터리를 찾아서, 머신이 멈추지 않도록 조각조각 정리하세요.
find /var/lib/php/sessions -type f -mtime +2 -delete
공간이 전혀 없을 때
디스크가 100% 차서 시스템이 거의 움직이지 않을 때는 제어판의 "Console" 탭으로 접속해서 최소 100메가바이트를 확보하고(journalctl --vacuum-size=50M이 거의 항상 통해요), 평소처럼 문제 해결을 이어가세요. 정말 최악의 경우에는 복구 디스크가 도움이 돼요. 머신이 SystemRescue로 부팅되고, 디스크가 /dev/sda로 나타나면 마운트해서 외부에서 정리할 수 있어요.
재발 방지하기
- 85% 임계값에서 알림 — 사이트 다운타임 알림을 참고하세요.
- 시스템 로그뿐만 아니라 모든 애플리케이션 로그를 로테이션하세요.
- 데이터베이스 덤프와 압축 파일은
/root에 두지 말고 즉시 서버 밖으로 보내세요. - 정리할 것이 없는데 데이터가 계속 늘어난다면 디스크가 더 큰 티어로 올라가세요. 40, 80, 120, 160, 200, 250 GB가 있어요. 업그레이드만 가능해요. 디스크는 줄일 수 없고, 다운그레이드도 제공되지 않아요.
/var/lib와/usr의 파일을 함부로 삭제하지 마세요. 데이터베이스 데이터와 시스템 패키지가 있는 곳이에요. 먼저 디렉터리가 무엇에 속하는지 파악하고, 그다음에 정리하세요.