리눅스 장애 대응 · 디스크와 inode · 실습
디스크와 inode 진단
목표
디스크 용량 문제를 블록과 inode 두 축으로 나눠 보고, "삭제했는데 용량이 안 줄어드는" 상황을 직접 만들어 진단하고 복구합니다.
왜 중요한가
No space left on device 는 "블록이 없다"가 아니라 "커널이 이 쓰기를 수용할 자원이 없다"는 뜻입니다. 그 자원은 블록일 수도, inode 일 수도, root 예약분 제외 여유일 수도 있습니다. 그래서 df -h 와 df -i 를 함께 봐야 하고, df 와 du 가 어긋나면 삭제됐지만 열려 있는 파일을 의심해야 합니다. 특히 5~6번 단계에서 만드는 상황은 실무에서 가장 자주 만나는 형태입니다 - 그리고 그 상황에서 프로세스를 재기동하는 순간 복구 기회도 함께 사라집니다. 순서가 곧 실력입니다.
단계
/root/disk 디렉터리에서 작업합니다.
1. /root 가 속한 파일시스템의 inode 사용률(%)을 숫자만 /root/disk/inode_pct.txt 에 적으세요.
2. /etc 디렉터리의 실사용량을 KB 단위 숫자만 /root/disk/etc_kb.txt 에 적으세요.
3. /usr/bin 바로 아래의 일반 파일 중 가장 큰 것의 파일 이름을 /root/disk/biggest.txt 에 적으세요.
4. /root/disk/many 디렉터리를 만들고 크기 0인 파일 정확히 500개를 넣으세요. 그리고 그 디렉터리의 du -sk 값을 /root/disk/many_kb.txt 에 적으세요.
5. 10MB 이상인 /root/disk/ghost.log 를 만들고, 어떤 프로세스가 그 파일을 계속 열고 있는 상태에서 파일 이름만 지우세요. 그 프로세스의 PID 를 /root/disk/ghost_pid.txt 에 적으세요. 채점 시점에 그 프로세스는 살아 있어야 합니다.
6. 5번의 프로세스가 붙잡고 있는 그 파일 내용을 /root/disk/recovered.log 로 복구하세요. 크기가 원본과 같아야 합니다.
7. /root/disk/findghosts.sh <최소바이트> 를 만드세요. 시스템 전체에서 삭제됐지만 열려 있는 파일 중 그 크기 이상인 것을 찾아 pid=<PID> bytes=<크기> 형식으로 한 줄씩 출력합니다.
8. /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 까지 세지 않도록 조심하세요.
단계 8개
- inode 사용률 읽기
- 디렉터리 실사용량 재기
- 가장 큰 파일 찾기
- 빈 파일 500개 만들기
- 삭제됐지만 열려 있는 파일 만들기
- 유령 파일 복구하기
- 유령 파일 탐지 스크립트
- 재귀 용량 집계 스크립트