/ Tmp और / run में क्या अंतर है?


42

FHS-3.0 के अनुसार , /tmpअस्थायी फ़ाइलों के लिए है और /runरन-टाइम चर डेटा के लिए है। डेटा /runको अगले बूट पर हटा दिया जाना चाहिए, जिसकी आवश्यकता नहीं है /tmp, लेकिन फिर भी कार्यक्रमों को यह नहीं मानना ​​चाहिए कि डेटा /tmpअगले कार्यक्रम की शुरुआत में उपलब्ध होगा। यह सब मुझे काफी हद तक एक जैसा लगता है।

तो, दोनों में क्या अंतर है? किस मानदंड से एक कार्यक्रम तय करना चाहिए कि अस्थायी डेटा को अंदर रखा जाए /tmpया नहीं /run?

FHS के अनुसार:

कार्यक्रम का एक उपनिर्देशिका हो सकता है /run; यह उन कार्यक्रमों के लिए प्रोत्साहित किया जाता है जो एक से अधिक रन-टाइम फ़ाइल का उपयोग करते हैं।

यह इंगित करता है कि "सिस्टम प्रोग्राम" और "साधारण प्रोग्राम" के बीच का अंतर एक मानदंड नहीं है, न ही कार्यक्रम का जीवनकाल है (जैसे, लंबे समय तक चलने वाली बनाम छोटी चलने वाली प्रक्रिया)।

यद्यपि FHS में निम्नलिखित तर्क नहीं दिया गया है, लेकिन /runइस समस्या को दूर करने के लिए पेश किया /varगया था जो बहुत देर से मुहिम /var/runशुरू की गई थी ताकि जल्दी से जल्दी उपलब्ध कराने के लिए गंदे चालों की आवश्यकता हो। हालांकि, अब के साथ /runशुरू किया जा रहा है, और FHS में इसके विवरण को देखते हुए, दोनों के लिए एक स्पष्ट कारण हो प्रतीत नहीं होता है /runऔर /tmp


11
अस्थायी डेटा के लिए tmp * nix मानक स्थान है। / रन अस्थायी डेटा के लिए पॉइंटरिंग मानक स्थान है।
मार्क

बैकवर्ड
कॉम्बिबिलिटी

जवाबों:


16

दोनों / चलाने और / tmp होने का कोई कारण नहीं

मुझे लगता है कि आप सही हैं। /tmpअब हमारे पास अनिवार्य रूप से पदावनत है /run। यदि आपका कार्यक्रम ऐसा करने की स्थिति में है (जिसे आवश्यकता है कि इसे एक विशेषाधिकार प्राप्त ऑपरेशन के रूप में स्थापित किया गया था ), तो आजकल आप एक उप-निर्देशिका का उपयोग करेंगे /run। यह सुरक्षा कारणों से है।

उदाहरण के लिए CUPS प्रिंटिंग डेमॉन रूट के रूप में नहीं चलता है, लेकिन आम तौर पर एक OS पैकेज से स्थापित किया जाता है। पैकेज स्थापित करता है /usr/lib/tmpfiles.d/cups.conf, और systemd-tmpfilesएक निर्देशिका बनाता है जो इसे एक्सेस कर सकता है। चूंकि निर्देशिका चल रही है /run, नाम किसी दुर्भावनापूर्ण उपयोगकर्ता द्वारा दुर्भावनापूर्ण रूप से दावा नहीं किया जा सकता है, /tmpजिसके विपरीत यह विश्व-योग्य है।

"Unprivileged प्रोग्राम" जो /runसीधे उपयोग नहीं कर सकता

वास्तविक अंतर यह है कि यदि आपका प्रोग्राम मनमाने ढंग से अप्रभावित उपयोगकर्ता द्वारा चलाया जा रहा है, तो अपनी स्वयं की यूजर आईडी के तहत। लेकिन आप अभी भी आम तौर पर उपयोग नहीं करना चाहते हैं /tmp, क्योंकि यह अन्य अप्रभावित उपयोगकर्ताओं द्वारा पहुँचा जा सकता है। आप उपयोग करना पसंद करेंगे $XDG_RUNTIME_DIR। आमतौर पर इसे इस रूप में लागू किया जाता है /run/user/$(id -u)- इसलिए यह एक उपनिर्देशिका के /runरूप में अच्छी तरह से होता है। हालांकि स्थान की गारंटी नहीं है; कार्यक्रमों को हमेशा पर्यावरण चर का उपयोग करना चाहिए।

