inode가 사용되는 곳 찾기


189

그래서 파일 시스템의 사용 가능한 inode 수가 적다는 경고 메시지를 상자 중 하나에서 모니터링 시스템으로부터 받았습니다.

df -i 출력은 이것을 보여줍니다 :

Filesystem       Inodes  IUsed    IFree IUse% Mounted on
/dev/xvda1       524288 422613   101675   81% /

보다시피 루트 파티션은 81 %의 inode를 사용합니다.
나는 그것들이 모두 단일 디렉토리에서 사용되고 있다고 생각합니다. 그러나 그것이 어디에 있는지 어떻게 알 수 있습니까?

답변:


214

나는 질문을 stackoverflow에서 보았지만 대답을 좋아하지 않았으며 실제로 U & L에 관한 질문입니다.

기본적으로 inode는 파일 시스템의 각 파일에 사용됩니다. 따라서 inode가 부족하면 일반적으로 작은 파일이 많이 있습니다. 따라서 문제는 "어떤 디렉토리에 많은 파일이 있는가?"가됩니다.

이 경우 관심있는 파일 시스템은 루트 파일 시스템 /이므로 다음 명령을 사용할 수 있습니다.

find / -xdev -printf '%h\n' | sort | uniq -c | sort -k 1 -n

그러면 파일 시스템의 모든 디렉토리 목록과 해당 디렉토리의 파일 수 (및 서브 디렉토리)가 덤프됩니다. 따라서 파일 수가 가장 많은 디렉토리가 맨 아래에 있습니다.

제 경우에는 다음이 나타납니다.

   1202 /usr/share/man/man1
   2714 /usr/share/man/man3
   2826 /var/lib/dpkg/info
 306588 /var/spool/postfix/maildrop

기본적으로 /var/spool/postfix/maildrop모든 inode를 소비합니다.

이 답변에는 내가 생각할 수있는 세 가지주의 사항이 있습니다. 경로에 줄 바꿈이있는 것은 올바르게 처리하지 않습니다. 내 파일 시스템이 줄 바꿈 아무 파일이 없으며, 이것은 단지 인간의 소비를 위해 사용되기 때문에, 잠재적 인 문제가 해결 가치가 아니라는 것을 알고 (하나는 항상을 대체 할 수 \n와 함께 \0사용할 sort -z이상). 파일이 많은 디렉토리에 분산되어 있는지도 처리하지 않습니다. 이것은 아니지만 가능성이 위험하다고 생각합니다. 또한 동일한 파일에 대한 하드 링크 (하나의 inode 만 사용)를 여러 번 계산합니다. 다시, 오 탐지 않을 것


내가 stackoverflow 답변에 대한 답변을 좋아하지 않는 주요 이유는 모두 파일 시스템 경계를 넘기 때문입니다. 내 문제는 루트 파일 시스템에 있었기 때문에 마운트 된 모든 단일 파일 시스템을 통과한다는 것을 의미합니다. -xdevfind 명령을 던지면 제대로 작동하지 않습니다.
예를 들어 가장 많이 답한 답변은 다음과 같습니다.

