खोजें कि इनोड का उपयोग कहां किया जा रहा है


189

इसलिए मुझे हमारी निगरानी प्रणाली से हमारे एक बॉक्स पर एक चेतावनी मिली कि एक फाइल सिस्टम पर मुफ्त इनोड की संख्या कम हो रही थी।

df -i आउटपुट यह दिखाता है:

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

जैसा कि आप देख सकते हैं, रूट विभाजन में 81% इनोड का उपयोग किया गया है।
मुझे संदेह है कि वे सभी एक ही निर्देशिका में उपयोग किए जा रहे हैं। लेकिन मुझे कैसे पता चलेगा कि वह कहाँ पर है?

जवाबों:


214

मैंने स्टैकओवरफ्लो पर इस सवाल को देखा , लेकिन मुझे कोई भी जवाब पसंद नहीं आया, और यह वास्तव में एक सवाल है जो यूएई और एल पर वैसे भी होना चाहिए।

मूल रूप से फाइल सिस्टम पर प्रत्येक फाइल के लिए एक इनकोड का उपयोग किया जाता है। तो आमतौर पर इनोड से बाहर निकलने का मतलब है कि आपको बहुत सारी छोटी फाइलें मिल गई हैं। तो सवाल वास्तव में हो जाता है, "किस निर्देशिका में बड़ी संख्या में फाइलें हैं?"

इस स्थिति में, हम जिस फाइल सिस्टम की परवाह करते हैं, वह रूट फाइल सिस्टम है /, इसलिए हम निम्नलिखित कमांड का उपयोग कर सकते हैं:

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से सभी इनोड्स का उपभोग कर रहा है।

ध्यान दें, इस उत्तर में तीन चेतावनी हैं जिनके बारे में मैं सोच सकता हूं। यह रास्ते में नई चीज़ों को ठीक से संभाल नहीं पाता है। मुझे पता है कि मेरे फाइलसिस्टम के पास नईलाइनों के साथ कोई फाइल नहीं है, और चूंकि यह केवल मानव उपभोग के लिए उपयोग किया जा रहा है, संभावित मुद्दा हल करने के लिए लायक नहीं है (और हमेशा ऊपर के \nसाथ बदल सकते हैं \0और उपयोग कर सकते हैं sort -z)। यदि फ़ाइलों को बड़ी संख्या में निर्देशिकाओं में फैलाया जाता है, तो यह भी हैंडल नहीं करता है। हालांकि इसकी संभावना नहीं है, इसलिए मैं जोखिम को स्वीकार्य मानता हूं। यह कई बार एक ही फाइल के हार्ड लिंक को भी गिनाएगा (इसलिए केवल एक इनोड का उपयोग करके) कई बार। फिर, झूठी सकारात्मक देने की संभावना नहीं है


स्टैकओवरफ्लो उत्तर पर किसी भी उत्तर को पसंद नहीं करने का मुख्य कारण यह है कि वे सभी फाइल सिस्टम सीमाओं को पार करते हैं। चूँकि मेरा मुद्दा रूट फाइलसिस्टम पर था, इसका मतलब यह है कि यह हर एक माउंटेड फाइल सिस्टम को आगे बढ़ाएगा। -xdevखोजने के आदेश पर फेंक भी ठीक से काम नहीं करेगा।
उदाहरण के लिए, सबसे उत्कीर्ण उत्तर यह है:

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 जो मेरे उत्तर का हिस्सा नहीं है, मैं इस सवाल पर टिप्पणी कर रहा था कि मैं इस प्रश्न का एक सामान्य उत्तर क्यों है क्योंकि मैं इस समाधान को नापसंद करता हूं।
पैट्रिक

7
बाइंड माउंट का उपयोग करना अन्य फाइल सिस्टमों को खोजने से बचने का एक अधिक मजबूत तरीका है क्योंकि यह माउंट पॉइंट्स के तहत फाइलों तक पहुंचने की अनुमति देता है। उदाहरण के लिए, कल्पना कीजिए कि मैं 300,000 फाइलें बनाता हूं /tmpऔर फिर बाद में सिस्टम को एक tmpfs माउंट करने के लिए कॉन्फ़िगर किया गया है /tmp। तब आप फ़ाइलों को findअकेले नहीं पा सकेंगे । बेखटके सिनारियो, लेकिन ध्यान देने योग्य है।
ग्रीम

2
दोनों ही तरह से काम निकालना पड़ा क्योंकि सॉर्ट करने के लिए एक फाइल बनाने की जरूरत होती है जब आउटपुट काफी बड़ा होता है, जो कि संभव नहीं था क्योंकि मैं 100% इनोड्स का उपयोग करता था।
qwertzguy

1
ध्यान दें कि -printfखोजने के लिए एक GNU एक्सटेंशन प्रतीत होता है, क्योंकि OS X में उपलब्ध BSD संस्करण इसका समर्थन नहीं करता है।
जिओनीज चामिओसोव

1
यह धारणा कि सभी फाइलें एक ही निर्देशिका में हैं, एक मुश्किल है। बहुत सारे कार्यक्रम जानते हैं कि एक एकल निर्देशिका में कई फ़ाइलों का प्रदर्शन खराब है और इस तरह निर्देशिकाओं का एक या दो स्तर है
प्लाज़्मा एचएच

26

यह पूछने वाले के कहने पर यहाँ से दिया गया है:

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 के साथ:

