मैं एक ext4 फाइलसिस्टम में इनोड की संख्या कैसे बढ़ा सकता हूं?


61

मुझे पिछले सप्ताह एक समस्या थी (मेरे लिए नई)। मेरे पास एक ext4 (फेडोरा 15) फाइलसिस्टम है। सर्वर पर चलने वाला एप्लिकेशन अचानक बंद हो गया। मुझे पहली नज़र में समस्या नहीं मिली।

df50% उपलब्ध स्थान दिखाया। लगभग एक घंटे की खोज के बाद मैंने एक फ़ोरम पोस्ट देखा, जहाँ उस आदमी ने प्रयोग किया था df -i। विकल्प इनोडेस उपयोग के लिए दिखता है। सिस्टम इनोड्स से बाहर था, एक साधारण समस्या जो मुझे महसूस नहीं हुई। विभाजन में केवल 3.2M इनकोड थे।

अब, मेरे प्रश्न हैं: क्या मैं सिस्टम में अधिक इनकोड कर सकता हूं? डिस्क को प्रारूपित करते समय क्या इसे सेट किया जा सकता है? 3.2M इनकोड के साथ, मेरे पास कितनी फाइलें हो सकती हैं?


1
प्रत्येक फ़ाइल या निर्देशिका एक इनोड का उपयोग करती है। एक फ़ाइल के लिए एक कड़ी एक इनकोड नहीं बनाता है। en.wikipedia.org/wiki/Inode
पॉल टॉम्बलिन

जवाबों:


33

ऐसा लगता है कि आपके पास सामान्य अपेक्षा से बहुत अधिक फाइलें हैं।

मुझे नहीं पता कि डायनॉमिक टेबल कोड को डायनेमिक रूप से बदलने का कोई उपाय है या नहीं। मुझे डर है कि आपको अपने डेटा का बैकअप लेने, और नई फ़ाइल सिस्टम बनाने, और अपने डेटा को पुनर्स्थापित करने की आवश्यकता है।

इस तरह के विशाल इनोड टेबल के साथ नया फाइल सिस्टम बनाने के लिए, आपको mke2fs (8) के '-N' विकल्प का उपयोग करने की आवश्यकता है।

मैं पहले '-n' विकल्प का उपयोग करने की सलाह दूंगा (जो fs नहीं बनाता है, लेकिन उपयोग-पूर्ण जानकारी प्रदर्शित करें) ताकि आप अनुमानित संख्याओं को प्राप्त कर सकें। फिर अगर आपको जरूरत है, तो एक विशिष्ट इनोड संख्या के साथ अपने फाइल सिस्टम को बनाने के लिए '-N' का उपयोग करें।


11
आप mke2fs -iइनोड की संख्या निर्दिष्ट करने के लिए उपयोग कर सकते हैं । इसके प्रलेखन से संकेत मिलता है कि "फ़ाइल सिस्टम पर इनोड की संख्या का विस्तार करने के बाद इसे बनाना संभव नहीं है"।
गिल्स

2
@piovisqui: प्रत्येक फ़ाइल इनोड पर उपभोग करती है, जो कि फाइलसिस्टम में एक सूचक है। यदि फ़ाइल किसी अन्य फ़ाइल की हार्ड-लिंक है तो इसमें एक ही इनोड है।
हनन एन।

6
@ गिल्स -iविकल्प इनोड के आकार को निर्दिष्ट करते हैं, न कि कितने हैं। -Nविकल्प नंबर inodes सेट।
illian २३'१४

1
इनोड और फ़ाइल नंबरों के बीच का संबंध आवश्यक रूप से 1: 1 नहीं है। पहले इनकोड में उन बिंदुओं की सूची होती है, जहां फ़ाइल संग्रहीत होती है। यदि ब्लॉक की सूची एक इनोड के भीतर फिट नहीं हो सकती है, तो इनोड में पॉइंटर्स की एक सूची शामिल होती है, जो उन ब्लॉकों को सूचीबद्ध करती है जहां फ़ाइल संग्रहीत है। अगर यह वहां फिट नहीं होता है तो यह ब्लॉक आदि की उस सूची के लिए गहरे सेट के 3 सेट चला जाता है
StuWhitby

2
@StuWhitby यह बिल्कुल सही नहीं है। एक एकल इनोड में कई सीधे पॉइंटर्स होते हैं, और एक सिंगल, डबल और ट्रिपल इनडायरेक्ट पॉइंटर। यदि ब्लॉक की सूची डायरेक्ट पॉइंटर्स में फिट नहीं हो सकती है, तो सिंगल इनडायरेक्ट पॉइंटर डेटा के एक ब्लॉक (एक और इनोड नहीं) पर इंगित करेगा जिसमें अधिक पॉइंटर्स होते हैं। यदि उससे अधिक पॉइंटर्स की आवश्यकता होती है, तो एक ब्लॉक पर डबल इनडायरेक्ट पॉइंटर पॉइंट्स होते हैं, जिसमें सिंगल इनडायरेक्ट पॉइंटर्स होते हैं, और डबल इनडायरेक्ट पॉइंटर्स वाले ब्लॉक पर ट्रिपल इनडायरेक्ट। तो एक फ़ाइल करता है, वास्तव में, आकार की परवाह किए बिना, केवल एक इनोड का उपयोग करें।
user125355

