İnode'un nerede kullanıldığını bulun


189

Böylece, bir sistemimizdeki izleme sistemimizden, bir dosya sistemindeki serbest düğüm sayısının azaldığına dair bir uyarı aldım.

df -i çıktı bunu gösterir:

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

Gördüğünüz gibi, kök bölüm kullanılan inode değerlerinin% 81'ine sahip.
Hepsinin tek bir dizinde kullanıldığından şüpheleniyorum. Ama nerede olduğunu nasıl bulabilirim?

Yanıtlar:


214

Bu soruyu yığma akışta gördüm , ancak cevapların hiçbirini beğenmedim ve bu gerçekten de U & L'de olması gereken bir soru.

Temel olarak, dosya sistemindeki her dosya için bir inode kullanılır. Bu nedenle, inode'ların tükenmesi genellikle etrafta bir sürü küçük dosya bulunduğunu gösterir. Yani soru gerçekten, "Hangi dizinde çok sayıda dosya var?"

Bu durumda, önem verdiğimiz dosya sistemi kök dosya sistemidir /, bu nedenle aşağıdaki komutu kullanabiliriz:

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

Bu, o dizindeki dosya sayısı (ve alt dizinleri) ile önceden belirlenmiş dosya sistemindeki her dizinin bir listesini atacaktır. Böylece en fazla sayıda dosya içeren dizin en altta olacaktır.

Benim durumumda, bu aşağıdakini açar:

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

Yani temelde /var/spool/postfix/maildroptüm düğümleri tüketiyor.

Not, bu cevabın aklıma gelen üç uyarısı var. Yoldaki yeni satırlarla hiçbir şeyi düzgün şekilde işlemez. Dosya sistemimin yeni satırları olan dosyaları olmadığını biliyorum ve bu yalnızca insan tüketimi için kullanıldığından, olası sorun çözülmeye değmez (ve her zaman yukarıdaki \nile değiştirip \0kullanabiliriz sort -z). Ayrıca, dosyaların çok sayıda dizine dağılmış olması durumunda işlemez. Bu mümkün değil, bu yüzden riski kabul edilebilir buluyorum. Aynı zamanda (aynı anda sadece bir inode kullanarak) aynı dosyaya sabit linkler sayar. Yine, yanlış pozitif verme olasılığı düşük


Stackoverflow cevabındaki cevaplardan hiç hoşlanmamamın asıl nedeni, bunların hepsi dosya sistemi sınırlarını aşması. Sorunum kök dosya sisteminden geldiği için, bu her bağlı dosya sisteminden geçeceği anlamına geliyor. -xdevBul komutlarını atmak bile düzgün çalışmaz.
Örneğin, en çok oy alan cevap şudur:

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

Yerine bunu değiştirirsek

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

/mnt/foomount olmasına rağmen , aynı zamanda kök dosya sistemindeki bir dizindir, böylece devreye girecek find . -mount -type dve sonra da mount'a dalacak olana ls -a $igeçecektir.

findCevabım yerine montaj çerçevesi üzerine her dosyanın dizini listeler. Yani temelde bir dosya yapısı ile:

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

sonunda

/foo
/foo
/pop

Bu yüzden sadece kopya satır sayısını saymak zorundayız.


2
Cevabımın bir parçası olmayan @MohsenPahlevanzadeh, bu sorunun ortak bir cevabı olduğu için neden çözümden hoşlanmadığımı yorumluyordum.
Patrick,

7
Bir bağlama bağlama kullanmak, bağlama noktaları altındaki dosyalara erişime izin verdiği için diğer dosya sistemlerinde arama yapmaktan kaçınmak için daha sağlam bir yoldur. Örneğin, altında 300.000 dosya oluşturduğumu /tmpve daha sonra sistemin bir tmpfs takmak için yapılandırıldığını hayal edin /tmp. O zaman dosyaları findtek başına bulamazsın . Olası bir senario, ama kayda değer.
Graeme

2
Her iki çalışmada da sıralama kaldırılmalıydı çünkü sıralama yeterince büyük olduğunda bir dosya oluşturmaya ihtiyaç duyuyordu, bu da inode kullanımının% 100'ünü kullandığım için mümkün değildi.
qwertzguy

