इनोड उपयोग कैसे मुक्त करें?


275

मेरे पास एक डिस्क ड्राइव है जहां इनोड का उपयोग 100% ( df -iकमांड का उपयोग करके ) है। हालाँकि, फ़ाइलों को पर्याप्त रूप से हटाने के बाद, उपयोग 100% रहता है।

फिर इसे करने का सही तरीका क्या है?

यह कैसे संभव है कि कम डिस्क स्थान उपयोग वाली डिस्क ड्राइव में उच्च डिस्क स्थान उपयोग के साथ डिस्क ड्राइव की तुलना में अधिक इनोड का उपयोग हो सकता है?

क्या यह संभव है अगर मैं बहुत सारी फाइलें जिप करूं जो कि इस्तेमाल की गई इनोड गिनती को कम कर दें?


4
इस प्रश्न के लिए आपको 50 अंक देना चाहते हैं। मैं कैसे कर सकता हूँ! :)
सोफी

@Sophy ऐसा मत करो। आपको ऑटो-बैन हो जाएगा
स्टीवन लू

1
@StevenLu आपकी जानकारी के लिए धन्यवाद! मैं उसे श्रेय देना चाहता हूं क्योंकि मैंने अपनी समस्या को हल करने के लिए कुछ दिन बिताए। लेकिन यह मुद्दा मेरी मदद कर सकता है। फिर से धन्यवाद,
सोफी

1
@Sophy: क्यों एसओ के लिए ऑफ-टॉपिक कुछ पुरस्कार? :) यह निश्चित रूप से एक प्रोग्रामिंग सवाल नहीं है, इससे कोई फर्क नहीं पड़ता कि इसे कितने उत्थान मिलते हैं।
tink

खाली निर्देशिका भी आयतों का उपभोग करती है। उन्हें हटाने से कुछ इनोडों को मुक्त किया जा सकता है। संख्या कुछ उपयोग-मामलों में महत्वपूर्ण हो सकती है। आप के साथ खाली निर्देशिकाओं को हटा सकते हैं: खोजें। -टाइप d -empty -delete
रुचिट पटेल

जवाबों:


170

डिस्क के लिए बड़ी संख्या में इनोड का उपयोग करना काफी आसान है, भले ही डिस्क बहुत भरी न हो।

एक इनकोड एक फाइल को आवंटित किया जाता है, यदि आपके पास फ़ाइलों की गज़िलियन हैं, तो सभी 1 बाइट, आप डिस्क से बाहर निकलने से बहुत पहले इनोड से बाहर निकल जाएंगे।

यह भी संभव है कि यदि फ़ाइलों में कई हार्ड लिंक हैं, तो फ़ाइलों को हटाने से इनकोड की संख्या कम नहीं होगी। जैसा कि मैंने कहा, inodes फ़ाइल, के हैं निर्देशिका प्रविष्टि। यदि किसी फ़ाइल में दो निर्देशिका प्रविष्टियाँ जुड़ी हुई हैं, तो एक को हटाना इनोड को मुक्त नहीं करेगा।

इसके अतिरिक्त, आप एक निर्देशिका प्रविष्टि को हटा सकते हैं लेकिन, यदि एक चल रही प्रक्रिया में अभी भी फ़ाइल खुली है, तो इनोड को मुक्त नहीं किया जाएगा।

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

यदि आप ऐसा करते हैं और आपको अभी भी कोई समस्या है, तो हमें बताएं।

वैसे, यदि आप उन निर्देशिकाओं की तलाश कर रहे हैं जिनमें बहुत सारी फाइलें हैं, तो यह स्क्रिप्ट मदद कर सकती है:

#!/bin/bash
# count_em - count files in all subdirectories under current directory.
echo 'echo $(ls -a "$1" | wc -l) $1' >/tmp/count_em_$$
chmod 700 /tmp/count_em_$$
find . -mount -type d -print0 | xargs -0 -n1 /tmp/count_em_$$ | sort -n
rm -f /tmp/count_em_$$

