Tracking Capacity and inodes
한국어 원문으로 표시합니다.
목표
df 와 du 가 서로 다른 답을 하는 상황을 직접 만들고, inode 소비와 희소 파일과 하드 링크가 용량 계산에 미치는 영향을 확인합니다.
왜 중요한가
df 는 파일시스템에게 묻고 du 는 디렉터리를 걸어다니며 셉니다. 그래서 이름이 없어진 파일(rm 했지만 프로세스가 열고 있는)은 df 에는 잡히고 du 에는 안 잡힙니다. 두 값이 어긋나는 것 자체가 강력한 단서입니다. 그리고 그 파일을 복구하려면 프로세스를 재기동하기 전에 /proc/PID/fd 에서 복사해야 합니다 — 재기동하는 순간 기회가 사라집니다. 용량이 급해도 첫 행동은 복사입니다.
단계
/root/usage디렉터리를 만들고,df -h출력을/root/usage/df-block.txt로,df -i출력을/root/usage/df-inode.txt로 저장하세요./root아래에서 깊이 1까지의 디렉터리 크기를 큰 순서로 정렬해/root/usage/du-top.txt로 저장하세요./root/usage/many아래에 빈 파일 3000개를 만들고, 그 디렉터리의 파일 개수를 숫자 한 줄로/root/usage/filecount.txt에 적으세요./root/usage/sparse.img를 100MiB 희소 파일로 만들고, 논리 크기와 실제 점유를 각각 한 줄씩(바이트 단위, 논리가 먼저)/root/usage/sparse.txt에 적으세요. 두 값이 달라야 합니다.- 삭제됐지만 열려 있는 파일을 만드세요.
/root/usage/ghost.log에 5MiB 이상을 쓰고, 그 파일을 계속 열어 두는 프로세스를 백그라운드로 띄운 뒤, 파일 이름을 지우세요. 그리고 그 프로세스의/proc/<PID>/fd목록에서(deleted)가 보이는 줄을/root/usage/deleted.txt로 저장하세요. /root/usage/orig.dat에 1MiB 를 쓰고 하드 링크/root/usage/link.dat를 만드세요. 두 파일의 inode 번호와 링크 수를/root/usage/hardlink.txt에<inode> <링크수>형식으로 각각 한 줄씩 적으세요. 두 줄의 inode 가 같아야 합니다./root/usage아래에서 크기가 1MiB 이상인 파일을 크기 내림차순으로<바이트> <경로>형식으로/root/usage/big.txt에 저장하세요./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이 낫습니다.
블록과 inode 사용량
/root/usage 디렉터리를 만들고, df -h 출력을 /root/usage/df-block.txt 로, df -i 출력을 /root/usage/df-inode.txt 로 저장하세요.
df 에는 사람이 읽기 좋은 단위 옵션과 inode 를 보는 옵션이 따로 있습니다.
큰 디렉터리 찾기
/root 아래에서 깊이 1까지의 디렉터리 크기를 큰 순서로 정렬해 /root/usage/du-top.txt 로 저장하세요.
깊이를 제한하면 위에서부터 좁혀 들어갈 수 있습니다. 다른 파일시스템으로 넘어가지 않는 옵션도 함께 쓰세요.
작은 파일 대량 생성
/root/usage/many 아래에 빈 파일 3000개를 만들고, 그 디렉터리의 파일 개수를 숫자 한 줄로 /root/usage/filecount.txt 에 적으세요.
파일 개수를 세는 것과 inode 사용량을 보는 것은 다릅니다. 생성 전후를 비교하세요.
희소 파일의 두 가지 크기
/root/usage/sparse.img 를 100MiB 희소 파일로 만들고, 논리 크기와 실제 점유를 각각 한 줄씩(바이트 단위, 논리가 먼저) /root/usage/sparse.txt 에 적으세요. 두 값이 달라야 합니다.
du 는 기본적으로 실제 점유를 셉니다. 논리 크기를 보려면 별도 옵션이 필요합니다.
삭제된 열린 파일 재현
삭제됐지만 열려 있는 파일을 만드세요. /root/usage/ghost.log 에 5MiB 이상을 쓰고, 그 파일을 계속 열어 두는 프로세스를 백그라운드로 띄운 뒤, 파일 이름을 지우세요. 그리고 그 프로세스의 /proc/<PID>/fd 목록에서 (deleted) 가 보이는 줄을 /root/usage/deleted.txt 로 저장하세요.
파일을 열어 둔 프로세스를 백그라운드로 유지한 뒤 이름만 지우세요. /proc 아래 fd 심링크에 표시가 남습니다.
하드 링크와 du
/root/usage/orig.dat 에 1MiB 를 쓰고 하드 링크 /root/usage/link.dat 를 만드세요. 두 파일의 inode 번호와 링크 수를 /root/usage/hardlink.txt 에 <inode> <링크수> 형식으로 각각 한 줄씩 적으세요. 두 줄의 inode 가 같아야 합니다.
같은 inode 를 가리키는 이름이 여러 개일 때 du 가 몇 번 세는지 확인하세요. 링크 수는 stat 으로 봅니다.
큰 파일 목록
/root/usage 아래에서 크기가 1MiB 이상인 파일을 크기 내림차순으로 <바이트> <경로> 형식으로 /root/usage/big.txt 에 저장하세요.
find 의 -size 는 단위 접미사를 받습니다. 크기와 경로를 함께 출력하려면 -printf 를 쓰세요.
용량 조사 보고서
/root/usage/report.txt 를 다음 4줄로 만드세요.
FILES=<3번 값> / SPARSE_DIFF=yes / GHOST_PID=<5번에서 파일을 열고 있는 프로세스의 PID> / SAME_INODE=yes
앞 단계 결과를 키=값으로 모읍니다. 삭제된 열린 파일의 크기는 /proc 경로로 stat 하면 나옵니다.