스토리지와 마운트 · 디스크 사용량 추적 · 실습
용량과 inode 추적
목표
df 와 du 가 서로 다른 답을 하는 상황을 직접 만들고, inode 소비와 희소 파일과 하드 링크가 용량 계산에 미치는 영향을 확인합니다.
왜 중요한가
df 는 파일시스템에게 묻고 du 는 디렉터리를 걸어다니며 셉니다. 그래서 이름이 없어진 파일(rm 했지만 프로세스가 열고 있는)은 df 에는 잡히고 du 에는 안 잡힙니다. 두 값이 어긋나는 것 자체가 강력한 단서입니다. 그리고 그 파일을 복구하려면 프로세스를 재기동하기 전에 /proc/PID/fd 에서 복사해야 합니다 — 재기동하는 순간 기회가 사라집니다. 용량이 급해도 첫 행동은 복사입니다.
단계
1. /root/usage 디렉터리를 만들고, df -h 출력을 /root/usage/df-block.txt 로, df -i 출력을 /root/usage/df-inode.txt 로 저장하세요.
2. /root 아래에서 깊이 1까지의 디렉터리 크기를 큰 순서로 정렬해 /root/usage/du-top.txt 로 저장하세요.
3. /root/usage/many 아래에 빈 파일 3000개를 만들고, 그 디렉터리의 파일 개수를 숫자 한 줄로 /root/usage/filecount.txt 에 적으세요.
4. /root/usage/sparse.img 를 100MiB 희소 파일로 만들고, 논리 크기와 실제 점유를 각각 한 줄씩(바이트 단위, 논리가 먼저) /root/usage/sparse.txt 에 적으세요. 두 값이 달라야 합니다.
5. 삭제됐지만 열려 있는 파일을 만드세요. /root/usage/ghost.log 에 5MiB 이상을 쓰고, 그 파일을 계속 열어 두는 프로세스를 백그라운드로 띄운 뒤, 파일 이름을 지우세요. 그리고 그 프로세스의 /proc/<PID>/fd 목록에서 (deleted) 가 보이는 줄을 /root/usage/deleted.txt 로 저장하세요.
6. /root/usage/orig.dat 에 1MiB 를 쓰고 하드 링크 /root/usage/link.dat 를 만드세요. 두 파일의 inode 번호와 링크 수를 /root/usage/hardlink.txt 에 <inode> <링크수> 형식으로 각각 한 줄씩 적으세요. 두 줄의 inode 가 같아야 합니다.
7. /root/usage 아래에서 크기가 1MiB 이상인 파일을 크기 내림차순으로 <바이트> <경로> 형식으로 /root/usage/big.txt 에 저장하세요.
8. /root/usage/report.txt 를 다음 4줄로 만드세요.FILES=<3번 값> / SPARSE_DIFF=yes / GHOST_PID=<5번에서 파일을 열고 있는 프로세스의 PID> / SAME_INODE=yes
참고
- 삭제된 열린 파일 만들기:
tail -f /root/usage/ghost.log >/dev/null 2>&1 & echo $!로 PID 를 얻은 뒤rm /root/usage/ghost.log. - 희소 파일:
truncate -s 100M, 실제 점유는du -B1, 논리 크기는stat -c %s. stat -c '%i %h' <파일>로 inode 번호와 링크 수를 함께 볼 수 있습니다.- 흔한 실수 1: 5번에서 파일을 지운 뒤 프로세스도 죽여 버리면
(deleted)를 관찰할 수 없습니다. - 흔한 실수 2: 3번에서
ls | wc -l은 파일이 많으면 느립니다.find ... -type f | wc -l이 낫습니다.
단계 8개
- 블록과 inode 사용량
- 큰 디렉터리 찾기
- 작은 파일 대량 생성
- 희소 파일의 두 가지 크기
- 삭제된 열린 파일 재현
- 하드 링크와 du
- 큰 파일 목록
- 용량 조사 보고서