`/ Usr` निर्देशिका के लिए तर्क क्या है?


107

यहाँ/usr वर्णित "यूनिक्स प्रणाली संसाधन", या निर्देशिका के लिए तर्क क्या है , जो रूट निर्देशिका के तहत निर्देशिका के कई नामों की नकल करता है ?/

मेरा उद्देश्य: मैं umpteenth समय के लिए Oracle JDK स्थापित कर रहा हूं और इस समय का फैसला किया है ताकि इसे नीचे रखा जा सके /home/userऔर मैं यह देखने के लिए थोड़ा सा पढ़ रहा हूं कि क्या यह किसी एकल उपयोगकर्ता मशीन पर एक बुरा विचार है।


1
आपकी होम डाइरेक्टरी तृतीय-पक्ष सॉफ़्टवेयर को नॉन-रूट के रूप में स्थापित करने के लिए एक आदर्श स्थान है।
लेकेनस्टाइन

9
... दुखद अहसास क्योंकि आपको लगा /usrकि इतने सालों से एक छिपी "उपयोगकर्ता" निर्देशिका है ...
गोविंद राय

6
मैंने गंभीरता से सोचा कि यह "उपयोगकर्ता" इस पूरे समय था। उपयोगकर्ता बायनेरिज़ की तरह
टान्नर बैबॉक

जवाबों:


168

लघु संस्करण और आपके उत्तर के लंबे संस्करण हैं ...

लघु संस्करण:

जैसा कि आपके लिंक ने पहले ही कहा था, सिस्टम-वाइड , रीड-ओनली फ़ाइलों के /usrलिए एक जगह है । तो आपका सारा स्थापित सॉफ्टवेयर वहां चला जाता है। यह सिवाय और के किसी भी नाम की नकल नहीं करता है , लेकिन, मूल रूप से, एक अलग उद्देश्य के साथ: केवल बायनेरिज़ और लाइब्रेरीज़ के लिए आवश्यक है , जबकि अन्य सभी निष्पादन योग्य और पुस्तकालयों के लिए है। (अब एक अच्छा लड़का बनो और इसके बारे में मत पूछो , यह सब के बाद का लघु संस्करण है)//bin/lib/bin, /lib/usr/bin, /usr/lib/sbin

आजकल, "बूटिंग के लिए आवश्यक" और नहीं के बीच का अंतर कम हो गया है, क्योंकि उबंटू सहित अधिकांश आधुनिक डिस्ट्रोस, ठीक से कई फ़ाइलों के बिना बूट नहीं कर सकते हैं /usr। और इसीलिए विलय करने की दिशा में एक मजबूत आंदोलन है , /usr/binऔर /binशायद निकट भविष्य में (Ubuntu 12.10 शायद?) के /binलिए एक सहानुभूति होगी /usr/bin

लेकिन शायद आप भ्रमित कर रहे हैं /usrऔर /usr/local? क्योंकि हां, बहुत सारे डुप्लिकेट डायरेक्टरी नाम हैं (और होने चाहिए) । उस पर और बाद में ...

दीर्घ संस्करण:

70 के दशक में, यूनिक्स में (हां, यूनिक्स, लिनक्स से पहले का रास्ता), फ्लॉपी में बहुत कम जगह थी (कोई एचडी, याद है?), और एक निश्चित समय पर सिस्टम बायनेरिज़ संख्या और आकार में बहुत अधिक बढ़ गए एक बिंदु पर वे नहीं करेंगे? एक एकल डिस्क फिट करें, और डेवलपर्स को उन्हें कई मीडिया में विभाजित करना था और इस प्रकार उनके लिए नए माउंट पॉइंट बनाए। /binफाइलसिस्टम भरा हुआ था, इसलिए उन्होंने नए बायनेरिज़ को ... पर स्थापित किया /usr/bin। और /usrउस समय था, उनकी ... उपयोगकर्ता निर्देशिका!

