답변:
나는 이 질문을 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 답변에 대한 답변을 좋아하지 않는 주요 이유는 모두 파일 시스템 경계를 넘기 때문입니다. 내 문제는 루트 파일 시스템에 있었기 때문에 마운트 된 모든 단일 파일 시스템을 통과한다는 것을 의미합니다. -xdev
find 명령을 던지면 제대로 작동하지 않습니다.
예를 들어 가장 많이 답한 답변은 다음과 같습니다.
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
따라서 중복 행 수를 세면됩니다.
/tmp
만든 다음 나중에 시스템이에 tmpfs를 마운트하도록 구성되어 있다고 가정합니다 /tmp
. 그러면 find
혼자서 파일을 찾을 수 없습니다 . 상식은 아니지만 주목할 가치가 있습니다.
-printf
OS X에서 사용할 수있는 BSD 버전을 지원하지 않기 때문에 표시가 찾을 수있는 GNU 확장 할 수 있습니다.
이것은 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
몇몇 사람들은 최신 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 번호를 누른 다음 반복되는 디렉토리 이름을 세고 그에 따라 정렬하면됩니다.filename
ls's
이 -U
옵션은 특히 정렬되지 않고 정렬 순서에 따라 디렉토리 목록을 원래 순서로, 즉 inode
숫자 로 표시한다는 점에서 특히 유용 합니다 .
물론 -1
파일 이름에 줄 바꿈을 포함하거나 목록을 구문 분석 할 때 발생할 수있는 놀랍도록 불행한 문제에 관계없이 한 줄에 단일 결과를 보장한다는 점에서 매우 유용합니다.
그리고 물론 -A
모든 그리고 -i
inode와 -R
재귀를 위해 그리고 그것은 길고 짧습니다.
이것의 기본 방법은 ls의 파일 이름을 sed에 포함 된 디렉토리 이름으로 바꾸는 것입니다. 그런 다음에 ... 글쎄, 나는 약간 퍼지 해요. 여기에서 볼 수 있듯이 파일을 정확하게 계산하는 것이 확실합니다.
% _ls_i ~/test
> 100 /home/mikeserv/test/realdir
> 2 /home/mikeserv/test
> 1 /home/mikeserv/test/linkdir
이것은 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
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는 두 번 이상 세는 것이 불가능합니다.
--inodes
되었습니까? "변이체"/ "향미 제"/ "posix-wannabes"/ "구현"/ 무엇이 있습니까?
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
검색을 시작하는 장치로만 검색 범위를 좁힐 수 있습니다 .
/home
NAS에서 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
/
가득 차있는 것처럼 네트워크 파일 시스템이 마운트되어있는 것처럼 네트워크 파일 시스템에 들어가고 싶지 않습니다.
-fstype
에 find
.
-xtype
파일 시스템 을 제외 한다는 것을 나타내지 않는 것으로 보입니다. 파일 유형을 살펴 보는 것 같습니다 . 나는 다음과 같은 예를 찾고 있습니다.find . \( -fstype nfs -prune \)
find
파일 시스템 경계를 넘지 않는 방법에 대한 의견에서 Patrick의 Q를 다루고있었습니다 . 그의 전직. 그는 "/가 가득 찬 경우처럼 네트워크 파일 시스템이 마운트되어 있고 네트워크 파일 시스템으로 들어가고 싶지 않다"고 언급했습니다.
에 대한 자세한 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"
최대 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
이것은 나의 시간을 절약 한 나의 관찰이었습니다. 사람들은 이것보다 더 나은 해결책을 찾을 수 있습니다.
지금까지의 모든 대답은 문제가 단일 디렉토리에 많은 파일이 있고 문제를 일으키는 많은 서브 디렉토리가 아니라고 가정합니다. 다행히 해결책은 단순히 더 적은 수의 플래그를 사용하는 것입니다.
# 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
. 불행히도 모든 버전의 du
inode 옵션이있는 것은 아닙니다 .