그래서 내 고객이 Linode로부터 오늘 서버로 인해 Linode의 백업 서비스가 중단되었다는 이메일을 받았습니다. 왜? 파일이 너무 많습니다. 나는 웃으면 서 달렸다.
# df -ih
Filesystem Inodes IUsed IFree IUse% Mounted on
/dev/xvda 2.5M 2.4M 91K 97% /
쓰레기. 240 만 개의 inode가 사용 중입니다. 도대체 무슨 일이야?!
나는 명백한 용의자 ( /var/{log,cache}
및 모든 사이트가 호스팅되는 디렉토리)를 찾았지만 실제로 의심스러운 것을 찾지 못했습니다. 이 짐승의 어딘가에 2 백만 개의 파일이 들어있는 디렉토리가 있다고 확신합니다.
문맥 상 나의 바쁜 서버는 200k inode를 사용하고 내 데스크탑 (사용 된 스토리지가 4TB 이상인 오래된 설치)은 백만 이상에 불과합니다. 문제가 있습니다.
내 질문은 문제가 어디에 있는지 어떻게 알 수 있습니까? 거기에 du
아이 노드에 대한은?
답변
/lost+found
디스크 문제가 있고 많은 정크가 별도의 파일로 감지되어 잘못되었을 수 있는지 확인하십시오 .
iostat
일부 응용 프로그램이 여전히 미친 파일을 생성하는지 확인 하십시오.
find / -xdev -type d -size +100k
100kB 이상의 디스크 공간을 사용하는 디렉토리가 있는지 알려줍니다. 그것은 많은 파일을 포함하거나 과거에 많은 파일을 포함하는 디렉토리입니다. 크기 그림을 조정하고 싶을 수도 있습니다.
나는 du
디렉토리 항목 당 1을 세게하기 위해 GNU에 옵션의 조합이 있다고 생각하지 않습니다 . find
awk로 계산하고 약간의 계산을 수행하여 파일 목록을 생성 하여이 작업을 수행 할 수 있습니다 . 여기 du
에 inode가 있습니다. 최소한으로 테스트되었으며 줄 바꿈이 포함 된 파일 이름을 처리하려고 시도하지 않습니다.
#!/bin/sh
find "$@" -xdev -depth | awk '{
depth = $0; gsub(/[^\/]/, "", depth); depth = length(depth);
if (depth < previous_depth) {
# A non-empty directory: its predecessor was one of its files
total[depth] += total[previous_depth];
print total[previous_depth] + 1, $0;
total[previous_depth] = 0;
}
++total[depth];
previous_depth = depth;
}
END { print total[0], "total"; }'
사용법 : du-inodes /
. 비어 있지 않은 디렉토리 목록과 그에 대한 총 항목 수 및 해당 서브 디렉토리를 재귀 적으로 인쇄합니다. 출력을 파일로 리디렉션하고 여가 시간에 검토하십시오. sort -k1nr <root.du-inodes | head
가장 큰 범죄자를 알려줄 것입니다.
답변
이 스크립트로 확인할 수 있습니다 :
#!/bin/bash
if [ $# -ne 1 ];then
echo "Usage: `basename $0` DIRECTORY"
exit 1
fi
echo "Wait a moment if you want a good top of the bushy folders..."
find "$@" -type d -print0 2>/dev/null | while IFS= read -r -d '' file; do
echo -e `ls -A "$file" 2>/dev/null | wc -l` "files in:\t $file"
done | sort -nr | head | awk '{print NR".", "\t", $0}'
exit 0
파일 개수별로 상위 10 개의 하위 디렉토리를 인쇄합니다. 당신은 상단의 X, 변경하려는 경우 head
와 head -n x
, x
0보다 큰 자연수 큰입니다.
100 % 확실한 결과를 얻으려면 루트 권한으로이 스크립트를 실행하십시오.
답변
찾기 데이터베이스가 최신 상태 인 경우 종종 찾기보다 빠릅니다.
# locate '' | sed 's|/[^/]*$|/|g' | sort | uniq -c | sort -n | tee filesperdirectory.txt | tail
이 명령은 전체 찾기 데이터베이스를 덤프하고 경로에서 마지막 ‘/’를 지나는 모든 항목을 제거한 다음 sort 및 “uniq -c”는 디렉토리 당 파일 / 디렉토리 수를 제공합니다. “sort -n”은 가장 많은 것을 가진 10 개의 디렉토리를 얻기 위해 파이프로 연결됩니다.
답변
또 다른 제안 :
http://www.iasptk.com/20314-ubuntu-find-large-files-fast-from-command-line
이 검색을 사용하여 서버에서 가장 큰 파일을 찾으십시오.
1GB 이상의 파일 찾기
sudo 찾기 /-유형 f-크기 + 1000000k -exec ls -lh {} \;
100MB가 넘는 파일 찾기
sudo 찾기 /-유형 f-크기 + 100000k -exec ls -lh {} \;
10MB가 넘는 파일 찾기
sudo 찾기 /-유형 f-크기 + 10000k -exec ls -lh {} \;
첫 번째 부분은 “-size”플래그를 사용하여 킬로바이트 단위로 측정 된 다른 크기의 파일을 찾는 find 명령입니다.
“-exec”로 시작하는 마지막 비트는 찾은 각 파일에서 실행할 명령을 지정할 수 있습니다. “ls -lh”명령은 디렉토리의 내용을 나열 할 때 표시되는 모든 정보를 포함합니다. 끝에있는 h는 사람이 읽을 수있는 형식으로 각 파일의 크기를 인쇄하므로 특히 유용합니다.
답변
이것은 쉘을 통해 다른 사람이 Android에서 실패했을 때 나를 위해 일했습니다.
find / -type d -exec sh -c "fc=\$(find '{}' -type f | wc -l); echo -e \"\$fc\t{}\"" \; | sort -nr | head -n25
답변
나는 du --inodes -d 1
재귀 적으로 또는 많은 파일을 직접 포함하는 디렉토리를 찾는 것과 같은 것을 사용하고 싶다 .
나는 또한이 대답을 좋아합니다 : https://unix.stackexchange.com/a/123052
우리의 게으른 사람에게는 여기에 요점이 있습니다.
du --inodes -S | sort -rh | sed -n \ '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'