1
-printfOS X'de bulunan BSD sürümü desteklemediğinden, bulunacak bir GNU uzantısı gibi göründüğünü unutmayın .
Xiong Chiamiov

1
Tüm dosyaların tek bir dizinde olduğu varsayımı zor. Birçok program, tek bir dizindeki birçok dosyanın kötü performansa sahip olduğunu ve bu nedenle bir veya iki dizin düzeyine sahip olduğunu
bilir

26

Bu, buradan talep edenin isteğiyle tekrar gönderilir:

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

Ve aynı dosya sisteminde kalmak istiyorsanız, şunları yapın:

du --inodes -xS

İşte bazı örnek çıktı:

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

ŞİMDİ LS İLE:

Birkaç kişi, güncel coreutils'lere sahip olmadıklarını ve --inodes seçeneğinin kendilerine uygun olmadığını belirtti. Yani, işte:

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

Merak ediyorsanız, o sıkıcı bit kalbi-ve-ruh regexorada yerini almaktadır filenameher birinde ls's, bulunduğu dizinin adı ile özyinelemeli arama sonuçlarında. Oradan sadece tekrarlanan inode numaralarını sıkmak, sonra tekrarlanan dizin adlarını saymak ve buna göre sıralama yapmak söz konusudur.

-USeçeneği özellikle olmadığını sıralama ile özellikle yararlıdır değil sıralamak ve bunun yerine orijinal sırayla dizin listesini sunar - tarafından, diğer bir deyişle, ya inodesayı.

Ve elbette -1, dosya adlarındaki muhtemel yeni satırlardan veya bir listeyi ayrıştırmaya çalışırken oluşabilecek diğer olağanüstü talihsiz sorunlardan bağımsız olarak, her satırda tek bir sonuç elde edilmesinde inanılmaz derecede faydalıdır.

Ve elbette -Aherkes -iiçin, inode ve -Rözyinelemeli ve bunun için uzun ve kısa.

Bunun altında yatan yöntem, her birinin dosya isminin sed içindeki dizin ismiyle değiştirilmesidir. Bundan sonra ... Şey, kendimi biraz bulanık hissediyorum. Burada gördüğünüz gibi dosyaları doğru bir şekilde saydığına eminim:

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

Bu bana dukomuta hemen hemen aynı sonuçlar veriyor :

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:

Bence bu includesadece programın ilk önce hangi dizine bakacağına bağlı - çünkü aynı dosyalar ve sabitlenmişler. Yukarıdaki gibi bir şey. Yine de bu konuda yanılmış olabilir - ve düzeltme hoş geldiniz ...

DU DEMO

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

Bir test dizini yapın:

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

Bazı çocuk dizinleri:

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

Bazı dosyalar yapın:

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

Bazı sabit bağlantılar:

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

Hardlinklere bak:

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

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

Yalnız sayılırlar, ama bir dizini yukarı çıkar ...

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

Sonra ran betiğimi aşağıdan çalıştırdım ve:

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

Ve Graeme'nin:

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

Bence bu, inode saymanın tek yolunun inode olduğunu gösteriyor. Dosyaları saymak, düğümleri saymak anlamına geldiğinden, düğümleri iki kez saymazsınız - dosyaları doğru bir şekilde saymak için düğümler bir defadan fazla sayılamaz.


2
Hangi sürümü eklendi --inodes? hangi "değişkenler" / "tatlar" / "posix-wannabes" / "uygulamalar" / hangisi varsa?
n611x007

Ubuntu 14.04.5: du: tanınmayan seçenek '--inodes'
Putnik

du (GNU coreutils) 2014'den 8.23 ​​var (eski Debian Jessie'mde). Debian> Ubuntu bu haber için üzgünüm: P Ubuntu'nun çok eski paketleri var ...
Daniel W.

6

Bu cevabı SO Q&A başlıklı mesajdan kullandım : Bütün düğümlerim nerede kullanılıyor? NAS'ımız yaklaşık 2 yıl önce tükendiğinde:

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

Örnek

$ 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

Cihazın İnode'larını kontrol etme