11

एक और वर्कअराउंड के रूप में मैं फ़ाइलों के विशाल संग्रह को एक असम्पीडित (!) tarसंग्रह में पैक करने पर विचार कर सकता हूं , और फिर archivemountइसे फाइलसिस्टम के रूप में माउंट करने के लिए उपयोग कर सकता हूं । एक टार आर्काइव एक फाइलसिस्टम छवि की तुलना में साझा करने के लिए बेहतर है और क्लाउड या किसी अन्य स्टोरेज के लिए बैकअप देते समय समान प्रदर्शन प्रदान करता है।


यदि संग्रह को केवल पढ़ने के लिए माना जाता है squashfs, तो यह एक विकल्प हो सकता है, लेकिन इसके लिए कर्नेल में सक्षम कुछ विकल्पों की आवश्यकता होती है, और xzसंपीड़न टार के साथ-साथ समान प्रदर्शन के लिए भी उपलब्ध होता है।


2
अच्छा सुझाव है।
पिविसक्वी

11

3.2 मिलियन इनकोड के साथ, आपके पास 3.2 मिलियन फाइलें और निर्देशिकाएं हो सकती हैं, लेकिन एक फ़ाइल में कई हार्डलिंक (केवल एक इनोड का उपयोग करने के लिए)।

हां, यह विभाजन पर एक फाइलसिस्टम बनाते समय सेट किया जा सकता है। विकल्प -T usage-type, -N number-of-inodesया -i bytes-per-inodeसभी इनोड की संख्या निर्धारित कर सकते हैं। मैं आम तौर पर उपयोग करने -iके उत्पादन में तुलना करने के बाद, du -sऔर find | wc -lफ़ाइलों की एक ऐसी ही संग्रह के लिए और कुछ ढीला के लिए अनुमति देता है।

नहीं, इसे किसी मौजूदा फाइल सिस्टम पर इन-प्लेस नहीं बदला जा सकता है। हालाँकि:

  • यदि आप LVM चला रहे हैं या फाइल सिस्टम एक SAN के LUN पर है (या तो सीधे LUN पर, या LUN पर अंतिम विभाजन के रूप में), या आपके पास विभाजन के बाद डिस्क पर खाली जगह है, तो आप विभाजन को बढ़ा सकते हैं और फिर resize2fsफाइलसिस्टम का विस्तार करने के लिए उपयोग करें। यह मोटे तौर पर जोड़े गए स्थान के अनुपात में अधिक इनोड जोड़ता है। यदि आप अंतरिक्ष से पहले इनोड से बाहर निकलने से बचना चाहते हैं, तो यह मानकर कि भविष्य की फाइलों का औसत आकार लगभग एक जैसा है, एक उच्च पर्याप्त आरक्षित किराए का उपयोग करके सेट करें tune2fs -m
  • यदि आपके पास पर्याप्त जगह है और आप फाइलसिस्टम को ऑफलाइन ले सकते हैं, तो इसे ऑफलाइन ले जाएं, अधिक इनसाइड के साथ एक नया फाइल सिस्टम बनाएं, और सभी फाइलों को कॉपी करें।
  • यदि फ़ाइलों का सिर्फ एक सबसेट बहुत सारे आयतों का उपयोग कर रहा है और आपके पास पर्याप्त खाली जगह है, तो फाइल सिस्टम पर एक फाइल द्वारा समर्थित लूप डिवाइस पर एक फाइलसिस्टम बनाएं, अधिक इनोड्स (और शायद छोटे ब्लॉक भी) के साथ फाइलसिस्टम बनाएं उस पर, और इसमें अपमानजनक निर्देशिकाओं को स्थानांतरित करें। यह शायद एक प्रदर्शन हिट और एक रखरखाव परेशानी है, लेकिन यह एक विकल्प है।
  • और हां, अगर आप बहुत सारी अनावश्यक फ़ाइलों को हटा सकते हैं, तो यह भी मदद करनी चाहिए।

6

मेरे पास इस स्थिति के लिए एक वैकल्पिक समाधान है। कहते हैं कि 10G के विभाजन में आपके पास 1000 इनकोड हैं । लेकिन इनोडेस सीमा के कारण आप विभाजन के सभी स्थान का उपयोग करने के लिए मान नहीं रहे हैं । लेकिन इस समाधान में आप विभाजन के शेष स्थान को बिना प्रारूपित किए उपयोग कर पाएंगे ।

$ df -i  # see list ( I need just one free inode here so move just one file into other PARTITION)
/dev/part1  1000 999 1 99.9%     /data

