दोनों / चलाने और / 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
सॉकेट का उपयोग करते हुए, डेमॉन के एक संस्करण को चलाने का निर्णय लेने वाले अप्रभावी उपयोगकर्ताओं का होगा ।
ध्यान दें, नीचे कविता का चेकलिस्ट दावा किया गया है कि /tmp
"छोटी फ़ाइलों" के लिए उपयोगी होगा, जबकि /run
इसका उपयोग केवल "संचार प्रिमिटिव" के लिए किया जाना चाहिए। मुझे नहीं लगता कि यह अंतर सही भी है। के लिए पोस्टर-लड़का /run
है udev
, और मुझे पूरा यकीन है कि /run/udev
आंतरिक डेटाबेस शामिल हैं। आपके पास एक /run
निर्देशिका होने के बाद, मुझे नहीं लगता कि कोई भी दावा किया गया भेद का पालन करना चाहता है और अव्यवस्था के लिए एक और निर्देशिका बनाना चाहता है /tmp
। इसलिए व्यवहार में हम /run
आजकल इसका उपयोग करते हैं।
संचार उद्देश्यों के लिए विश्व-लेखन योग्य साझा नामस्थानों का उपयोग [जैसे / tmp] हमेशा समस्याग्रस्त रहा है, क्योंकि संचार स्थापित करने के लिए आपको स्थिर नामों की आवश्यकता होती है, लेकिन स्थिर नाम DoS हमलों के लिए दरवाजे खोलते हैं। प्रारंभिक बूट के दौरान कुछ सेवाओं के लिए संरक्षित प्रति-ऐप निर्देशिकाओं की स्थापना करके इसे आंशिक रूप से ठीक किया जा सकता है (जैसे हम X11 के लिए करते हैं), लेकिन यह केवल समस्या को आंशिक रूप से ठीक करता है, क्योंकि यह केवल तभी सही ढंग से काम करता है यदि प्रत्येक पैकेज की स्थापना रिबूट द्वारा की जाती है।
...
एक और फेडोरा सुविधा (फेडोरा 17 के लिए) ने कई प्रणालियों सेवाओं के लिए / tmp के शब्दार्थ को बदलकर उन्हें विभिन्न सेवाओं के / tmp नामस्थानों को अलग करके उन्हें अधिक सुरक्षित बनाया।
...
क्योंकि / tmp अब आवश्यक रूप से साझा नाम स्थान नहीं है, यह आम तौर पर संचार आदिम के लिए एक स्थान के रूप में अनुपयुक्त है।
...
[/ रन] एक tmpfs होने की गारंटी है और इसलिए यह स्वतः ही बूट में फ्लश हो जाता है। उससे आगे कोई भी स्वचालित सफाई नहीं की जाती है।
...
यहां एक मोटा गाइड है कि हम आपको कैसे सुझाव देते हैं (एक लिनक्स एप्लिकेशन डेवलपर) उपयोग करने के लिए सही निर्देशिका चुनें:
- आपको अपना सॉकेट (या अन्य संचार आदिम) लगाने के लिए जगह की आवश्यकता होती है और आपका कोड विशेषाधिकार प्राप्त होता है: नीचे / रन के लिए एक उपनिर्देशिका का उपयोग करें। (या अतिरिक्त संगतता के लिए / var / run के नीचे)
- आपको अपना सॉकेट (या अन्य संचार आदिम) लगाने के लिए जगह की आवश्यकता होती है और आपका कोड अप्रकाशित चलता है: $ XDG_RUNTIME_DIR के नीचे एक उपनिर्देशिका का उपयोग करें।
- आपको अपने बड़े डाउनलोड और डाउनलोड प्रगति पर रखने और अप्रभावित चलाने के लिए एक जगह की आवश्यकता है: $ XDG_DOWNLOAD_DIR का उपयोग करें।
- आपको कैशे फ़ाइलों को रखने के लिए एक जगह की आवश्यकता होती है जो लगातार होनी चाहिए और बिना लाइसेंस के चलनी चाहिए: $ XDG_CACHEH -HOME का उपयोग करें।
- उपरोक्त में से कुछ भी लागू नहीं होता है और आपको एक छोटी फ़ाइल रखने की आवश्यकता होती है जिसे किसी भी दृढ़ता की आवश्यकता नहीं होती है: $ TMPDIR का उपयोग करें / tmp पर गिरावट के साथ। और mkstemp (), और mkdtemp () और कुछ भी नहीं का उपयोग करें।
- अन्यथा $ TMPDIR का उपयोग / var / tmp पर गिरावट के साथ करें। इसके अलावा mkstemp () / mkdtemp () का उपयोग करें।
ध्यान दें कि ऊपर दिए गए ये नियम केवल हमारे द्वारा सुझाए गए हैं। ये नियम इस विषय के बारे में हम जानते हैं और वर्तमान और भविष्य के वितरण के साथ समस्याओं से बचते हैं, जहाँ तक हम उन्हें देख सकते हैं। कृपया इन नियमों का पालन करने के लिए अपनी परियोजनाओं को अपडेट करने पर विचार करें, और यदि आप नया कोड लिखते हैं तो उन्हें ध्यान में रखें।
एक बात जो हम तनाव देना चाहते हैं, वह यह है कि / tmp और / var / tmp अधिक बार नहीं वास्तव में आपके usasease के लिए सही विकल्प नहीं हैं। इन निर्देशिकाओं के मान्य उपयोग हैं, लेकिन अक्सर एक और निर्देशिका वास्तव में बेहतर जगह हो सकती है। तो, सावधान रहें, अन्य विकल्पों पर विचार करें, लेकिन यदि आप / tmp या / var / tmp के लिए जाते हैं तो कम से कम mkstemp () / mkdtemp () का उपयोग करना सुनिश्चित करें।
हम /tmp
एक्स विंडो सिस्टम द्वारा उपयोग की जाने वाली विरासत सॉकेट के साथ दूर हो जाते हैं, जैसा कि ऊपर वर्णित है। मैंने शरारत की tmpfiles.d/x11.conf
। ऐसा लगता है कि यह सह-संचालन पर निर्भर है :)। मुझे लगता है कि कोड का ऑडिट किया गया है, जैसे कि सेवा से वंचित करना सबसे खराब है जो हो सकता है।