12
बेशक, >/tmp/count_em_$$यह तभी काम करेगा जब आपके पास इसके लिए जगह होगी ... यदि ऐसा है, तो @ सिमोन का जवाब देखें।
alxndr 21

1
@alxndr, इसीलिए अक्सर अपने फाइल सिस्टम को अलग रखने का एक अच्छा विचार है - इस तरह, कुछ इस तरह /tmpसे भरने से आपके फाइल सिस्टम पर कोई असर नहीं पड़ेगा।
paxdiablo

आपका जवाब पूरी तरह से उपयुक्त है "सिस्टम रिबूट के बाद फ़ाइल का उपयोग नहीं करेगा यदि वह हटा दिया गया था"। लेकिन सवाल पूछा गया था कि "इनकोड पॉइंटर डिलीट होने के बाद इनोड्स को फिर से कैसे प्राप्त करना या फिर से उपयोग करना है?"। मूल रूप से लिनक्स कर्नेल जब भी बनाया जाता है, तो एक फ़ाइल के लिए एक नया इनोड बनाता है, और जब भी आप फ़ाइल को हटाते हैं तो स्वचालित रूप से इनकोड को पुनः प्राप्त नहीं करते हैं।
मोहनराज

1
@AshishKarpe, मुझे लगता है कि आप अपनी स्थिति के बारे में बात कर रहे हैं क्योंकि ओपी ने उत्पादन सर्वर का कोई उल्लेख नहीं किया है। यदि आप immedaively रीबूट नहीं कर सकते हैं तो दो संभावनाएं हैं। सबसे पहले, आशा है कि उड़ान में प्रक्रियाएं वर्तमान फाइलों को बंद कर देती हैं ताकि डिस्क संसाधनों को मुक्त किया जा सके। दूसरा, यहां तक ​​कि उत्पादन सर्वर में कुछ बिंदु पर रिबूट करने की गुंजाइश होनी चाहिए - बस कुछ नियोजित डाउनटाइम शेड्यूल करें या डाउनटाइम की अगली विंडो के आने की प्रतीक्षा करें।
paxdiablo

2
मुझे लगता है आप के ls -Aबजाय चाहते हैं ls -a। आप क्यों गिनना चाहेंगे? तथा ..?
जारो

205

यदि आप बहुत अशुभ हैं, तो आपने लगभग 100% सभी इनोड का उपयोग किया है और स्कोर नहीं बना सकते हैं। आप इससे जांच कर सकते हैं df -ih

तब यह बैश कमांड आपकी मदद कर सकता है:

sudo find . -xdev -type f | cut -d "/" -f 2 | sort | uniq -c | sort -n

और हां, इसमें समय लगेगा, लेकिन आप सबसे अधिक फ़ाइलों के साथ निर्देशिका का पता लगा सकते हैं।


8
यह चाल है। मेरी समस्या के लिए / lib / php / सत्र निर्देशिका में सत्रों की एक अविश्वसनीय राशि थी। शायद किसी को एक ही समस्या है
SteMa

2
किसी को इस खोज को फिर से लिखना चाहिए, कट, यूनीक सॉर्ट को एक एकल awk कमांड में बदलना चाहिए!
मोगसी

5
@alxndr awkनिर्देशिका का एक हैश और uniqing बिना फाइलों की गिनती और एक गजियन लाइनों को छांट कर रख सकता है। उस ने कहा, शायद यहाँ एक सुधार है: find . -maxdepth 1 -type d | grep -v '^\.$' | xargs -n 1 -i{} find {} -xdev -type f | cut -d "/" -f 2 | uniq -c | sort -n- यह केवल अंतिम सूची को छाँटता है।
मोगी

12
यदि आप कोई भी फाइल नहीं बना सकते हैं , तो वह भी विफल हो sortसकती है क्योंकि सब कुछ मेमोरी में रखने में विफल हो सकता है और अस्थायी फ़ाइल लिखने के लिए स्वचालित रूप से वापस गिरने का प्रयास करेगा। एक प्रक्रिया जो स्पष्ट रूप से विफल हो जाएगी ...
मिकको रेंटालिनेन

