मैं / dev / null-like "ब्लैकहोल" निर्देशिका कैसे बना सकता हूं?


81

मैं एक " /dev/null" निर्देशिका (या एक "ब्लैकहोल" निर्देशिका) बनाना चाहूंगा जैसे कि इसके लिए लिखी गई कोई भी फ़ाइल वास्तव में नहीं लिखी जाती है, लेकिन बस गायब हो जाती है।

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

इस पुराने संबंधित सूत्र को भी देखें ।


ऐसा लगता है कि FUSE एक विकल्प हो सकता है: kerneltrap.org/mailarchive/linux-kernel/2008/2/15/868564/thread
Stefan Lasiewski

मैंने बस अपने आप से एक ही सवाल पूछा, और निर्देशिका के लिए उसी नाम का उपयोग किया जिसे मैं बनाने में विफल रहा।
ixtmixilix 6

जवाबों:


48

यह मेरे द्वारा ज्ञात किसी भी यूनिक्स पर आउट-ऑफ-द-बॉक्स समर्थित नहीं है, लेकिन आप FUSE के साथ बहुत कुछ कर सकते हैं । Nullfs¹ का कम से कम एक कार्यान्वयन है , एक फाइलसिस्टम जहाँ हर फ़ाइल मौजूद है और ऐसा व्यवहार करता है /dev/null(यह एकमात्र कार्यान्वयन नहीं है जिसे मैंने कभी देखा है)।

¹ साथ भ्रमित होने की नहीं * बीएसडी nullfs है, जो के अनुरूप है bindfs


फैंटास्टिक - मैंने इसे SO
फिल लेलो

1
उस प्रोग्राम पर संकलित त्रुटियों के साथ समाप्त होने वाले लोगों के लिए एक नोट: g++ -Wall -o nullfs nullfs.c++ `pkg-config fuse --cflags --libs`मेरे लिए काम किया।
ixtmixilix

क्या आप मुझे अन्य कार्यान्वयनों की ओर इशारा कर सकते हैं? क्योंकि मैं नहीं मिल सकता है किसी भी
Freedo

@ फ़्रीडो मुझे संदेह है कि बहुत से लोगों ने इसे सीखने की कवायद के रूप में किया है और इसे अस्वीकार कर दिया है। वे अब वेब पर नहीं हो सकते हैं।
गिल्स

7

एक अन्य दृष्टिकोण LD_PRELOAD आवरण होगा; मूल रूप से एक छोटा सा साझा पुस्तकालय जो libc.so से पहले लोड किया गया है, और संभावित फ़ाइल पथ की जांच करने वाली चीज़ के साथ "ओपन" करने के लिए कॉल को स्वीकार करता है और "/ dev / null" को प्रतिस्थापित करता है अगर यह लक्ष्य निर्देशिका में होगा।

यह (ए) पूरी तरह से उपयोगकर्ता-अंतरिक्ष में होने का लाभ है - कोई कर्नेल हैकिंग की आवश्यकता नहीं है; और (बी) केवल एक गलत आवेदन को प्रभावित कर रहा है।

एक सरल उदाहरण http://www.noah.org/wiki/LD_PRELOAD_notes पर है , लेकिन आपके मामले में आप "ओपन" और "क्रिएशन" सिस्टम कॉल को इंटरसेप्ट करना चाहेंगे।


3
... यह मानते हुए कि आवेदन सीधे int 0x80/ syscall/ sysenter/ के माध्यम से नहीं, बल्कि libc के माध्यम से सिस्टम कॉल करता है ।
रुस्लान

1

यदि प्रोग्राम इतना बेवकूफ है कि आप उन लॉग को बंद न करें, तो क्या यह लॉग फ़ाइल खोलने के बाद त्रुटियों की जांच नहीं कर सकता है? मैं कुछ डमी रीड-ओनली फाइल सिस्टम (उदाहरण के लिए mount -o loop) का उपयोग करने की कोशिश करूँगा ।


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

1

आप कहते हैं कि स्क्रिप्ट के साथ समय-समय पर फ़ाइलों को निकालना पर्याप्त तेज़ नहीं है। क्या आप किसी ऐसे ट्रिगर के साथ रह सकते हैं जो किसी भी समय अस्थायी फ़ाइल को हटा देता है, जब आपका आवेदन लिखना समाप्त कर देता है और उसे बंद कर देता है? यदि ऐसा है, तो आप "inotify" API का उपयोग कर सकते हैं।

( Http://en.wikipedia.org/wiki/Inotify और https://github.com/rvoicilas/inotify-tools/wiki/ देखें )


1
कई प्रणालियों पर, एक फ़ाइल को हटाना जो एक प्रक्रिया को खोलती है अपनी निर्देशिका प्रविष्टि को हटा देती है, लेकिन फ़ाइल स्वयं डिस्क पर रहती है जब तक कि वह अंतिम प्रक्रिया द्वारा बंद नहीं होती है। प्रक्रियाएं फाइलें लिख सकती हैं और फिर शुरुआत की तलाश करके उन्हें वापस पढ़ा जा सकता है, और इसलिए ओएस सिर्फ डेटा को फेंक नहीं सकता है।
21

0

मैंने लिनक्स कर्नेल में ramfs उदाहरण के आधार पर एक कर्नेल मॉड्यूल बनाया है, यह मूल रूप से एक ब्लैकहोल फाइल सिस्टम है जिसे nullfsvfs कहा जाता है। FUSE सिस्टम कार्यान्वयन को कर्नेल मॉड्यूल के रूप में सीधे कार्यान्वयन की तुलना में उपयोगकर्ता से कर्नेलस्पेस पर डेटा कॉपी करने की आवश्यकता है और यह काफी धीमा है। देख:

https://github.com/abbbi/nullfsvfs


-8

बस उस निर्देशिका को सहानुभूति दें /dev/null

rm -rf ~/.logs
ln -s /dev/null ~/.logs

/dev/null, एक निर्देशिका होना जरूरी नहीं है। यदि कार्यक्रम लिखने की कोशिश करता है ~/.logs/log1.dump, तो यह अभी भी सही है /dev/null
मैं Google Chrome के कैश के लिए ऐसा करता हूं क्योंकि कुछ समय बाद यह इतना बड़ा हो जाता है कि Chrome को प्रारंभ होने में कुछ मिनट लगेंगे।


3
यह काम नहीं करेगा क्योंकि सहानुभूति फाइलें हैं, निर्देशिका नहीं। कोशिश कर echo hello > ~/.logs/log1.dumpदेता है ~/.logs/log1.dump: Not a directory। हालाँकि, echo hello > ~/.logsकाम करता है क्योंकि .log एक फ़ाइल है।
dogbane

2
आप हमसे मजाक कर रहे होंगे। $ ln -s /dev/null dev-null; touch dev-null/zzzमुझे देता हैtouch: cannot touch 'dev-null/zzz': Not a directory
एलेक्स

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

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

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