Diagnosing Disk and inodes
한국어 원문으로 표시합니다.
목표
디스크 용량 문제를 블록과 inode 두 축으로 나눠 보고, "삭제했는데 용량이 안 줄어드는" 상황을 직접 만들어 진단하고 복구합니다.
왜 중요한가
No space left on device 는 "블록이 없다"가 아니라 "커널이 이 쓰기를 수용할 자원이 없다"는 뜻입니다. 그 자원은 블록일 수도, inode 일 수도, root 예약분 제외 여유일 수도 있습니다. 그래서 df -h 와 df -i 를 함께 봐야 하고, df 와 du 가 어긋나면 삭제됐지만 열려 있는 파일을 의심해야 합니다. 특히 5~6번 단계에서 만드는 상황은 실무에서 가장 자주 만나는 형태입니다 - 그리고 그 상황에서 프로세스를 재기동하는 순간 복구 기회도 함께 사라집니다. 순서가 곧 실력입니다.
단계
/root/disk 디렉터리에서 작업합니다.
/root가 속한 파일시스템의 inode 사용률(%)을 숫자만/root/disk/inode_pct.txt에 적으세요./etc디렉터리의 실사용량을 KB 단위 숫자만/root/disk/etc_kb.txt에 적으세요./usr/bin바로 아래의 일반 파일 중 가장 큰 것의 파일 이름을/root/disk/biggest.txt에 적으세요./root/disk/many디렉터리를 만들고 크기 0인 파일 정확히 500개를 넣으세요. 그리고 그 디렉터리의du -sk값을/root/disk/many_kb.txt에 적으세요.- 10MB 이상인
/root/disk/ghost.log를 만들고, 어떤 프로세스가 그 파일을 계속 열고 있는 상태에서 파일 이름만 지우세요. 그 프로세스의 PID 를/root/disk/ghost_pid.txt에 적으세요. 채점 시점에 그 프로세스는 살아 있어야 합니다. - 5번의 프로세스가 붙잡고 있는 그 파일 내용을
/root/disk/recovered.log로 복구하세요. 크기가 원본과 같아야 합니다. /root/disk/findghosts.sh <최소바이트>를 만드세요. 시스템 전체에서 삭제됐지만 열려 있는 파일 중 그 크기 이상인 것을 찾아pid=<PID> bytes=<크기>형식으로 한 줄씩 출력합니다./root/disk/diskreport.sh <디렉터리>를 만드세요. 그 디렉터리 아래 전체의 일반 파일 개수와 바이트 합계를 다음 두 줄로 출력합니다. 없는 디렉터리면 0이 아닌 코드로 끝나야 합니다.files=<개수>bytes=<합계>
참고
readlink /proc/<PID>/fd/<N>으로 fd 가 무엇을 가리키는지 볼 수 있습니다. 삭제된 파일은 뒤에(deleted)가 붙습니다.stat -L -c %s /proc/<PID>/fd/<N>은 심링크를 따라가 실제 크기를 알려 줍니다.find "$d" -type f -printf '%s\n'으로 크기 목록을 얻어 합산할 수 있습니다.- 흔한 실수 1: 5번에서 파일을 열고 있는 프로세스가 죽으면 유령이 사라져 6~7번이 전부 실패합니다.
- 흔한 실수 2: 7번에서
/proc/self나 채점기 자신의 fd 까지 세지 않도록 조심하세요.
inode 사용률 읽기
/root 가 속한 파일시스템의 inode 사용률(%)을 숫자만 /root/disk/inode_pct.txt 에 적으세요.
df 에는 블록이 아니라 inode 를 보여 주는 옵션이 따로 있습니다. % 기호는 빼고 숫자만 적으세요.
디렉터리 실사용량 재기
/etc 디렉터리의 실사용량을 KB 단위 숫자만 /root/disk/etc_kb.txt 에 적으세요.
du 는 경로를 걸으며 실제 점유 블록을 셉니다. KB 단위로 요약해 주는 옵션 조합이 있습니다.
가장 큰 파일 찾기
/usr/bin 바로 아래의 일반 파일 중 가장 큰 것의 파일 이름을 /root/disk/biggest.txt 에 적으세요.
find 의 -printf 로 크기와 이름을 함께 뽑아 정렬하세요. 경로가 아니라 파일 이름만 필요합니다.
빈 파일 500개 만들기
/root/disk/many 디렉터리를 만들고 크기 0인 파일 정확히 500개를 넣으세요. 그리고 그 디렉터리의 du -sk 값을 /root/disk/many_kb.txt 에 적으세요.
중괄호 확장이나 seq 로 한 번에 만들 수 있습니다. 내용은 0바이트인데 du 는 0 이 아니라는 점을 확인하세요.
삭제됐지만 열려 있는 파일 만들기
10MB 이상인 /root/disk/ghost.log 를 만들고, 어떤 프로세스가 그 파일을 계속 열고 있는 상태에서 파일 이름만 지우세요. 그 프로세스의 PID 를 /root/disk/ghost_pid.txt 에 적으세요. 채점 시점에 그 프로세스는 살아 있어야 합니다.
파일을 만들고, 어떤 프로세스가 계속 열고 있게 한 뒤, 이름만 지웁니다. tail -f 가 적당합니다.
유령 파일 복구하기
5번의 프로세스가 붙잡고 있는 그 파일 내용을 /root/disk/recovered.log 로 복구하세요. 크기가 원본과 같아야 합니다.
/proc//fd/<번호> 는 그 파일을 가리키는 심링크입니다. 그 경로를 그대로 복사하세요.
유령 파일 탐지 스크립트
/root/disk/findghosts.sh <최소바이트> 를 만드세요. 시스템 전체에서 삭제됐지만 열려 있는 파일 중 그 크기 이상인 것을 찾아 pid=<PID> bytes=<크기> 형식으로 한 줄씩 출력합니다.
/proc//fd/ 를 readlink 해서 (deleted) 로 끝나는 것만 고릅니다. 크기는 stat -L 로 잽니다.
재귀 용량 집계 스크립트
/root/disk/diskreport.sh <디렉터리> 를 만드세요. 그 디렉터리 아래 전체의 일반 파일 개수와 바이트 합계를 다음 두 줄로 출력합니다. 없는 디렉터리면 0이 아닌 코드로 끝나야 합니다.
files=<개수>bytes=<합계>
find 로 일반 파일을 찾고 개수와 크기 합을 냅니다. 없는 디렉터리는 오류로 처리하세요.