लगभग (शर्मनाक और अक्सर एक मजाक / विद्या के रूप में बताया गया) विभाजन के बाद, उन्होंने यह तय करने के लिए "कृत्रिम" औचित्य (और मानदंड) बनाने शुरू किए कि क्या होगा /binऔर क्या होगा /usr/bin। अनौपचारिक नियम था: "आवश्यक" सामान जाना है /bin, "बाकी" जाता है /usr/bin। उसी के साथ /lib/usrउपयोगकर्ता-डायर के साथ मिश्रित प्रणाली-संबंधी डायरियों के साथ भीड़ बनने से पहले यह लंबे समय तक नहीं था । इस प्रकार /home, सभी उपयोगकर्ता-संबंधित dirs रखने और /usrकेवल सिस्टम "सामान" के लिए साफ रखने के लिए पैदा हुआ था ।

एफएचएस के अस्तित्व में आने से पहले यह बहुत लंबा था। जब यह बनाया गया था, तो यह वर्तमान परंपरा को गले लगाता था (और औपचारिक रूप से) नाम रखता था /usr, हालांकि उस समय इसका पहले से ही "उपयोगकर्ता" के साथ कोई लेना-देना नहीं था। तो हाँ, फैंसी नाम " U NIX s ource r epository" या " U NIX s ystem r esources" सभी बने हुए नाम हैं, और वैसे भी इसका नाम बदलने में बहुत देर हो चुकी है। (लेकिन /binइसमें विलीन होने में देर नहीं हुई )

"ठीक है, किस बारे में /usr/sbin?" , तुम पूछो। अरे, मैं उम्मीद कर रहा था कि आप भूल गए थे। ठीक है ... /usr/sbinकमांड के लिए है जो केवल rootउपयोगकर्ता द्वारा निष्पादित (या केवल तभी सार्थक हो सकता है) , जैसे mountऔर fdisk

"लेकिन क्या यह लगभग वैसा ही नहीं है /bin?" । हां, यकीन है, लेकिन ...

"रुको, फिर एक /sbinभी क्यों है? कोई मतलब नहीं है!" । खैर, कि वजह से ... गलत है .. हम्म ..

देखो, तुम्हारे पीछे एक 3 सिर वाला बंदर!

ठीक है, उम्मीद है, आप काफी विचलित हो गए। आगे बढ़ते रहना...

(यदि आपको लगता है कि मैं धोखा दे रहा हूं, तो आप सही हैं। लेकिन "आधिकारिक" उत्तर "आवश्यक कमांड" है जिसे केवल रूट द्वारा निष्पादित किया जा सकता है और आपके माउंट होने से पहले भी उपलब्ध होना चाहिए /)। सच्चाई यह है: लाइन वास्तव में धुंधली है, और बहुत सारी विरासत के नाम हैं जो सिर्फ "अटक" गए हैं और अब इससे छुटकारा पाना काफी कठिन है।

डॉक्स से मर्ज के लिए केस/usr पर अधिक systemd:

एक / बिन, / sbin और / lib से अलग / usr के लिए ऐतिहासिक औचित्य आज लागू नहीं होता है। वे तेज़ हार्ड डिस्क पर चयनित टूल को विभाजित करने के लिए विभाजित हो गए (जो छोटा था, क्योंकि यह अधिक महंगा था) और धीमी / usr विभाजन को माउंट करने के लिए आवश्यक सभी टूल शामिल करने के लिए। आज, पहले से ही बूट के दौरान एक अलग / usr विभाजन initramfs द्वारा माउंट किया जाना चाहिए, इस प्रकार विभाजन-बंद मट का औचित्य बनता है। इसके अलावा, यथास्थिति में / बिन और / एसबीएन में बहुत सारे उपकरण पहले से ही बिना पूर्व-घुड़सवार या यूएसआर के चलने की क्षमता खो देते हैं। ऑपरेटिंग सिस्टम को कई पदानुक्रमों पर फैलाने का कोई वैध कारण नहीं है, इसने अपना उद्देश्य खो दिया।

और /usrरॉब लैंडली द्वारा विभाजन और इसके औचित्य के बारे में एक अद्भुत रीडिंग :

बिन समझे, sbin, usr / बिन, usr / sbin अलग

आजकल

