सवाल क्या लिनक्स में / dev / null के बराबर निर्देशिका है?


किसी एप्लिकेशन को कॉन्फ़िगर करते समय, आप अक्सर उपयोग कर सकते हैं /dev/null कॉन्फ़िगरेशन फ़ाइल के रूप में यदि आप एप्लिकेशन को खाली फ़ाइल को पढ़ने के लिए चाहते हैं। लेकिन, यदि एप्लिकेशन निर्देशिका से फ़ाइलों की एक सूची पढ़ता है, तो आप इस चाल का उपयोग नहीं कर सकते हैं। आपको इसे पढ़ने के लिए एक खाली निर्देशिका देने की आवश्यकता होगी।

मैं सोच रहा था: क्या लिनक्स में एक डिफ़ॉल्ट खाली निर्देशिका है जिसका उपयोग ऐसे उद्देश्यों के लिए किया जा सकता है? मुझे पता है कि ओपनएसएसएच थोड़ी देर के लिए इस्तेमाल / var / खाली है, और मैं निश्चित रूप से एक खाली डीआईआर बना सकता हूं, लेकिन शायद एफएचएस ने इसके लिए एक मानक निर्देशिका निर्दिष्ट की है?


72
2017-12-07 09:04


मूल


मेरे सिस्टम पर, /var/empty खाली नहीं है, लेकिन एक फ़ोल्डर कहा जाता है sshd, तो आप शायद इसका उपयोग नहीं करना चाहते हैं। - knub
बस एक बिंदु: का विशेष पहलू /dev/null के लिए इतना नहीं है पढ़ना से संबंधित लिख रहे हैं।  डेटा लिखा है /dev/null बस गायब हो जाता है। तो, एक निर्देशिका बराबर एक जगह होगी जहां mv yourfile /dev/empty परिणामस्वरूप आपकी फाइल हटाना होगा। - Wildcard
@ वाइल्डकार्ड मुझे लगता है कि आपका मतलब है mv yourfile /dev/empty/। यदि तुम करो mv yourfile /dev/empty, आप विशेष निर्देशिका को प्रतिस्थापित करने की कोशिश कर रहे हैं। - Rhymoid
@ जुल्स नहीं, यह नहीं है। आप कुछ भी शुरू नहीं कर सकते हैं /dev/null तथा dd इसलिये dd एक ईओएफ प्राप्त होगा इससे पहले कि यह एक बाइट भी लिखा हो। मुझे लगता है कि आप सोच रहे हैं /dev/zero, जिसे अक्सर शून्य की एक विशिष्ट संख्या के साथ कुछ भरने या उत्पन्न करने के लिए प्रयोग किया जाता है। - Micheal Johnson
@MichealJohnson आप सही हैं, मेरी गलती, मैं उलझन में हूँ /dev/nullसाथ में /dev/zero। - Jules


जवाब:


FHS कोई "मानक" खाली निर्देशिका प्रदान नहीं करता है।

लिनक्स सिस्टम के लिए निर्देशिका प्रदान करना आम बात है /var/empty, लेकिन यह निर्देशिका एफएचएस में परिभाषित नहीं है और वास्तव में खाली नहीं हो सकती है। इसके बजाए, कुछ डेमॉन यहां अपनी खाली निर्देशिका बनाएंगे। उदाहरण के लिए, openssh खाली निर्देशिका का उपयोग करता है /var/empty/sshd विशेषाधिकार अलगाव के लिए।

यदि खाली निर्देशिका की आपकी आवश्यकता क्षणिक है, तो आप उपनिर्देशिका के रूप में स्वयं को एक खाली निर्देशिका बना सकते हैं /run या /tmp। यदि आप प्रोग्राम के बाहर ऐसा कर रहे हैं, तो आप इसका उपयोग कर सकते हैं mktemp -d इसके लिए, या उपयोग करें mkdtemp(3) आपके कार्यक्रम के अंदर सी समारोह। हालांकि आप हमेशा उपस्थित होने के लिए खाली निर्देशिका की आवश्यकता है, एक बनाने के लिए विचार करें /var/empty जैसा कि openssh करता है।

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


62
2017-12-07 09:11



