GrepBoard/매뉴얼
51 편 ·

디스크가 꽉 찼을 때 공간을 먹는 것 찾기

·Ubuntu 24.04.5 LTS · coreutils 9.4 · lsof 4.95.0 · ext4 루프 파일 시스템·6 단계

df 로 꽉 찬 파일 시스템을 찾고 du·find 로 큰 파일을 좁히고, 지웠는데 공간이 안 돌아올 때와 아이노드가 바닥났을 때를 처리합니다.

No space left on device 가 나오면 바이트가 찼는지 아이노드가 찼는지부터 가르고, 그다음 어디가 큰지 좁힙니다. 아래 출력은 ext4 루프 파일 시스템을 /srv/data 에 마운트해 돌린 실제 결과이며, 경로만 일반 경로로 바꿨습니다.

[1] 어느 파일 시스템이 찼는지 봅니다. df -h 는 바이트, df -i 는 아이노드(파일 개수 한도)입니다.

console
# df -h /srv/dataFilesystem      Size  Used Avail Use% Mounted on/dev/loop0      574M  474M   59M  89% /srv/data# df -i /srv/dataFilesystem     Inodes IUsed IFree IUse% Mounted on/dev/loop0      38400    17 38383    1% /srv/data

[2] 마운트 지점부터 아래로 내려가며 큰 디렉터리를 좁힙니다. -x 는 다른 파일 시스템으로 넘어가지 않게 하고, sort -h 는 M·G 단위를 알아서 정렬합니다. 서버 전체를 볼 때는 / 에 같은 명령을 씁니다.

console
# du -xh --max-depth=1 /srv/data | sort -h16K	/srv/data/lost+found3.1M	/srv/data/cache121M	/srv/data/log201M	/srv/data/backup324M	/srv/data

[3] 가장 큰 디렉터리 안에서 큰 파일을 직접 찾습니다. 같은 -xdev 로 다른 마운트는 건너뜁니다.

console
# find /srv/data -xdev -size +100M -exec ls -lh {} +-rw-r--r-- 1 root root 200M Oct 19 12:17 /srv/data/backup/db-2026-09.dump-rw-r--r-- 1 root root 120M Oct 19 12:17 /srv/data/log/app.log

[4] 파일을 지웠는데 df 가 줄지 않으면 프로세스가 지워진 파일을 열고 있는 것입니다. 위 예에서 df 의 Used 는 474M 인데 du 합계는 324M 이었고, 차이 150M 이 지워진 로그 파일입니다.

console
# rm /srv/data/log/big.log# df -h /srv/dataFilesystem      Size  Used Avail Use% Mounted on/dev/loop0      574M  474M   59M  89% /srv/data

lsof +L1 은 링크 수가 1 미만(0)인 열린 파일을 보여 줍니다. -a 와 마운트 지점을 붙이면 그 파일 시스템 것만 나옵니다.

console
# lsof -a +L1 /srv/dataCOMMAND   PID USER   FD   TYPE DEVICE  SIZE/OFF NLINK NODE NAMEsleep   48534 root    1w   REG    7,0 157286400     0   16 /srv/data/log/big.log (deleted)

[5] 공간을 돌려받습니다. 가능하면 PID 의 프로세스를 재시작(또는 로그를 다시 여는 reload)합니다. 재시작할 수 없으면 FD 칸의 번호(1w 이면 1)로 열린 파일을 비웁니다.

console
# ls -l /proc/48534/fdlr-x------ 1 root root 64 Oct 19 12:17 0 -> /dev/nulll-wx------ 1 root root 64 Oct 19 12:17 1 -> /srv/data/log/big.log (deleted)l-wx------ 1 root root 64 Oct 19 12:17 2 -> /dev/null# : > /proc/48534/fd/1# df -h /srv/dataFilesystem      Size  Used Avail Use% Mounted on/dev/loop0      574M  324M  209M  61% /srv/data

[6] 바이트는 여유인데 No space left on device 가 나오면 아이노드를 봅니다. 작은 파일이 수없이 쌓인 디렉터리(메일 큐, 세션, 캐시)에서 흔합니다. 아래는 아이노드 256개로 만든 작은 파일 시스템에서 파일을 계속 만든 결과입니다.

console
# touch /srv/data/spool/m244touch: cannot touch '/srv/data/spool/m244': No space left on device# df -h /srv/dataFilesystem      Size  Used Avail Use% Mounted on/dev/loop0       60M   28K   56M   1% /srv/data# df -i /srv/dataFilesystem     Inodes IUsed IFree IUse% Mounted on/dev/loop0        256   256     0  100% /srv/data

Used 는 28K 뿐인데 IUse% 가 100% 입니다. 어느 디렉터리가 파일을 많이 품었는지는 du --inodes 로 찾습니다.

console
# du -x --inodes --max-depth=1 /srv/data | sort -n1	/srv/data/lost+found245	/srv/data/spool247	/srv/data

#df#du#lsof#disk