/ Etc / मेजबान आकार सीमा क्या है?


44

मैं किस आकार की सीमा निर्धारित या निर्धारित कर सकता हूं /etc/hosts? इसकी कितनी रेखाएँ हो सकती हैं?


64
... मैं बिंदु जहां यह एक शैक्षणिक जिज्ञासा आप है के बजाय एक वास्तविक चिंता हो जाता है पर लगता है कि अब तक जहां यह समझदार होगा प्रदर्शन और रख-रखाव के मामले में एक निजी DNS सर्वर स्थापित करने के लिए पारित कर दिया।
शादुर

5
मुझे आश्चर्य है कि आप पूछ रहे हैं। आप कॉन्फ़िगरेशन फ़ाइलों पर कुछ सटीक और कठिन सार्थक आकार सीमा की अपेक्षा क्यों करते हैं?
बेसिल स्टारीनेवविच

3
@BasileStarynkevitch मैंने पूछा क्योंकि एक ~ 2 MB होस्ट फ़ाइल मेरे राउटर पर काम नहीं कर रही थी, लेकिन मुद्दा यह था कि मैंने मेजबान फाइल को फिर से पढ़ने के लिए dnsmasq नहीं किया।
जेरमिया

2
@Geremia मेरी होस्ट फ़ाइल 500M, 15,000+ प्रविष्टियाँ है, कोई समस्या नहीं है। अपनी समस्या के मूल कारण को निर्धारित करने और उसे हल करने के लिए हमेशा सबसे अच्छा है
bsd

3
क्या आप IP पते को ब्लॉक करने के लिए अपनी होस्ट फ़ाइल का उपयोग कर रहे हैं? यदि ऐसा है तो आपको ipset के साथ iptables का उपयोग करना चाहिए। अकेले iptables का उपयोग करने से एक प्रमुख प्रदर्शन प्रभावित होगा, हालांकि ipset के साथ लगभग 500,000 ips की सूची पर नगण्य प्रभाव पड़ता है।
साइबरनार्ड

जवाबों:


57

समसामयिक प्रभावों में धीमा होस्टनाम रिज़ॉल्यूशन शामिल है (जब तक कि ओएस किसी तरह रैखिक सूची को एक तेज-से-खोज तंत्र में परिवर्तित नहीं करता है?) और tabकिसी भी सार्थक फ़ाइल आकार तक पहुंचने से पहले शेल के साथ आश्चर्यजनक बातचीत की संभावना है।

उदाहरण के लिए! अगर एक जगह 500,000 होस्ट एंट्री होती हैं/etc/hosts

# perl -E 'for (1..500000) { say "127.0.0.10 $_.science" }' >> /etc/hosts

विज्ञान के लिए, tabZSH में पूरा होने वाला डिफ़ॉल्ट होस्टनाम एक पूरा प्रॉम्प्ट वापस करने के लिए मेरे सिस्टम पर लगभग ~ 25 सेकंड लेता है (दी गई, यह 2008 से 5400 आरपीएम डिस्क के साथ लैपटॉप पर है, लेकिन अभी भी)।


21

मुझे नहीं लगता कि लाइनों की संख्या के संदर्भ में इसका आकार सीमा है।

DNS (जो 1985 में उपयोग में लाया गया था) से पहले, यह फाइल थी जो होस्ट नाम लुकअप करने के लिए एकमात्र साधन के रूप में सेवा की थी, इसलिए मैं मानता हूं कि इसका मतलब यह है कि फाइल में हजारों या कम से कम सैकड़ों प्रविष्टियां होनी चाहिए। सबसे अच्छी तरह से जुड़े पूर्व 1985 इंटरनेट नोड्स का समर्थन करने में सक्षम हो।

यहां 1985 से एक उदाहरण है (प्रारूप कुछ हद तक बदल गया है): http://jim.rees.org/apollo-archive/hosts.txt इस फ़ाइल में 1680 लाइनें हैं जिनमें से 1325 होस्ट लाइनें हैं। शेष 355 लाइनें रिक्त हैं, टिप्पणियाँ, नेटवर्क या गेटवे 1

एकमात्र वास्तविक सीमा जो मुझे मिल सकती थी, वह यह थी कि कुछ प्रणालियों पर, व्यक्तिगत लाइनेंBUFSIZ वर्णों से कम (मेरी ओपनबीएसडी मशीन पर 1024) तक सीमित हैं ।

यदि आपके पास कुछ मुट्ठी भर से अधिक प्रविष्टियाँ हैं /etc/hosts, तो आपको इसके बजाय एक स्थानीय नाम सर्वर स्थापित करने पर विचार करना चाहिए, लेकिन यह मेरी व्यक्तिगत राय है।


1 इस खुदाई के लिए जेफ Schaller के लिए धन्यवाद।


डीएनएस से पहले, मुझे नहीं लगता कि पूर्ण इंटरनेट होस्ट तालिका को /etc/hostsप्रारूप में बदलना आम बात थी । अधिकांश यूनिक्स सिस्टम इंटरनेट पर भी नहीं थे, और यहां तक ​​कि अगर एक मशीन थी, तो उसे एक पूर्ण मेजबान तालिका की आवश्यकता नहीं थी, बस मुट्ठी भर मशीनों की जरूरत थी। मुझे आश्चर्य होगा अगर 100 से अधिक प्रविष्टियों के साथ कई मशीनें थीं।
बरमार

13

मैं / etc / मेजबानों की आकार सीमा कैसे निर्धारित कर सकता हूँ?