मैं उपनिर्देशिका बनाने के तहत अनुशंसा नहीं करता /var/empty, क्योंकि इसका उपयोग करने वाले किसी भी प्रोग्राम (जैसे ओपनएसएसएच में डिफ़ॉल्ट विन्यास) यह वास्तव में खाली होने की उम्मीद कर सकते हैं। ( /var/empty/sshd चीज एक अजीब RedHat-ism प्रतीत होता है; डेबियन उपयोग करता है /var/run/sshd बजाय।) - Ilmari Karonen
@IlmariKaronen आपके द्वारा लिंक किए गए कोड का थोड़ा सा हिस्सा आपके दावे का समर्थन नहीं करता है कि ओपनएसएसएच अपेक्षा करता है /var/empty खाली होना क्या कहीं और कोई इसे देख सकता है? - Michael Hampton♦
@IlmariKaronen एचएम, वह दस्तावेज पुराना है। यह इसे संदर्भित करता है /var/empty लेकिन कोड वास्तव में उपयोग करता है /var/empty/sshd। पुनः प्रयास करें। :) - Michael Hampton♦
@IlmariKaronen हम्म। अब मुझे लगता है कि आप वास्तव में स्रोत को देखकर सही हैं, जो chroot () कॉल करता है। मुझे यह आश्चर्यजनक लगता है कि openssh में ऐसी स्पष्ट रूप से बेवकूफ दोष होगी, कि Red Hat को डाउनस्ट्रीम सुधार को बनाए रखना होगा। - Michael Hampton♦
मुझे नहीं लगता कि यह एक "बेवकूफ दोष" है - एक मानक स्थान पर एक गारंटीकृत खाली रूट-स्वामित्व वाली निर्देशिका होने के कारण, क्रोट जेल के रूप में उपयोग के लिए, मुझे एक बिल्कुल अच्छा विचार लगता है। बेशक, रेडहाट को इसके अधीन उपनिर्देशिका बनाकर, सभी के लिए जाना और बर्बाद करना पड़ा। नतीजतन, पोर्टेबल कोड के लिए मेरी सिफारिश का उपयोग नहीं किया जाएगा /var/empty किसी भी चीज़ के लिए, क्योंकि आप किसी दिए गए सिस्टम पर इसके अर्थशास्त्र के बारे में सुनिश्चित नहीं हो सकते हैं। अपनी खाली निर्देशिका बनाना के अंतर्गत /var/run, डेबियन की तरह, अधिक समझदार लगता है। - Ilmari Karonen


आप उपयोग कर सकते हैं mktemp -d डिफ़ॉल्ट अनुमतियों के साथ, सुरक्षित अनुमतियों के साथ एक नई खाली अस्थायी निर्देशिका बनाने के लिए /tmp/। उपयोगिता नई निर्देशिका के पथ को आउटपुट करेगी STDOUT, तो यह खोल में उपयोगी है।

यह वैसे भी एक systemd इकाई फ़ाइल से अधिक पोर्टेबल है।


37
2017-12-07 11:04



हां, आप कर सकते हैं, लेकिन यह अव्यवहारिक है अगर उस निर्देशिका को कॉन्फ़िगरेशन फ़ाइल में निर्दिष्ट किया जाना है। आप इसके लिए एक स्थायी डीआईआर चाहते हैं। - roelvanmeer


यह यूनिक्स प्रश्न एक "ब्लैकहोल" निर्देशिका बनाने के लिए कुछ सुझाव हैं, जिनमें ए शामिल है nullfs FUSE फाइल सिस्टम


19
2017-12-07 21:37



मुझे नहीं पता कि mktemp / mkdtemp उत्तर इतनी भारी क्यों है जब यह सही जवाब है। nullfs / dev / null के बराबर है। - chx


सेवाओं के लिए systemd विकल्प प्रदान करता है PrivateTmp निजी बनाने के लिए /tmp तथा /var/tmp निर्देशिका जो उस सेवा के नामस्थान के बाहर प्रक्रियाओं द्वारा साझा नहीं की जाती हैं और जो खाली (प्रारंभ में) होनी चाहिए।

[Service]
ExecStart=...
PrivateTmp=yes 

11
2017-12-07 10:20



कार्यक्रम अन्य अस्थायी फ़ाइलों को बना सकता है, इसलिए आप नहीं मान सकते हैं /tmp केवल खाली हो जाएगा क्योंकि इसे नामित किया गया है। - Michael Hampton♦