10
sortमेरे लिए असफल रहा, लेकिन मैं वह --buffer-size=10Gकाम करने में सक्षम था जो काम करता था।
फ्रेडरिक नॉर्ड

69

मेरी स्थिति यह थी कि मैं इनोड्स से बाहर था और मैंने पहले ही सब कुछ हटा दिया था।

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361     11  100% /

मैं एक ubuntu 12.04LTS पर हूं और पुराने लिनेक्स गुठली को हटा नहीं सका, जिसने लगभग 400,000 इनसाइड ले लिया क्योंकि अनुपलब्ध पैकेज की वजह से टूट गया था। और मैं नए पैकेज को स्थापित नहीं कर सका क्योंकि मैं इनोड से बाहर था इसलिए मैं फंस गया था।

मैंने लगभग 10,000 इनोड्स को मुक्त करने के लिए हाथ से कुछ पुराने लिनक्स कर्नेल को हटा दिया

$ sudo rm -rf /usr/src/linux-headers-3.2.0-2*

यह तब पर्याप्त था जब मुझे लापता पैकेज स्थापित करने और मेरे उपयुक्त को ठीक करने के लिए पर्याप्त था

$ sudo apt-get install linux-headers-3.2.0-76-generic-pae

और फिर एप्टीट्यूड के साथ बाकी के पुराने लिनक्स कर्नेल को हटा दें

$ sudo apt-get autoremove

चीजें अब बहुत बेहतर हैं

$ df -i
Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/sda1      942080 507361 434719   54% /

3
यह इसी तरह की स्थिति में मेरे अपने दृष्टिकोण के सबसे करीब था। यह की कीमत ध्यान देने योग्य बात है कि एक और अधिक सतर्क दृष्टिकोण अच्छी तरह से प्रलेखित है help.ubuntu.com/community/Lubuntu/Documentation/...
beldaz

मेरा मामला बिल्कुल! लेकिन प्रगति के लिए "sudo apt-get autoremove -f" का उपयोग करना था
टोनी सीपिया

क्या ऐसा करना सुरक्षित है:, sudo rm -rf /usr/src/linux-headers-3.2.0-2*अगर मुझे यकीन है कि मैं उस कर्नेल का उपयोग नहीं कर रहा हूँ?
मंगल ली।

@MarsLee आप जाँच कर सकते हैं कि कौन सा कर्नेल वर्तमान में "uname -a" के साथ चल रहा है
डॉमिनिक इव

$ sudo apt-get autoremoveअकेले बुलाकर मेरे लिए चाल चली।
मोर्टन ग्राम सेप

49

मेरा समाधान:

यह खोजने की कोशिश करें कि क्या यह इनोड्स समस्या है:

df -ih

बड़े इनोड की गिनती के साथ रूट फ़ोल्डर खोजने की कोशिश करें:

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

विशिष्ट फ़ोल्डर खोजने का प्रयास करें:

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

यदि यह लिनक्स हेडर है, तो इसके साथ सबसे पुराना हटाने का प्रयास करें:

sudo apt-get autoremove linux-headers-3.13.0-24

व्यक्तिगत रूप से मैंने उन्हें एक घुड़सवार फ़ोल्डर में स्थानांतरित कर दिया (क्योंकि मेरे लिए अंतिम आदेश विफल रहा) और इसके साथ नवीनतम स्थापित किया:

sudo apt-get autoremove -f

इससे मेरी समस्या हल हो गई।


1
मेरे मामले में मुद्दा था SpamAssasin-Tempfind /var/spool/MailScanner/incoming/SpamAssassin-Temp -mtime +1 -print | xargs rm -fकाम किया :) धन्यवाद!
जॉयस्टिक

4
मेरे लिए, यह घंटे लग रहे थे। हालाँकि, इसका एक सरल समाधान है: जब दूसरी कमांड किसी विशेष निर्देशिका पर लटकी हो, तो वर्तमान कमांड को मारें और जो भी डाइरेक्टरी उस पर लटकी थी, उसे बदलने / * को पुनः आरंभ करें। मैं अपराधी को ड्रिल करने में सक्षम था <मिनट।
माइकल टेरी