यह एक नियमित फ़ाइल है, इसलिए यह सीमा अंतर्निहित फाइल सिस्टम की सीमाओं के अनुरूप होगी (जो कि इसके पीछे डिस्क की संख्या से खुद को छाया हुआ होगा), उसी (संभवत: रूट ( /)) फाइल सिस्टम में किसी भी अन्य फ़ाइलों द्वारा उपयोग किए जाने वाले स्थान को घटाता है:

  • ext2 / 3: 2 TiB
  • ext4: 16 TiB (डिफ़ॉल्ट 4KiB ब्लॉक आकार के साथ)
  • xfs: 500 टीआईबी

मैं / etc / मेजबान की आकार सीमा कैसे निर्धारित कर सकता हूं?

चूंकि यह मैन्युअल रूप से संपादित की गई फ़ाइल है, केवल मैन्युअल रूप से:

sed -i '100,$d' /etc/hosts

(100 और उससे अधिक लाइनों को हटाने के लिए)।


3
सिद्धांत रूप में सही है, लेकिन फ़ाइल सिस्टम सीमाएं (जैसे टेराबाइट्स) व्यावहारिक रूप से काफी हद तक अप्रासंगिक हैं।
बेसिल स्टारीनेवविच

11

स्थैतिक बफ़र आवंटित करते समय आकार सीमाएँ केवल लागू होती हैं। gethostbyname(3), जो प्रविष्टियों को पार्स /etc/hostsकरता है, स्थैतिक बफ़र आवंटित नहीं करता है - और कभी नहीं। बीएसडी 4.3 एल्गोरिथ्म का मूल 1983 रिलीज एक खुली-फाइल दिखाता है, जबकि पार्स लाइन, क्लोज-फाइल पैटर्न:

sethostent(0);
while (p = gethostent()) {
    if (strcmp(p->h_name, name) == 0)
        break;
    for (cp = p->h_aliases; *cp != 0; cp++)
        if (strcmp(*cp, name) == 0)
            goto found;
}
found:
endhostent();

आधुनिक कार्यान्वयन इस विरासत को सभी आवश्यक चीजों में बनाए रखते हैं।

वैसे भी, आंतरिक रूप से, *hostentफ़ंक्शन का परिवार फ़ाइल पॉइंटर को वर्तमान लाइन में फ़ाइल में संग्रहीत करता है। sethostentफ़ाइल को खोलता है और फ़ाइल पॉइंटर स्थिति सेट करता है। gethostentडेटा मिलता है और पॉइंटर को आगे बढ़ाता है। endhostentफ़ाइल पॉइंटर बंद करता है। जीएनयू सी लाइब्रेरी इन कार्यों पर गहन संदर्भ प्रदान करती है।

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

इसलिए, कोई फर्क नहीं पड़ता कि फ़ाइल कितनी बड़ी है, ओएस इसका उपभोग करेगा। आखिरकार, हालांकि, आप फाइल सिस्टम सीमा (प्रति जेफ स्कॉलर के उत्तर ) से टकराएंगे । आपके पास अधिकतम लाइन आकार सीमाएँ ( कुसलानंद के उत्तर के अनुसार ) हैं। लेकिन, अंत में, आप इसे जितना चाहें उतना बड़ा बना सकते हैं। लेकिन कृपया, नहीं।


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

1
4.3BSD संस्करण यहाँ है । इसने / etc / मेजबान के dbm-hashed संस्करण का समर्थन किया। IIRC, dbm ने कुछ आकार सीमाएं लगाईं, जो विफल होने के लिए हैश डीबी बनाने के प्रयासों का कारण बन सकती हैं।
मार्क प्लॉटनिक

2

... मैंने अपना दिमाग रौंद दिया है और मेरे जीवन के लिए मैं एक भी ऐसी स्थिति या परिस्थिति के बारे में नहीं सोच सकता हूँ जहाँ आप किसी भी प्रकार की आकार सीमा के मुद्दे पर संपर्क करेंगे /etc/hosts- आप गंभीर जैसी व्यावहारिक समस्याओं में भाग लेंगे getaddrinfo()सिस्टम कॉल के परिवार में प्रदर्शन हिट है कि सभी को फ़ाइल का परामर्श करने से पहले यह निर्धारित करना होगा कि क्या एक DNS क्वेरी को बाहर भेजना है, यह कहने के लिए कि एक फ्लैट पाठ फ़ाइल को बनाए रखने में कोई समस्या नहीं है।

मुझे संदेह है कि हमारे यहां जो कुछ भी है वह उच्च स्तर पर संवाद करने में विफलता है। आप एक विशाल /etc/hostsफ़ाइल के साथ क्या समस्या हल करने की कोशिश कर रहे हैं ? मुझे लगभग तय है कि इससे बेहतर समाधान है।


8
कुछ लोग hostsविज्ञापन / मालवेयर / ट्रैकिंग / आदि को ब्लैकलिस्ट करने के लिए एक फ़ाइल का उपयोग करते हैं । इंटरनेट पर क्यूरेट की गई सूची हैं, मैं जो उपयोग करता हूं वह 41k लाइनों और 1.1MB आकार का है।
बर्ट

यह संभव है dnsmasqकि प्रदर्शन के लिए उपयोग करना बेहतर होगा - उदाहरण के लिए dnsgate देखें (जो मैंने कोशिश नहीं की है)।
रिस्टोरियरपोस्ट

मेरा 57k लाइनों के साथ 1.7MB है। आप अपनी बड़ी /etc/hostsफाइल को होस्ट्सफाइल.ऑर्ग
स्टायरोफोम फ्लाई

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