NAS'ınıza bağlı olarak tam özellikli bir dfkomut sunmayabilir. Yani bu durumlarda tune2fsyerine kullanmak için başvurabilirsiniz :

$ 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

Dosya sistemi sınırlarını geçme

-xdevAnahtarı, findaramayı yalnızca aramayı başlattığınız cihaza daraltmak için yönlendirmek için kullanabilirsiniz .

Örnek

Benim var ki /home, adı mulder benim NAS, gelen NFS hisseleri yoluyla dizin automounting.

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

Bağlantı noktasının hala sistem için yerel olarak kabul edildiğine dikkat edin.

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

Şimdi başladığımda find:

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

Bulunan /homefakat hiçbir otomatik sayı içeriği yok çünkü farklı bir cihazdalar!

Dosya sistemi tipleri

Sen anahtarı kullanabilir find, -fstypetip en dosya sistemleri denetlemek için findiçine bakacağız.

   -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.

Örnek

Hangi dosya sistemine sahibim?

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

Yani geçişi kontrol etmek için bunu kullanabilirsiniz:

sadece 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

sadece nfs

$ find . -fstype nfs | head -5
$ 

ext3 ve 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

Dosya sistemi sınırlarını geçmesini engellemek için sizin çözümünüz ne olurdu? Eğer gibi /neyin doludur ve ağ dosya sistemleri monte varsa, ağ dosya sistemleri içine dalmak istemiyorum.
Patrick,

@Patrick - Kullandığınız kontrol edebilirsiniz, güncellemeleri görmek -fstypeiçin find.
slm

1
@Gilles - basit cevap ... bulmacanın adam sayfasında 8- hiç sayfa aşağı gitmedi
slm

@Gilles - man sayfası, -xtypedosya sistemlerini dışladığını, dosya türüne baktığını gösteriyor gibi görünmüyor . Sadece bunun gibi örnekler buluyorum:find . \( -fstype nfs -prune \)
slm

@Gilles - Ben finddosya sisteminin sınırlarını aşmamak için nasıl yorumlarda Patrick'in Q'sunu ele alıyordum . Onun eski “Ne dolu / dolu ise ve ağ dosya sisteminiz monte edilmişse, ağ dosya sistemlerine dalmak istemezsiniz” diyor.
slm

4

Kullanılan inode'yu bulmak için komut:

for i in /*; do echo $i; find $i |wc -l | sort ; done

3

Ayrıntılı inode kullanımını listelemek için /aşağıdaki komutu kullanın:

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" 

Buraya Hoşgeldiniz! Bir dahaki sefere daha iyi format lütfen.
Peter

1
Bu bir oneliner, bu konuda yanlış bir şey görmüyorum.
sjas

2

Kesinlikle en yüksek sürümlerle cevap vermek linux ve unix'teki inode kavramını anlamada yardımcı olur; Ubuntu tabanlı sistemlerde bunu yapmanın daha basit bir yolu, istenmeyen linux çekirdek başlıklarını ve görüntülerini kaldırmaktır.

sudo apt-get autoremove

Bunu senin için yapardım. Benim durumumda, inode kullanımı uyarısı aldığım için% 78 idi.

$ 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 autoremoveKomutu çalıştırdıktan sonra % 29'a düşmüş

$ 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

Bu sadece zamanımı kazandıran gözlemimdi. İnsanlar bundan daha iyi bir çözüm bulabilirler.


2

Aşağıdaki komutu kullanarak incelemeyi daha hızlı ve kolay buluyorum:

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

170202  var
157325  opt
103134  usr
53383   tmp
<snip>

Daha sonra varörneğin içeri girebilir ve dizinleri kullanan büyük inode'un orada ne olduğunu görebilirsiniz.


0

Şimdiye kadar verilen her cevap, sorunun, soruna katkıda bulunan birçok alt dizin yerine tek bir dizindeki birçok dosyada olduğunu varsayar. Neyse ki çözüm basitçe daha az bayrak kullanmak.

# 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

Veya daha kısa seçeneklerle: du --inodes -x | sort -n. Ne yazık ki tüm sürümleri duinode seçeneğine sahip değil .

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.