/tmpकेवल सिस्टम पर विभिन्न अप्रभावी उपयोगकर्ताओं के बीच तदर्थ सहयोग के लिए उपयोगी होगा। इस तरह के तदर्थ सिस्टम एक दुर्भावनापूर्ण उपयोगकर्ता के लिए संवेदनशील हैं जो सभी के लिए सह-संचालन और चीजों को खराब करने से इनकार कर रहे हैं :)। एक उदाहरण यूनीकेट talkसॉकेट का उपयोग करते हुए, डेमॉन के एक संस्करण को चलाने का निर्णय लेने वाले अप्रभावी उपयोगकर्ताओं का होगा ।

Lennart Poettering से मूल जानकारी

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

संचार उद्देश्यों के लिए विश्व-लेखन योग्य साझा नामस्थानों का उपयोग [जैसे / tmp] हमेशा समस्याग्रस्त रहा है, क्योंकि संचार स्थापित करने के लिए आपको स्थिर नामों की आवश्यकता होती है, लेकिन स्थिर नाम DoS हमलों के लिए दरवाजे खोलते हैं। प्रारंभिक बूट के दौरान कुछ सेवाओं के लिए संरक्षित प्रति-ऐप निर्देशिकाओं की स्थापना करके इसे आंशिक रूप से ठीक किया जा सकता है (जैसे हम X11 के लिए करते हैं), लेकिन यह केवल समस्या को आंशिक रूप से ठीक करता है, क्योंकि यह केवल तभी सही ढंग से काम करता है यदि प्रत्येक पैकेज की स्थापना रिबूट द्वारा की जाती है।

...

एक और फेडोरा सुविधा (फेडोरा 17 के लिए) ने कई प्रणालियों सेवाओं के लिए / tmp के शब्दार्थ को बदलकर उन्हें विभिन्न सेवाओं के / tmp नामस्थानों को अलग करके उन्हें अधिक सुरक्षित बनाया।

...

क्योंकि / tmp अब आवश्यक रूप से साझा नाम स्थान नहीं है, यह आम तौर पर संचार आदिम के लिए एक स्थान के रूप में अनुपयुक्त है।

...

[/ रन] एक tmpfs होने की गारंटी है और इसलिए यह स्वतः ही बूट में फ्लश हो जाता है। उससे आगे कोई भी स्वचालित सफाई नहीं की जाती है।

...

यहां एक मोटा गाइड है कि हम आपको कैसे सुझाव देते हैं (एक लिनक्स एप्लिकेशन डेवलपर) उपयोग करने के लिए सही निर्देशिका चुनें:

  1. आपको अपना सॉकेट (या अन्य संचार आदिम) लगाने के लिए जगह की आवश्यकता होती है और आपका कोड विशेषाधिकार प्राप्त होता है: नीचे / रन के लिए एक उपनिर्देशिका का उपयोग करें। (या अतिरिक्त संगतता के लिए / var / run के नीचे)
  2. आपको अपना सॉकेट (या अन्य संचार आदिम) लगाने के लिए जगह की आवश्यकता होती है और आपका कोड अप्रकाशित चलता है: $ XDG_RUNTIME_DIR के नीचे एक उपनिर्देशिका का उपयोग करें।
  3. आपको अपने बड़े डाउनलोड और डाउनलोड प्रगति पर रखने और अप्रभावित चलाने के लिए एक जगह की आवश्यकता है: $ XDG_DOWNLOAD_DIR का उपयोग करें।
  4. आपको कैशे फ़ाइलों को रखने के लिए एक जगह की आवश्यकता होती है जो लगातार होनी चाहिए और बिना लाइसेंस के चलनी चाहिए: $ XDG_CACHEH -HOME का उपयोग करें।
  5. उपरोक्त में से कुछ भी लागू नहीं होता है और आपको एक छोटी फ़ाइल रखने की आवश्यकता होती है जिसे किसी भी दृढ़ता की आवश्यकता नहीं होती है: $ TMPDIR का उपयोग करें / tmp पर गिरावट के साथ। और mkstemp (), और mkdtemp () और कुछ भी नहीं का उपयोग करें।
  6. अन्यथा $ TMPDIR का उपयोग / var / tmp पर गिरावट के साथ करें। इसके अलावा mkstemp () / mkdtemp () का उपयोग करें।

ध्यान दें कि ऊपर दिए गए ये नियम केवल हमारे द्वारा सुझाए गए हैं। ये नियम इस विषय के बारे में हम जानते हैं और वर्तमान और भविष्य के वितरण के साथ समस्याओं से बचते हैं, जहाँ तक हम उन्हें देख सकते हैं। कृपया इन नियमों का पालन करने के लिए अपनी परियोजनाओं को अपडेट करने पर विचार करें, और यदि आप नया कोड लिखते हैं तो उन्हें ध्यान में रखें।