$ dd if=/dev/zero of=/data/new_data
$ mkfs.ext4 /data/new_data
$ mkdir /data1
$ mount /data/new_data /data1

स्थायी बढ़ते के लिए

$ echo "/data/new_data /data1 ext4 defaults 0 1" >> /etc/fstab

2
U & L में आपका स्वागत है। मैंने आपके उत्तर को कोड के अधिक सामान्य प्रतिनिधित्व के लिए पुन: स्वरूपित करने का अधिकार ले लिया, $ताकि कमांड और आउटपुट के बीच स्पष्ट रूप से अंतर करने के लिए एक प्रॉम्प्ट ( ) को सम्मिलित किया जा सके (यदि वे केवल कमांड थे, तो प्रॉम्प्ट सामान्य रूप से छोड़ दिया जाता है)। मैंने साहसिक चरण के जोर में SHOUTING को भी बदल दिया, जो कि मुझे लगता है कि आपका इरादा है। यदि आप चीजों को गलत तरीके से प्रस्तुत करते हैं तो आप वापस रोल कर सकते हैं
एंथन

मुझे लगता है कि इस समाधान में तर्क है, लेकिन आपको dd चलाते समय आकार का प्रबंधन करने की आवश्यकता है।
पोडाइसक्वी

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

6

हाल ही में इस समस्या में भाग लिया जब उपयुक्त या योग्यता उन्नयन का उपयोग कर।

df -h

Filesystem      Size  Used Avail Use% Mounted on
/dev/xvda1      7.8G  5.1G  2.3G  70% /

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 521497   2791  100% /

जारी की गई कमांड:

du /|sort -k1 -n

कई कर्नेल संस्करणों के लिए प्रकट की गई अधिकांश फ़ाइलें सबफ़ोल्डर में थीं:

/usr/src/linux-headers

हटाए गए उन सबफ़ोल्डर्स और इनोड समस्या को ठीक किया गया था।

df -i

Filesystem     Inodes  IUsed  IFree IUse% Mounted on
/dev/xvda1     524288 104986 419302   21% /

"डू / | सॉर्ट -k1 -n" शो इनोड्स करता है?
अनाथ

नहीं। यह निर्देशिकाओं को क्रमबद्ध करना था, जिसमें दिखाया गया था कि उनमें सबसे अधिक फाइलें हैं, जो फ़ोल्डर्स बहुत सारे इनोड का उपभोग कर रहे थे, लेकिन वास्तविक स्थान उपयोग कम: 30% मुक्त डिस्क स्थान की स्थिति अभी तक 100% इनोड का उपयोग ऊपर दिखाया गया है।
kph0x1

मुझे ईमानदारी से पता नहीं कैसे "डु" दिखाया गया है कि किसी भी झंडे के साथ कितनी फाइलें हैं? क्या आप कृपया विस्तार से बता सकते हैं?
अनाथ

duआदेश के लिए कोई ध्वज नहीं । उपयोग फ़ाइल-सिस्टम की जड़ के लिए है ऊपर के उदाहरण में, केवल अंतरिक्ष को देखते हुए। आउटपुट को क्रमबद्ध करने के लिए पाइप किया जाता है ताकि यह दिखाया जा सके कि कौन सी निर्देशिका में सबसे अधिक फाइलें हैं। फ़ाइलों के लिए उपरोक्त उदाहरण में, आपके प्रश्न के 'कितने फ़ाइल' भाग में गणना नहीं की गई है। कर्नेल स्रोत वाले duहालांकि आउटपुट में दिखाए गए अपराधी थे ; उदाहरण के लिए, पिछले संकलनों से कई छोटी फाइलें, उप-फ़ोल्डर, इनोड्स को मुक्त करने के लिए हटाने के लिए बहुत ही आदर्श रूप से उपयुक्त है। अभी भी एक मैनुअल रहता है, duआउटपुट की मानव समीक्षा , /usr/src/linux-headersतब स्पष्ट थी।
kph0x1

1
डु केवल बाइट्स दिखाता है - फाइलें नहीं। और आप केवल डु कमांड से ही आउटआउट को क्रमबद्ध कर रहे हैं। तो सॉर्ट -k1 -n आउटपुट को उस तरीके से कैसे सॉर्ट करता है जो आपने प्रस्तावित किया था? केवल एक चीज जो मैं देख सकता हूं, वह यह है कि "du / | Sort -k1 -n" केवल बाइट्स में आकार के आधार पर हर पंक्ति को सॉर्ट करता है। और कुछ नहीं
अनाथ

2

du -s --inodes * 2>/dev/null |sort -gउत्पादन और दोहराने में अंतिम dir में सीडी का प्रयास करें।

पूर्ण प्रकटीकरण: --inodesडु कमांड के लिए सभी ओएस का समर्थन ध्वज नहीं है (मेरा मैक ओएस नहीं है) लेकिन कई लिनक्स ओएस है।

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