कई लोगों ने उल्लेख किया कि उनके पास अप-टू-डेट कोरुटिल्स नहीं हैं और --इनोड्स विकल्प उनके पास उपलब्ध नहीं है। तो, यहाँ है:

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वहाँ की जगह filenameमें से प्रत्येक में ls'sनिर्देशिका नाम के साथ पुनरावर्ती खोज परिणामों जिसमें यह पाया गया था। वहाँ से यह सिर्फ दोहराया इनोड संख्या निचोड़ने की बात है फिर दोहराया निर्देशिका नामों की गिनती और तदनुसार छँटाई।

-Uविकल्प में छँटाई के साथ विशेष रूप से उपयोगी है कि यह विशेष रूप से करता है नहीं सॉर्ट, और बदले मूल आदेश में निर्देशिका सूची प्रस्तुत करता है -, या दूसरे शब्दों में से inodeनंबर।

और निश्चित रूप -1से इसमें अविश्वसनीय रूप से मददगार है कि यह प्रति पंक्ति में एक ही परिणाम सुनिश्चित करता है, चाहे फ़ाइलनेम या अन्य शानदार दुर्भाग्यपूर्ण समस्याओं में संभावित रूप से शामिल नई लाइनें शामिल हों, जब आप किसी सूची को पार्स करने का प्रयास करते हैं।

और निश्चित रूप -Aसे सभी के लिए और -iइनसोड के लिए और -Rपुनरावर्ती के लिए और यह लंबी और छोटी है।

इसका अंतर्निहित तरीका यह है कि मैं ls के फ़ाइलनाम में से प्रत्येक को इसके युक्त निर्देशिका नाम से जोड़ देता हूं। उस पर से ... खैर, मैं अपने आप को थोड़ा फजी हूँ। मैं काफी हद तक निश्चित रूप से फाइलों को गिन रहा हूं, जैसा कि आप यहां देख सकते हैं:

% _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 DEMO

% 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

और ग्रीम:

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

इसलिए मुझे लगता है कि यह दिखाता है कि इनोड को गिनने का एकमात्र तरीका इनोड है। और क्योंकि फाइलों की गिनती का मतलब है कि इनोड्स को गिनना, आप इनकोड को दोगुना नहीं कर सकते - फाइलों को सही तरीके से गिनने के लिए एक से अधिक बार काउंट नहीं किया जा सकता है।


2
कौन सा संस्करण जोड़ा गया --inodes? कौन सा "वेरिएंट" / "फ्लेवर" / "पॉज़िक्स-वानाबेस" / "इंप्लीमेंटेशन" / जो कुछ भी है?
n611x007

उबंटू 14.04.5: du: अपरिचित विकल्प '--inodes'
पुटनिक

2014 से डु (GNU कोरुटिल्स) 8.23 ​​में यह (यह मेरे पुराने डेबियन जेसी में है)। डेबियन> उबंटू को उस सज़ा के लिए खेद है: पी उबंटू में इतने पुराने पैकेज हैं ...
डैनियल डब्ल्यू।

6

मैंने SO Q & A शीर्षक से इस उत्तर का उपयोग किया: मेरे सभी इनोड कहां उपयोग किए जा रहे हैं? जब हमारे 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 - अद्यतन देखने के लिए, आप का उपयोग कर इसे नियंत्रित कर सकते हैं -fstypeकरने के लिए find
स्लम

1
@Gilles - सरल उत्तर ... नहीं पृष्ठ नीचे खोज के आदमी पेज 8) में सभी तरह से किया था
SLM

@ गिल्स - मैन पेज से प्रतीत नहीं होता है कि -xtypeफाइलसिस्टम को छोड़कर यह फाइल के प्रकार को देखता है। मैं केवल इस तरह उदाहरण खोजने हूँ:find . \( -fstype nfs -prune \)
SLM

@ गिल्स - मैं टिप्पणियों में पैट्रिक के क्यू को संबोधित कर रहा था कि findफाइलसिस्टम सीमाओं को कैसे पार किया जाए। अपने पूर्व में। उन्होंने उल्लेख किया है "जैसे कि अगर / क्या व्हाट्सएप फुल है, और आपके पास नेटवर्क फाइलसिस्टम माउंट है, तो आप नेटवर्क फाइल सिस्टम में डाइविंग नहीं करना चाहते हैं"।
स्लम


3

के लिए विस्तृत इनकोड उपयोग को सूचीबद्ध करने के लिए /, निम्नलिखित कमांड का उपयोग करें:

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" 

स्वागत है! मेरा सुझाव है, अगली बार बेहतर प्रारूप, कृपया।
पेटेर

1
इसके एक oneliner, मैं उस के साथ कुछ भी गलत नहीं देख रहा हूँ।
sjas

2

निश्चित रूप से अधिकतम अपवर्जन के साथ उत्तर देने से लिनक्स और यूनिक्स में इनोड्स की अवधारणा को समझने में मदद मिलती है, लेकिन जब डिस्क को हटाने या हटाने की वास्तविक समस्या से निपटने की बात आती है तो यह वास्तव में मदद नहीं करता है। उबंटू आधारित प्रणालियों पर ऐसा करने का एक सरल तरीका अवांछित लिनक्स कर्नेल हेडर और छवियां हटा देता है।

sudo apt-get autoremove

आपके लिए वही करेगा। मेरे मामले में, इनसाइड का उपयोग 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उदाहरण के लिए जा सकते हैं और देख सकते हैं कि निर्देशिकाओं का उपयोग करने वाले बड़े इनोड क्या हैं।


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:। दुर्भाग्य से सभी संस्करणों में duइनोडस विकल्प नहीं है।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.