वर्तमान में, निर्देशिकाओं के बारे में, इस तरह से सोचने का आपका सबसे अच्छा तरीका है:

  • /usr - सभी सिस्टम-वाइड, रीड-ओनली फाइलें ओएस द्वारा स्थापित (या द्वारा प्रदान की गई)

  • /usr/local- सिस्टम-वाइड, स्थानीय व्यवस्थापक द्वारा स्थापित केवल-पढ़ने के लिए फ़ाइलें (आमतौर पर, आप)। और यही कारण है कि ज्यादातर निर्देशिका नामों को /usrयहां डुप्लिकेट किया गया है।

  • /opt- सिस्टम-वाइड, रीड-ओनली और सेल्फ-निहित सॉफ़्टवेयर के लिए अत्याचार का मतलब है । यही कारण है कि सॉफ्टवेयर है कि पर अपनी फ़ाइलें विभाजित नहीं है, है bin, lib, share, includeअच्छी तरह से व्यवहार की तरह सॉफ्टवेयर चाहिए।

  • ~/.local- प्रति उपयोगकर्ता प्रतिपक्ष /usr/local, वह है: प्रत्येक उपयोगकर्ता द्वारा (और के लिए) स्थापित सॉफ्टवेयर

  • ~/.local/opt - प्रति उपयोगकर्ता प्रतिरूप /opt

तो सॉफ्टवेयर कहाँ स्थापित करें?

उपरोक्त सूची पहले से ही ओरेकल JDK प्रश्न का आधा उत्तर है, कम से कम यह कई सुराग देता है। चेकलिस्ट "मुझे सॉफ़्टवेयर X कहां स्थापित करना चाहिए?" गुज़रना:

  • क्या यह पूरी तरह से स्व-निहित, एकल निर्देशिका सॉफ़्टवेयर है, जैसे कि ग्रहण आईडीई और अन्य डाउनलोड किए गए जावा ऐप, और आप चाहते हैं कि यह सभी उपयोगकर्ताओं के लिए उपलब्ध हो? फिर अंदर स्थापित करें/opt

  • ऊपर के समान, लेकिन आप अन्य उपयोगकर्ताओं के बारे में परवाह नहीं करते हैं और मैं अकेले आपके उपयोगकर्ता के लिए इंस्टॉल करना चाहता हूं? फिर अंदर स्थापित करें~/.local/opt

  • इसकी फ़ाइलों को कई डायरियों की तरह विभाजित किया गया है, जैसे binऔर share, जैसे पारंपरिक सॉफ्टवेयर को संकलित और स्थापित किया गया है ./configure && make && sudo make install, और सभी उपयोगकर्ताओं के लिए उपलब्ध होना चाहिए? फिर अंदर स्थापित करें/usr/local

  • उपरोक्त के समान, लेकिन केवल आपके उपयोगकर्ता के लिए? फिर अंदर स्थापित करें~/.local

  • ओएस द्वारा स्थापित सॉफ्टवेयर, या पैकेज प्रबंधकों (जैसे सॉफ्टवेयर सेंटर) के माध्यम से, और, सबसे महत्वपूर्ण बात यह है कि अद्यतन प्रबंधक को एक नए संस्करण में अपग्रेड करते समय किसी भी स्थानीय संशोधन को अधिलेखित किया जा सकता है ? यह जाता है/usr