एक बात जो हम तनाव देना चाहते हैं, वह यह है कि / tmp और / var / tmp अधिक बार नहीं वास्तव में आपके usasease के लिए सही विकल्प नहीं हैं। इन निर्देशिकाओं के मान्य उपयोग हैं, लेकिन अक्सर एक और निर्देशिका वास्तव में बेहतर जगह हो सकती है। तो, सावधान रहें, अन्य विकल्पों पर विचार करें, लेकिन यदि आप / tmp या / var / tmp के लिए जाते हैं तो कम से कम mkstemp () / mkdtemp () का उपयोग करना सुनिश्चित करें।

हम /tmpएक्स विंडो सिस्टम द्वारा उपयोग की जाने वाली विरासत सॉकेट के साथ दूर हो जाते हैं, जैसा कि ऊपर वर्णित है। मैंने शरारत की tmpfiles.d/x11.conf। ऐसा लगता है कि यह सह-संचालन पर निर्भर है :)। मुझे लगता है कि कोड का ऑडिट किया गया है, जैसे कि सेवा से वंचित करना सबसे खराब है जो हो सकता है।


8
यह उत्तर सभी प्रकार का गलत है।
आर ..

@R .., उस पर विस्तार करने के लिए देखभाल?
वाइल्डकार्ड

हां, मैंने पहले ही एक जवाब में किया था। (एक टिप्पणी के रूप में शुरू किया गया था, लेकिन मुझे एहसास हुआ कि यह एक उत्तर के अधिक था।)
आर ..

मुझे लगता है कि मेरे वर्तमान उत्तर में मुख्य कमजोरी, जो मुझे लगता है कि आप जिस दिशा में काम कर रहे थे, वह यह है कि तकनीकी रूप से, XDG_RUNTIME_DIR के सही हैंडलिंग को किसी भी * nix को पोर्टेबल होना आवश्यक है ("समान क्षमताओं के लिए प्रतिस्थापन निर्देशिका में वापस आना"), यह बहुत अस्पष्ट है कि व्यवहार में इसका क्या अर्थ है। पोर्टेबल उपयोगिता कार्यक्रमों के लिए, अच्छी तरह से परिभाषित मानक का उपयोग करना बेहतर है /tmp("इसका उपयोग करने के लिए एकमात्र एपीआई होना चाहिए mkstemp (), mkdtemp () (और दोस्तों) पूरी तरह से सुरक्षित होना चाहिए")।
sourcejedi

उत्तर मिस आम मामला भी है: /var/runसिस्टम वाइड (जैसे स्थानीय डेटाबेस से संवाद करने के लिए), /tmp/अब प्रति उपयोगकर्ता बनाया गया है । ऐतिहासिक रूप से, कोटा / tmp का कोटा भी अलग था। और उत्तर याद आता है कि उपयोग का एक अर्थ भेद भी महत्वपूर्ण है।
जियाकोमो कैटेनाज़ी

23

निर्देशिका /tmpऔर /usr/tmp(बाद में /var/tmp) सब कुछ और हर किसी के लिए डंपिंग ग्राउंड हुआ करती थी। इन निर्देशिकाओं में फ़ाइलों के लिए एकमात्र सुरक्षा तंत्र चिपचिपा सा है जो अपने मालिकों को हटाने या फ़ाइलों का नाम बदलने पर रोक लगाता है। जैसा कि मार्सेलम ने एक टिप्पणी में कहा है, सिद्धांत रूप में ऐसा कुछ भी नहीं है जो किसी को सेवाओं द्वारा उपयोग किए जाने वाले नामों के साथ फाइल बनाने से रोकता है (जैसे nginx.pidया sshd.pid)। (व्यवहार में, स्टार्टअप स्क्रिप्ट पहले ऐसी फर्जी फाइलों को हटा सकती है, हालांकि।)

/runलंबे समय तक सेवाओं जैसे ताला, सॉकेट, पीआईडी ​​फाइलों और इस तरह के गैर-निरंतर क्रम डेटा के लिए स्थापित किया गया था। चूंकि यह जनता के लिए योग्य नहीं है, इसलिए यह गंदगी /tmpऔर नौकरियों से सेवा रनटाइम डेटा को साफ करता है। दरअसल: दो वितरण है कि मैं चलाने (कोई यमक इरादा) अनुमतियों पर 755 है /run, जबकि /tmpऔर /var/tmp(और /dev/shmउस बात के लिए) अनुमति 1777 की है।


