LabHub
배우기 러닝패스 코스

Linux Incident Response

Diagnosing Disk and inodes

LabHub 에서 이어서 보기

한국어 원문으로 표시합니다.

목표

디스크 용량 문제를 블록과 inode 두 축으로 나눠 보고, "삭제했는데 용량이 안 줄어드는" 상황을 직접 만들어 진단하고 복구합니다.

왜 중요한가

No space left on device 는 "블록이 없다"가 아니라 "커널이 이 쓰기를 수용할 자원이 없다"는 뜻입니다. 그 자원은 블록일 수도, inode 일 수도, root 예약분 제외 여유일 수도 있습니다. 그래서 df -hdf -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=<합계>

참고

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이 아닌 코드로 끝나야 합니다.

find 로 일반 파일을 찾고 개수와 크기 합을 냅니다. 없는 디렉터리는 오류로 처리하세요.