टिप्पणियाँ:

  • यह बताता है कि संकलित सॉफ़्टवेयर के लिए डिफ़ॉल्ट इंस्टॉल प्रीफ़िक्स क्यों है /usr/local, और आपको इसे ./configure --prefix=$HOME/.localकेवल अपने उपयोगकर्ता के लिए सॉफ़्टवेयर इंस्टॉल करते समय क्यों बदलना चाहिए

  • आपने देखा होगा कि उपरोक्त सभी निर्देशिकाएं केवल-पढ़ने के अलावा (निश्चित रूप से, जब आप सॉफ़्टवेयर स्थापित / हटाते हैं)। लिखने योग्य फाइलें (जैसे कॉन्फिग फाइल) आमतौर पर /etc(सिस्टम-वाइड सॉफ़्टवेयर के लिए) और ~/.config(प्रति-उपयोगकर्ता सेटिंग्स के लिए) जाती हैं। हालांकि कई विरासत सॉफ्टवेयर (और, दुर्भाग्य से, कुछ आधुनिक भी) ~/.<software-name>बिल और डायरियों और फाइलों के साथ अपने घर के फ़ोल्डर को अव्यवस्थित करते हैं।

  • ~/.localऔर ~/.configएफएचएस विनिर्देश का हिस्सा नहीं हैं। FHS उपयोगकर्ता के होम फ़ोल्डर के साथ सौदा नहीं करता है। वे एक्सडीजी का एक प्रयास है, एक अन्य मानक संगठन जो डेस्कटॉप वातावरण (जैसे गनोम, केडीई, और यूनिटी) की ओर जाता है, उपयोगकर्ता के घर की संरचना के बारे में कुछ सम्मेलनों को स्थापित करने का प्रयास करता है। सभी सॉफ़्टवेयर इसका पालन नहीं करते हैं (उदाहरण के लिए, ~/.local/binउपयोगकर्ता के डिफ़ॉल्ट में नहीं है $PATH, जबकि तर्क द्वारा इसे करना चाहिए) , और कोई भी उपयोगकर्ता इसका पालन करने के लिए मजबूर नहीं होता है, लेकिन यदि वे करते हैं तो दोनों कई अंतर-लाभकारी लाभ प्राप्त करते हैं।

मुझे उम्मीद है कि इससे चीजों को थोड़ा स्पष्ट करने में मदद मिलेगी। कुछ भी पूछने के लिए स्वतंत्र महसूस करें ताकि मैं उत्तर को बेहतर बना सकूं!

(और मुझे यह भी उम्मीद है कि शुद्धतावादी मुझे इस तरह की एक अनौपचारिक भाषा और स्पष्टीकरण के लिए नहीं मारेंगे। यह जानबूझकर था, और इसमें निश्चित रूप से कई अशुद्धियाँ हैं, लेकिन मेरा मानना ​​है कि यह एक अच्छा तरीका है कि एक नवागंतुक को संक्षिप्त अवलोकन समझ है। निर्देशिका तर्कसंगत)


1
आपने इसे बहुत संक्षिप्त रूप से अभिव्यक्त किया और हाँ, यह सच है- पूरा उत्तर उपरोक्त की तुलना में बहुत लंबी कहानी है!
पापाशो

क्यों नहीं? एक ही तर्क लागू होता है: एक हमलावर घर के नीचे एक निष्पादन योग्य बना सकता है या इसका एक उपनिर्देशिका, जिसे सिस्टम कमांड के नाम पर रखा गया है।
इग्निस

3
@ignis: यदि किसी हमलावर के पास उपयोगकर्ता के घर के नीचे फ़ाइलों को बनाने और संशोधित करने की पहुंच है, तो वह उपयोगकर्ता पहले से ही पूरी तरह से समझौता कर चुका है, और $PATHअप्रासंगिक है। हमलावर भी बदल सकता है कि के माध्यम से ~/.profile, तो आपकी बात मूक है। ~/.local/binके रूप में सुरक्षित है (या असुरक्षित, यदि आप चाहते हैं) के रूप में ~/bin, जो सबसे distros में आम बात है। यह विचार कि किसी उपयोगकर्ता के पास व्यक्तिगत स्क्रिप्ट को रखने और निष्पादित करने के लिए कोई डर नहीं होना चाहिए $PATH, बेतुका है।
MestreLion

इस प्रकार, ~/binके रूप में के रूप में सुरक्षित है ~/.profile, और $PATHमेरे द्वारा चलाए गए मैलवेयर (जो मेरे अपने घर में लिखने की अनुमति है) से मेरी रक्षा नहीं करता है। मुझे यह फाइल नहीं पता थी, मुझे क्षमा करें। स्पष्टीकरण के लिए धन्यवाद, मेरी पिछली टिप्पणी के लिए क्षमा करें।
इग्निस

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