for i in `find . -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

이것을 대신에 변경하면

for i in `find . -xdev -type d `; do echo `ls -a $i | wc -l` $i; done | sort -n

/mnt/foo마운트 이지만 루트 파일 시스템의 디렉토리이기도하므로에 로 들어간 다음에 마운트되어 다이빙으로 find . -mount -type d전달됩니다 ls -a $i.

find내 대답에 대신 산에있는 모든 단일 파일의 디렉토리를 나열합니다. 기본적으로 다음과 같은 파일 구조가 있습니다.

/foo/bar
/foo/baz
/pop/tart

우리는 결국

/foo
/foo
/pop

따라서 중복 행 수를 세면됩니다.


2
내 대답의 일부가 아닌 @MohsenPahlevanzadeh, 나는이 질문에 대한 일반적인 대답이므로 솔루션을 싫어하는 이유에 대해 언급하고있었습니다.
Patrick

7
바인드 마운트를 사용하면 마운트 지점에서 파일에 액세스 할 수 있으므로 다른 파일 시스템을 검색하지 않아도됩니다. 예를 들어, 아래에 300,000 개의 파일을 /tmp만든 다음 나중에 시스템이에 tmpfs를 마운트하도록 구성되어 있다고 가정합니다 /tmp. 그러면 find혼자서 파일을 찾을 수 없습니다 . 상식은 아니지만 주목할 가치가 있습니다.
Graeme

2
출력이 충분히 클 때 sort가 파일을 작성해야하기 때문에 두 작업 모두 정렬을 제거해야했습니다 .100 % inode 사용에 도달 한 이후 불가능했습니다.
qwertzguy

1
참고 -printfOS X에서 사용할 수있는 BSD 버전을 지원하지 않기 때문에 표시가 찾을 수있는 GNU 확장 할 수 있습니다.
Xiong Chiamiov 2016 년

1
모든 파일이 단일 디렉토리에 있다고 가정하는 것은 어려운 일입니다. 많은 프로그램은 단일 디렉토리의 많은 파일이 성능이 저하되어 하나 또는 두 레벨의 디렉토리를 해시한다는 것을 알고 있습니다.
PlasmaHH

26

이것은 asker의 요청에 따라 여기 에서 다시 게시됩니다 .

du --inodes -S | sort -rh | sed -n \
        '1,50{/^.\{71\}/s/^\(.\{30\}\).*\(.\{37\}\)$/\1...\2/;p}'

그리고 동일한 파일 시스템에 머 무르려면 다음을 수행하십시오.

du --inodes -xS

다음은 예제 출력입니다.

15K     /usr/share/man/man3
4.0K    /usr/lib
3.6K    /usr/bin
2.4K    /usr/share/man/man1
1.9K    /usr/share/fonts/75dpi
...
519     /usr/lib/python2.7/site-packages/bzrlib
516     /usr/include/KDE
498     /usr/include/qt/QtCore
487     /usr/lib/modules/3.13.6-2-MANJARO/build/include/config
484     /usr/src/linux-3.12.14-2-MANJARO/include/config

LS와 함께 지금 :

몇몇 사람들은 최신 coreutils가 없으며 --inodes 옵션을 사용할 수 없다고 언급했습니다. 그래서 여기 있습니다 :

ls ~/test -AiR1U | 
sed -rn '/^[./]/{h;n;};G;
    s|^ *([0-9][0-9]*)[^0-9][^/]*([~./].*):|\1:\2|p' | 
sort -t : -uk1.1,1n |
cut -d: -f2 | sort -V |
uniq -c |sort -rn | head -n10

궁금한 점이 있다면, 그 지루한 부분의 마음과 영혼은 각 재귀 적 검색 결과에서 찾은 디렉토리 이름으로 regex대체 됩니다. 거기에서 반복되는 inode 번호를 누른 다음 반복되는 디렉토리 이름을 세고 그에 따라 정렬하면됩니다.filenamels's

-U옵션은 특히 정렬되지 않고 정렬 순서에 따라 디렉토리 목록을 원래 순서로, 즉 inode숫자 로 표시한다는 점에서 특히 유용 합니다 .

물론 -1파일 이름에 줄 바꿈을 포함하거나 목록을 구문 분석 할 때 발생할 수있는 놀랍도록 불행한 문제에 관계없이 한 줄에 단일 결과를 보장한다는 점에서 매우 유용합니다.

그리고 물론 -A모든 그리고 -iinode와 -R재귀를 위해 그리고 그것은 길고 짧습니다.

이것의 기본 방법은 ls의 파일 이름을 sed에 포함 된 디렉토리 이름으로 바꾸는 것입니다. 그런 다음에 ... 글쎄, 나는 약간 퍼지 해요. 여기에서 볼 수 있듯이 파일을 정확하게 계산하는 것이 확실합니다.

% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
>   2 /home/mikeserv/test
>   1 /home/mikeserv/test/linkdir

이것은 du명령 과 거의 동일한 결과를 제공합니다 .

DU :

15K     /usr/share/man/man3
4.0K    /usr/lib
3.6K    /usr/bin
2.4K    /usr/share/man/man1
1.9K    /usr/share/fonts/75dpi
1.9K    /usr/share/fonts/100dpi
1.9K    /usr/share/doc/arch-wiki-markdown
1.6K    /usr/share/fonts/TTF
1.6K    /usr/share/dolphin-emu/sys/GameSettings
1.6K    /usr/share/doc/efl/html

LS :

14686   /usr/share/man/man3:
4322    /usr/lib:
3653    /usr/bin:
2457    /usr/share/man/man1:
1897    /usr/share/fonts/100dpi:
1897    /usr/share/fonts/75dpi:
1890    /usr/share/doc/arch-wiki-markdown:
1613    /usr/include:
1575    /usr/share/doc/efl/html:
1556    /usr/share/dolphin-emu/sys/GameSettings:

include프로그램이 처음 보는 디렉토리에 달려 있다고 생각합니다 . 파일이 같고 하드 링크되어 있기 때문입니다. 위의 것을 좋아합니다. 나는 그것에 대해 틀릴 수 있습니다-그리고 나는 정정을 환영합니다 ...

뒤 데모

% du --version
> du (GNU coreutils) 8.22

테스트 디렉토리를 작성하십시오.

% mkdir ~/test ; cd ~/test
% du --inodes -S
> 1       .

일부 하위 디렉토리 :

% mkdir ./realdir ./linkdir
% du --inodes -S
> 1       ./realdir
> 1       ./linkdir
> 1       .

일부 파일을 작성하십시오.

% printf 'touch ./realdir/file%s\n' `seq 1 100` | . /dev/stdin
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

일부 하드 링크 :

% printf 'n="%s" ; ln ./realdir/file$n ./linkdir/link$n\n' `seq 1 100` | 
    . /dev/stdin
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

하드 링크를보십시오 :

% cd ./linkdir
% du --inodes -S
> 101

% cd ../realdir
% du --inodes -S
> 101

그들은 혼자 계산되지만 한 디렉토리 위로 올라갑니다 ...

% cd ..
% du --inodes -S
> 101     ./realdir
> 1       ./linkdir
> 1       .

그런 다음 아래에서 실행 스크립트를 실행했습니다.

> 100     /home/mikeserv/test/realdir
> 100     /home/mikeserv/test/linkdir
> 2       /home/mikeserv/test

그리고 Graeme 's :

> 101 ./realdir
> 101 ./linkdir
> 3 ./

따라서 이것이 inode를 계산하는 유일한 방법은 inode에 의한 것임을 보여줍니다. 파일을 세는 것은 inode를 세는 것을 의미하기 때문에 inode를 두 번 세는 것은 불가능합니다. 파일을 정확하게 세는 inode는 두 번 이상 세는 것이 불가능합니다.


2
어떤 버전이 추가 --inodes되었습니까? "변이체"/ "향미 제"/ "posix-wannabes"/ "구현"/ 무엇이 있습니까?
n611x007

우분투 14.04.5 : 뒤이 : 알 수없는 옵션은 '--inodes'
Putnik

du (GNU coreutils) 2014 년의 8.23에는 오래된 구식 Debian Jessie가 있습니다. 데비안> 우분투 그 말에 미안 : P 우분투는 너무 오래된 패키지가 ...
다니엘 W.

6

SO Q & A에서이 답변을 사용했습니다. 제목 : 모든 inode는 어디에 사용됩니까? NAS가 약 2 년 전에 소진되었을 때 :

$ find . -type d -print0 \
    | while IFS= read -rd '' i; do echo $(ls -a "$i" | wc -l) "$i"; done \
    | sort -n

$ find . -type d -print0 \
    | while IFS= read -rd '' i; do echo $(ls -a "$i" | wc -l) "$i"; done \
    | sort -n
...
110 ./MISC/nodejs/node-v0.8.12/out/Release/obj.target/v8_base/deps/v8/src
120 ./MISC/nodejs/node-v0.8.12/doc/api
123 ./apps_archive/monitoring/nagios/nagios-check_sip-1.3/usr/lib64/nagios
208 ./MISC/nodejs/node-v0.8.12/deps/openssl/openssl/doc/crypto
328 ./MISC/nodejs/node-v0.8.12/deps/v8/src
453 ./MISC/nodejs/node-v0.8.12/test/simple

장치의 아이 노드 확인

NAS에 따라 모든 기능을 갖춘 df명령을 제공하지 않을 수 있습니다 . 따라서이 경우 tune2fs대신 대신 사용할 수 있습니다 .

$ sudo tune2fs -l /dev/sda1 |grep -i inode
Filesystem features:      has_journal ext_attr resize_inode dir_index filetype needs_recovery extent flex_bg sparse_super huge_file uninit_bg dir_nlink extra_isize
Inode count:              128016
Free inodes:              127696
Inodes per group:         2032
Inode blocks per group:   254
First inode:              11
Inode size:           128
Journal inode:            8
Journal backup:           inode blocks

파일 시스템 경계를 넘어

-xdev스위치를 사용하여 find검색을 시작하는 장치로만 검색 범위를 좁힐 수 있습니다 .

/homeNAS에서 NFS 공유를 통해 디렉토리 자동 마운트를 한다고 가정 해 봅시다 . 이름은 멀더입니다.

$ df -h /home/sam 
Filesystem            Size  Used Avail Use% Mounted on
mulder:/export/raid1/home/sam
                      917G  572G  299G  66% /home/sam

마운트 지점은 여전히 ​​시스템의 로컬 위치로 간주됩니다.

$ df -h /home/ .
Filesystem            Size  Used Avail Use% Mounted on
-                        0     0     0   -  /home
/dev/mapper/VolGroup00-LogVol00
                      222G  159G   52G  76% /

이제 시작할 때 find:

$ find / -xdev  | grep '^/home'
/home

/home다른 장치에 있기 때문에 자동 마운트 된 컨텐츠를 찾지 못했습니다!

파일 시스템 유형

당신은 스위치를 활용할 수 find, -fstype유형의 파일 시스템을 제어 할 find로 볼 것이다.

   -fstype type
          File is on a filesystem of type type.  The valid filesystem types 
          vary among different versions of Unix; an incomplete list of 
          filesystem  types that are accepted on some version of Unix or 
          another is: ufs, 4.2, 4.3, nfs, tmp, mfs, S51K, S52K.  You can use 
          -printf with the %F directive to see the types of your
          filesystems.

어떤 파일 시스템이 있습니까?

$ find . -printf "%F\n" | sort -u
ext3

따라서 이것을 사용하여 교차를 제어 할 수 있습니다.

ext3 만

$ find . -fstype ext3 | head -5
.
./gdcm
./gdcm/gdcm-2.0.16
./gdcm/gdcm-2.0.16/Wrapping
./gdcm/gdcm-2.0.16/Wrapping/CMakeLists.txt

nfs 만

$ find . -fstype nfs | head -5
$ 

ext3 및 ext4

$ find . -fstype ext3 -o -fstype ext4 | head -5
.
./gdcm
./gdcm/gdcm-2.0.16
./gdcm/gdcm-2.0.16/Wrapping
./gdcm/gdcm-2.0.16/Wrapping/CMakeLists.txt

파일 시스템 경계를 넘지 않도록하는 솔루션은 무엇입니까? /가득 차있는 것처럼 네트워크 파일 시스템이 마운트되어있는 것처럼 네트워크 파일 시스템에 들어가고 싶지 않습니다.
Patrick

@Patrick - 사용을 제어 할 수 있습니다, 업데이트 된 내용을 확인할 -fstypefind.
slm

1
@Gilles - 간단한 대답은 ... 발견의 man 페이지 8)에 모든 방법을 페이지를 아래로하지 않았다
SLM

@Gilles-매뉴얼 페이지는 -xtype파일 시스템 을 제외 한다는 것을 나타내지 않는 것으로 보입니다. 파일 유형을 살펴 보는 것 같습니다 . 나는 다음과 같은 예를 찾고 있습니다.find . \( -fstype nfs -prune \)
slm

@Gilles- find파일 시스템 경계를 넘지 않는 방법에 대한 의견에서 Patrick의 Q를 다루고있었습니다 . 그의 전직. 그는 "/가 가득 찬 경우처럼 네트워크 파일 시스템이 마운트되어 있고 네트워크 파일 시스템으로 들어가고 싶지 않다"고 언급했습니다.
slm


3

에 대한 자세한 inode 사용법을 나열하려면 /다음 명령을 사용하십시오.

echo "Detailed Inode usage for: $(pwd)" ; for d in `find -maxdepth 1 -type d |cut -d\/ -f2 |grep -xv . |sort`; do c=$(find $d |wc -l) ; printf "$c\t\t- $d\n" ; done ; printf "Total: \t\t$(find $(pwd) | wc -l)\n" 

잘 왔어! 다음 번에 더 나은 형식을 제안하십시오.
peterh

1
그것은 하나의 라이너입니다. 나는 그것에 아무런 문제가 없습니다.
sjas

2

최대 upvotes로 확실히 대답하면 리눅스와 유닉스에서 inode의 개념을 이해하는 데 도움이되지만 디스크에서 inode를 삭제하거나 제거하는 실제 문제를 처리하는 데 실제로 도움이되지는 않습니다. 우분투 기반 시스템 에서이 작업을 수행하는 간단한 방법은 원치 않는 Linux 커널 헤더 및 이미지를 제거하는 것입니다.

sudo apt-get autoremove

당신을 위해 그렇게 할 것입니다. 필자의 경우, inode 사용은 78 %로 경고를 받았습니다.

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 407957 116331   78% /
none           957443      2 957441    1% /sys/fs/cgroup
udev           956205    388 955817    1% /dev
tmpfs          957443    320 957123    1% /run
none           957443      1 957442    1% /run/lock
none           957443      1 957442    1% /run/shm
none           957443      5 957438    1% /run/user

sudo apt-get autoremove명령을 실행 한 후 29 %로 감소했습니다.

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 150472 373816   29% /
none           957443      2 957441    1% /sys/fs/cgroup
udev           956205    388 955817    1% /dev
tmpfs          957443    320 957123    1% /run
none           957443      1 957442    1% /run/lock
none           957443      1 957442    1% /run/shm
none           957443      5 957438    1% /run/user

이것은 나의 시간을 절약 한 나의 관찰이었습니다. 사람들은 이것보다 더 나은 해결책을 찾을 수 있습니다.


2

다음 명령을 사용하여 더 빠르고 쉽게 드릴 다운 할 수 있습니다.

$ sudo du -s --inodes * | sort -rn

170202  var
157325  opt
103134  usr
53383   tmp
<snip>

그런 다음 var예를 들어 디렉토리를 사용하는 큰 inode가 무엇인지 확인할 수 있습니다.


0

지금까지의 모든 대답은 문제가 단일 디렉토리에 많은 파일이 있고 문제를 일으키는 많은 서브 디렉토리가 아니라고 가정합니다. 다행히 해결책은 단순히 더 적은 수의 플래그를 사용하는 것입니다.

# du --inodes --one-file-system /var | sort --numeric-sort
...
2265    /var/cache/salt/minion
3818    /var/lib/dpkg/info
3910    /var/lib/dpkg
4000    /var/cache/salt/master/gitfs/refs
4489    /var/lib
5709    /var/cache/salt/master/gitfs/hash
12954   /var/cache/salt/master/gitfs
225058  /var/cache/salt/master/jobs
241678  /var/cache/salt/master
243944  /var/cache/salt
244078  /var/cache
248949  /var

또는 더 짧은 옵션 : du --inodes -x | sort -n. 불행히도 모든 버전의 duinode 옵션이있는 것은 아닙니다 .

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.