3
यह केवल मेस से सेवा रनटाइम डेटा को अलग करने के लिए है/tmp - इसके अलावा विभिन्न सफाई नौकरियों से जो कि पूरे रौंदने के लिए कहा जाता है के लिए एक सुरक्षित बंदरगाह प्रदान करता है /tmp
सातु कटुरा

अनुमतियों के बारे में जानकारी के लिए धन्यवाद। हालाँकि, FHS के अनुसार "प्रोग्राम में एक उपनिर्देशिका / रन हो सकता है; यह उन प्रोग्रामों के लिए प्रोत्साहित किया जाता है जो एक से अधिक रन-टाइम फ़ाइल का उपयोग करते हैं।" - यह "लंबे समय तक जीवित सेवाओं" की कसौटी के साथ-साथ सीमित अनुमतियों के कारण अपने उपनिर्देशिका बनाने के लिए कार्यक्रमों की अक्षमता के विपरीत लगता है।
डिर्क हेरमैन

@DirkHerrmann नहीं यह नहीं है। पर एक नज़र है /runऔर जटिल (अच्छी तरह से ...) की वजह से निर्देशिका संरचना की जाँच करें udev, udiskमैं इस विशेष मुद्दे पर एक विशेषज्ञ नहीं हूँ, लेकिन मुझे लगता है कि बूट स्क्रिप्ट (जो सुपरसुअर के रूप में चलाई जाती हैं) सब कुछ सेट करती हैं।
काउंटरमोड

2
"" रन तकनीकी रूप से आवश्यक नहीं है, यह बस सर्विस रनटाइम डेटा को मेस / tmp में गड़बड़ से अलग करने के लिए है। " - अच्छी बात यह भी है, इसलिए अनपेक्षित प्रक्रियाओं को नाम नहीं दिया जा सकता है जो सिस्टम सेवाओं का उपयोग करना चाहते हैं। अगर निगंक्स का उपयोग करना है तो किंडा बेकार है /tmp/nginx.pidलेकिन कुछ दुर्व्यवहार कार्यक्रम के कारण यह पहले से मौजूद है। /run/इसे लिखने के लिए विशेषाधिकारों की आवश्यकता को रोकता है।
मार्सेल

18

/tmpअस्थायी फ़ाइलों और निर्देशिकाओं के निर्माण का स्थान है। यह "सुप्रसिद्ध नामों" को संग्रहीत करने के लिए उपयोग करने योग्य नहीं है (यानी नाम किसी अन्य प्रक्रिया से अवगत हो सकते हैं बिना आपको किसी तरह नाम बताए) क्योंकि नामस्थान पर किसी का स्वामित्व नहीं है; कोई भी वहां फाइलें बना सकता है। जैसे कि आप आम तौर पर इसका उपयोग करते हैं जब आपके पास एक उपयोगिता होती है जिसे इनपुट या आउटपुट के रूप में एक फ़ाइल (यानी पाइप या ऐसा नहीं) की आवश्यकता होती है, जहां कोई भी (यादृच्छिक रूप से उत्पन्न) नाम तब तक काम करेगा जब तक आप नाम को पास नहीं करते।

ऐतिहासिक रूप से, कुछ चीजों (जैसे एक्स) ने इस सिद्धांत का उल्लंघन किया और प्रसिद्ध नामों (जैसे .X11-unix) को अंदर रखा /tmp। यह निश्चित रूप से छोटी गाड़ी है और किसी भी उपयोगकर्ता को वांछित नाम से एक फ़ाइल बनाने के लिए रेसिंग द्वारा बस सेवा करने की आवश्यकता है। इस तरह की चीजें /run(या समकक्ष रूप से /var/runयदि आप Freedesktop.org संशोधनवाद की सदस्यता नहीं लेते हैं) से संबंधित हैं। निश्चित रूप से बेहतर यह होगा कि उन्हें एक वैश्विक नामस्थान में प्रसिद्ध नामों का उपयोग न करने के लिए ठीक किया जाए, बल्कि एक पथनाम के आसपास से गुजरें।