मैंने एक ही पंक्ति पर संख्याओं को प्रिंट करने के लिए आपके आदेश के इस संस्करण का उपयोग किया: for i in /usr/src/*; do echo -en "$i\t"; find $i 2>/dev/null |wc -l; done
cscracker

for i in /src/*; do echo "$i, `find $i |wc -l`"; done|sort -nrk 2|head -10शीर्ष 10 सबसे बड़ी निर्देशिका दिखाओ
मार्क साइमन

12

मेरे पास एक ही समस्या थी, इसे php के निर्देशिका सत्रों को हटाकर तय किया

rm -rf /var/lib/php/sessions/

/var/lib/php5यदि आप पुराने php संस्करण का उपयोग कर रहे हैं तो यह निम्न हो सकता है ।

निम्नलिखित अनुमति के साथ इसे फिर से बनाएँ

mkdir /var/lib/php/sessions/ && chmod 1733 /var/lib/php/sessions/

डिबियन पर निर्देशिका के लिए डिफ़ॉल्ट रूप से अनुमति दर्शाई गई drwx-wx-wt(1733)


1
किसी भी विचार क्यों ऐसा होता है?
सिबिधरन

1
@ सिबिधरन मेरे मामले में ऐसा इसलिए था क्योंकि पुराने PHP सत्रों को खाली करने के लिए PHP क्रोन का काम नहीं कर रहा था।
गंभीर

3
rm -rf /var/lib/php/sessions/*शायद एक बेहतर आदेश होगा - यह सत्र निर्देशिका को नहीं निकालेगा, बस इसकी सामग्री ... फिर आपको इसे फिर से बनाने के बारे में चिंता करने की ज़रूरत नहीं है
छाया

मैं php सत्र नहीं था, लेकिन Magento सत्र का मुद्दा, इसी के समान। दिशा के लिए धन्यवाद।
मोहित


2

हमने एक स्पैम हमले के बाद एक HostGator खाते (जो अपने सभी होस्टिंग पर इनोड सीमाएं रखता है) पर इसका अनुभव किया। इसने /root/.cpanel/comet में बड़ी संख्या में कतार रिकॉर्ड छोड़ दिए। यदि ऐसा होता है और आपको पता चलता है कि आपके पास कोई मुफ़्त इनोड नहीं है, तो आप इस cpanel उपयोगिता को शेल के माध्यम से चला सकते हैं:

/usr/local/cpanel/bin/purge_dead_comet_files

2

आप बड़ी संख्या में फ़ाइलों को हटाने के लिए RSYNC का उपयोग कर सकते हैं

rsync -a --delete blanktest/ test/

इसमें 0 फ़ाइलों के साथ रिक्त फ़ोल्डर बनाएँ और कमांड आपके परीक्षण फ़ोल्डरों को बड़ी संख्या में फ़ाइलों के साथ सिंक करेगा (मैंने इस पद्धति का उपयोग करके लगभग 5M फ़ाइलों को हटा दिया है)।

धन्यवाद http://www.slashroot.in/which-is-the-fastest-method-to-delete-files-in-linux


मैं लेख / टिप्पणियों से जो बता सकता हूं, यह rm *वाइल्डकार्ड का विस्तार करने और प्रत्येक तर्क को पारित / संसाधित करने के कारण बहुत सारी फ़ाइलों की तुलना में तेज़ है , लेकिन बहुत सारी फ़ाइलों वाले फ़ोल्डर rm test/को हटाने के लिए ठीक है test/
mwfearnley

सिर ऊपर है, यह अच्छी तरह से काम करता है, लेकिन सुनिश्चित करें कि आपने रिक्त निर्देशिका पर अनुमतियों को सही ढंग से सेट किया है! मैंने ऐसा नहीं किया और अनजाने में अपने PHP सत्र निर्देशिका पर अनुमतियों को बदल दिया। दो घंटे लग गए कि मैंने क्या पंगा लिया।
किस्सा

1

eaccelerator समस्या पैदा कर सकता है क्योंकि यह PHP को ब्लॉकों में संकलित करता है ... मुझे भारी लोड वाली साइट पर अमेज़ॅन AWS सर्वर के साथ यह समस्या हुई है। यदि आपके पास समस्याएँ बनी रहती हैं, तो eacelerator कैश को / var / cache / eaccelerator में हटाकर इनोड्स मुक्त करें।

rm -rf /var/cache/eaccelerator/*

(या जो भी आपके कैश डायर)


1

हमें हाल ही में इसी तरह की समस्या का सामना करना पड़ा है, अगर किसी प्रक्रिया में एक हटाई गई फ़ाइल को संदर्भित किया जाता है, तो आईनोड जारी नहीं किया जाएगा, इसलिए आपको lsof / की जांच करने की आवश्यकता है, और प्रक्रिया को फिर से जारी करना होगा।

अगर यहां गलत हूं तो मुझे सुधारो।


1

जैसा कि पहले कहा गया था, अगर बहुत सी छोटी फाइलें हैं, तो फाइलसिस्टम इनोड से बाहर चल सकता है। मैंने उन निर्देशिकाओं को खोजने के लिए कुछ साधन उपलब्ध कराए हैं जिनमें अधिकांश फाइलें यहाँ हैं


0

देर से जवाब: मेरे मामले में, यह मेरे सत्र की फाइलें थी

/var/lib/php/sessions

जो Inodes का उपयोग कर रहे थे।
मैं अपना क्रेटाब खोलने में भी असमर्थ था या नई निर्देशिका बनाने के लिए अकेले ही डिलीट ऑपरेशन चालू कर रहा था। चूंकि मैं PHP का उपयोग करता हूं, हमारे पास यह मार्गदर्शिका है जहां मैंने उदाहरण 1 से कोड की प्रतिलिपि बनाई और कोड के उस हिस्से को निष्पादित करने के लिए एक क्रोनजॉब स्थापित किया।

<?php
// Note: This script should be executed by the same user of web server 
process.

// Need active session to initialize session data storage access.
session_start();

// Executes GC immediately
session_gc();

// Clean up session ID created by session_gc()
session_destroy();
?>

यदि आप सोच रहे हैं कि मैंने अपना कॉन्टैब खोलने का प्रबंधन कैसे किया, तो ठीक है, मैंने सीएलआई के माध्यम से मैन्युअल रूप से कुछ सत्र हटा दिए।

उम्मीद है की यह मदद करेगा!


0

आप इस जानकारी को देख सकते हैं

for i in /var/run/*;do echo -n "$i "; find $i| wc -l;done | column -t

-2

अब तक इसके कई उत्तर और उपरोक्त सभी ठोस प्रतीत होते हैं। मुझे लगता है कि statजैसे आप साथ चलते हैं, वैसे ही आप सुरक्षित रहेंगे , लेकिन ओएस के आधार पर हो सकता है कि आपको कुछ इनसाइड एरर मिल जाएं। इसलिए किसी भी अतिप्रवाह समस्या से बचने के लिए अपनी स्वयं की statकॉल कार्यक्षमता को लागू करना 64bitकाफी संगत लगता है।


हम यहां उदाहरणों से प्यार करते हैं;)
बोहने

-3

यदि आप docker का उपयोग करते हैं, तो सभी चित्र हटा दें। उन्होंने कई जगह का इस्तेमाल किया ...।

सभी कंटेनरों को रोकें

docker stop $(docker ps -a -q)

सभी कंटेनरों को हटा दें

docker rm $(docker ps -a -q)

सभी छवियों को हटा दें

docker rmi $(docker images -q)

मेरे लिए काम करता है


यह यह पता लगाने में मदद नहीं करता है कि "बहुत सारे इनोड्स" समस्या हैं।
मार्क स्टोसबर्ग

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