"अस्थायी फ़ाइलों" पर कुछ और परिभाषा के लिए धन्यवाद। हालांकि मुझे नहीं लगता कि "एक पथनाम के आसपास से गुजरना" बताता है कि एक समन्वय बिंदु कैसे स्थापित किया जाए। यानी आमतौर पर आप एक पर्यावरण चर का उपयोग करेंगे। ऐसा लगता है कि इसे काम करने के लिए कुछ पर्याप्त सॉकेट और पाइप (सामान्य उपयोग में) हैं। (आंशिक रूप से क्योंकि बहुत सारी चीजें एक ही डब सॉकेट के ऊपर चलेंगी)। लगता है कि अगर प्रोग्राम हार्डकोडेड पथ के लिए डिफ़ॉल्ट नहीं था, तो यह पर्यावरण को सेट करने के लिए कष्टप्रद होगा । आप सिस्टमड .socketफाइलों में एक नई कुंजी जोड़ सकते हैं ... लेकिन यह पूरी निर्देशिका के लिए मदद नहीं करता है, न ही नई स्थापित सेवाओं के लिए
sourcejedi

2
/run/खुद को FHS द्वारा अपनाया गया था, मैं नहीं देख सकता कि इसका fd.o. से क्या लेना देना है जब तक कि हम वास्तव में शिकायत करने के लिए क्या करना चाहते हैं अनिर्दिष्ट विकास के प्रयास हैं जिन्होंने दोनों में योगदान दिया है।
sourcejedi

मुझे लगता है कि यहां प्रारंभिक उत्तर प्रश्न के लिए सबसे अच्छा उत्तर है जैसा कि लिखा गया है। मुझे लगता है कि इस पर विचार करके इसे और बेहतर किया जाएगा: _जब सॉफ्टवेयर ने एक समर्पित निर्देशिका तक पहुंच लिखी है /run, उदाहरण के लिए , यह /tmpअभी तक अधिक फ़ाइलों के साथ साझा निर्देशिका को अव्यवस्थित करने से बचने के लिए चुना जा सकता है ।
sourcejedi

"Fd.o" क्या है?
TRIG

7

फाइलसिस्टम पदानुक्रम मानक के अनुसार,

  • /run रनटाइम चर डेटा यानी रिबूट के बाद से चल रहे सिस्टम के बारे में जानकारी के लिए
  • /tmp अस्थायी फ़ाइलों के लिए एक सामान्य स्थान है।

डेमॉन स्टेटस, लॉग-इन किए गए उपयोगकर्ताओं, माउंटेड रिमूवेबल डिवाइसेस आदि के बारे में कुछ भी हो जाएगा, /runजबकि एक प्रोग्राम द्वारा बनाई गई अस्थायी फाइलें अंदर चली जाएंगी /tmp

संपादित करें: जैसा कि नीचे टिप्पणी में @JdeBP द्वारा बताया गया है,

एफएचएस क्रोन नौकरियों के पारंपरिक सेटअप जैसी चीजों के लिए अनुमति देता है जो नियमित रूप /tmpसे "पुरानी" फाइलों का शुद्धिकरण करते हैं; इस तरह के तंत्र का कोई इरादा नहीं है /run। इसलिए जो कार्यक्रम किसी भी चीज के जीवनकाल की उम्मीद कर सकते हैं, उस पर ड्रैकियन की सीमा /tmp। जब भी प्रोग्राम /runलगातार सिस्टम पर फ़ाइलों को लंबे समय तक रहने की उम्मीद कर सकते हैं, तो उन्हें वहां खुद के बाद भी अधिक व्यवस्थित होने की उम्मीद है।


4
एक बात इस या किसी अन्य उत्तर में नहीं बताई गई है, लेकिन एफएचएस में उल्लेख किया गया है, और जिसे आप अपने उत्तर में सुधार करना पसंद कर सकते हैं: एफएचएस क्रोन नौकरियों के पारंपरिक सेटअप जैसी चीजों के लिए अनुमति देता है जो नियमित रूप /tmpसे "पुरानी" फाइलों को शुद्ध करते हैं; इस तरह के तंत्र का कोई इरादा नहीं है /run। इसलिए जो कार्यक्रम किसी भी चीज के जीवनकाल की उम्मीद कर सकते हैं, उस पर ड्रैकियन की सीमा /tmp। जब भी प्रोग्राम /runलगातार सिस्टम पर फ़ाइलों को लंबे समय तक रहने की उम्मीद कर सकते हैं, तो उन्हें वहां खुद के बाद भी अधिक व्यवस्थित होने की उम्मीद है।
JdeBP

1
सामान की प्रति-प्रक्रिया निर्देशिका होना अच्छा होगा जो कि प्रक्रिया के समाप्त होते ही गायब हो गया (या कुछ रोइंग कचरा डैमॉन द्वारा हटा दिया गया)।
ओमनीफेरियस

1
@Omnifarious अब आप RuntimeDirectory = :-) का उपयोग करके सिस्टम व्यवहार के लिए उस व्यवहार को प्राप्त कर सकते हैं ।
sourcejedi
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.