FHS के विकल्प क्या हैं?


32

मैं एक लंबे समय से 15 साल के लिए लिनक्स उपयोगकर्ता हूं, लेकिन एक जुनून के साथ मुझे नफरत है एक चीज अनिवार्य निर्देशिका संरचना है। मुझे लगता है कि पसंद नहीं /usr/binबाइनरी या में libs के लिए डंपिंग जमीन है /usr/lib, /usr/lib32, /usr/libx32, /lib, /lib32आदि ... में रैंडम सामान /usr/shareआदि यह गूंगा और भ्रामक है। लेकिन कुछ इसे पसंद करते हैं और स्वाद भिन्न होते हैं।

मुझे एक निर्देशिका संरचना चाहिए जहां प्रत्येक पैकेज अलग-थलग हो। इसके बजाय कल्पना करें कि मीडिया प्लेयर ड्रैगन की अपनी संरचना थी:

/software/dragon
/software/dragon/bin/x86/dragon
/software/dragon/doc/README
/software/dragon/doc/copyright
/software/dragon/lib/x86/libdragon.so

या:

/software/zlib/include/zlib.h
/software/zlib/lib/1.2.8/x86/libz.so
/software/zlib/lib/1.2.8/x64/libz.so
/software/zlib/doc/examples/...
/software/zlib/man/...

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

OS X की तलाश नहीं। :) लेकिन OS X- प्रेरित पूरी तरह से ठीक है।

संपादित करें : मुझे नहीं पता कि कैसे PATH, LD_LIBRARY_PATHऔर अन्य पर्यावरण चर जो पथों के एक छोटे सेट पर निर्भर हैं, उन्हें काम करना चाहिए। मैं सोच रहा हूं कि अगर मेरे पास केडीई संपादक केट है, /software/kate/bin/x86/bin/kateतो मैं इसे शुरू करने के लिए बाइनरी के लिए पूरा रास्ता टाइप करने के साथ ठीक हूं। डायनेमिक लाइब्रेरी और dlopenकॉल के लिए यह कैसे काम करना चाहिए , मुझे नहीं पता, लेकिन यह इंजीनियरिंग की एक समस्या नहीं है।


3
यदि आपके सभी बायनेरिज़ सभी जगह छिपे हुए हैं तो आपका खोज पथ कैसा दिखेगा? जब आप उनके शुरू होने के बाद सॉफ़्टवेयर इंस्टॉल करते हैं तो आप पहले से ही चल रही प्रक्रियाओं / सत्रों में पथ को कैसे अपडेट करते हैं? किसी अस्पष्ट उपयोगकर्ता को किसी अस्पष्ट बिन-शाखा में किसी बाइनरी को संशोधित करने के प्रबंधन से रोकने के लिए आपके सुरक्षा उपाय क्या होंगे? आप निश्चित रूप से संभवतः बनाने / पढ़ने के आराम को ढीला कर देते हैं, केवल बहुत सारी मशीनों के लिए एक सामान्य नेट-माउंट ...
हेगन वॉन एटिजन

1
@HagenvonEitzen लेकिन (ओपी के नामकरण योजना और उदाहरणों का उपयोग करके) आप केवल FHS में रीड-ओनली /softwareबनाने के समान लाभों और कमियों के बजाय, केवल-केवल पठन कर सकते हैं /usr
बजे एक सीवी

डायनामिक लाइब्रेरी स्थापित नाम या RPATH का उपयोग कर सकते हैं।
17

1
आपके प्रश्न ने मुझे cr.yp.to/slashpackage.html की याद दिला दी । हालांकि, यह सुनिश्चित नहीं है कि यह रीलेवेंट है।
bli

जवाबों:


50

सबसे पहले, एक अप-फ्रंट संघर्ष-ऑफ-डिस्क्लेमर डिस्क्लेमर: मैं एक लंबे समय का गोबोलिनक्स डेवलपर हूं।

दूसरा, डोमेन विशेषज्ञता का एक अप-फ्रंट दावा: मैं एक लंबे समय तक GoboLinux डेवलपर हूं।

वर्तमान उपयोग में कुछ अलग संरचनाएं हैं। GoboLinux में एक है, और GNU Stow , Homebrew , आदि जैसे उपकरण , कुछ इसी तरह का उपयोग करते हैं (मुख्य रूप से उपयोगकर्ता कार्यक्रमों के लिए)। NixOS कार्यक्रमों और जीवन के दर्शन के लिए एक गैर-मानक पदानुक्रम का उपयोग करता है। यह एक सामान्य रूप से सामान्य LFS प्रयोग भी है।

मैं उन सभी का वर्णन करने जा रहा हूं, और फिर अनुभव से टिप्पणी करता हूं कि व्यवहार में कैसे काम करता है ("व्यवहार्यता")। संक्षिप्त उत्तर यह है कि हां, यह संभव है, लेकिन आपको वास्तव में यह चाहिए


GoboLinux

GoboLinux में आपके द्वारा वर्णित एक संरचना के समान है। सॉफ़्टवेयर स्थापित है /Programs: /Programs/ZSH/5.0.8इसमें सामान्य bin/ lib/ ... निर्देशिका में ZSH 5.0.8 से संबंधित सभी फाइलें हैं । सिस्टम उपकरण एक /System/Linksपदानुक्रम के तहत उन फ़ाइलों के लिए सहानुभूति बनाते हैं, जो /usr¹ पर मैप करते हैं । PATHचर केवल एक एकीकृत निष्पादन निर्देशिका शामिल है, और LD_LIBRARY_PATHअप्रयुक्त है। सॉफ़्टवेयर के कई संस्करण एक बार में सह-अस्तित्व में आ सकते हैं, लेकिन दिए गए नाम ( bin/zsh) द्वारा केवल एक फ़ाइल को एक बार में सक्रिय रूप से जोड़ा जाएगा। आप अपने पूरे रास्तों से दूसरों तक पहुँच सकते हैं।

संगतता सीलिंक्स का एक सेट भी मौजूद है, इसलिए /binऔर /usr/binएकीकृत निष्पादन योग्य निर्देशिका के लिए मैप, और इसी तरह। इससे रन टाइम में सॉफ्टवेयर के लिए जीवन आसान हो जाता है। एक कर्नेल पैच, GoboHide, फ़ाइल संगतता (लेकिन अभी भी ट्रैवर्सेबल) से छिपी हुई उन संगतता सीलिंक को अनुमति देता है।

एक अन्य उत्तर में, आपको कर्नेल कोड को संशोधित करने की आवश्यकता नहीं है: गोबाहाइड विशुद्ध रूप से कॉस्मेटिक है, और कर्नेल सामान्य रूप से उपयोगकर्ता-अंतरिक्ष पथों पर निर्भर नहीं करता है। GoboLinux में एक bespoke init प्रणाली है, लेकिन ऐसा करने के लिए भी आवश्यक नहीं है।

टैगलाइन हमेशा "फ़ाइल सिस्टम पैकेज मैनेजर है", लेकिन सिस्टम में यथोचित साधारण पैकेज-प्रबंधन उपकरण हैं। आप का उपयोग कर सब कुछ कर सकते हैं cp, rmऔर lnहालांकि,।

यदि आप GoboLinux का उपयोग करना चाहते हैं, तो आपका बहुत स्वागत है। मैं नोट करूंगा, हालांकि, यह एक छोटी सी विकास टीम है, और आपको यह पता लगने की संभावना है कि कुछ सॉफ़्टवेयर जो आप चाहते हैं वह पैक नहीं किया गया है यदि कोई पहले इसका उपयोग नहीं करना चाहता है। अच्छी खबर यह है कि सिस्टम के लिए एक कार्यक्रम बनाने के लिए आम तौर पर यह काफी आसान है (एक मानक "नुस्खा" लगभग तीन लाइनों लंबा है); बुरी खबर यह है कि कभी-कभी यह अप्रिय रूप से जटिल होता है, जिसे मैं और नीचे कवर करूंगा।

प्रकाशन

कुछ "प्रकाशन" हैं। मैंने linux.conf.au 2010 में सिस्टम पर एक पूरी प्रस्तुति दी जिसमें आम तौर पर सब कुछ शामिल है, जो वीडियो में उपलब्ध है: ogv mp4 (आपके स्थानीय लिनक्स ऑस्ट्रेलिया दर्पण पर भी); मैंने गद्य में अपने नोट्स भी लिखे । कुछ पुराने दस्तावेज़ भी हैं, जिनमें प्रसिद्ध " I am clueless " शामिल नहीं है , GoboLinux वेबसाइट पर , जो कुछ आपत्तियों और मुद्दों को संबोधित करता है। मुझे लगता है कि हम इन दिनों थोड़ा कम गूँज-हो रहे हैं, और मुझे शक है कि भविष्य में रिलीज़ /usrहोने वाली सिम्बिंक के लिए बेस लोकेशन के रूप में अपनाया जाएगा ।


NixOS

निक्सोस प्रत्येक इंस्टाल्ड प्रोग्राम को अपनी खुद की डायरेक्टरी के अंतर्गत रखता है /nix/store। उन निर्देशिकाओं को कुछ इस तरह नामित किया जाता है /nix/store/5rnfzla9kcx4mj5zdc7nlnv8na1najvg-firefox-3.5.4/- एक क्रिप्टोग्राफ़िक हैश उस कार्यक्रम के लिए निर्भरता और कॉन्फ़िगरेशन के पूरे सेट का प्रतिनिधित्व करता है। उस निर्देशिका के अंदर स्थानीय रूप से अधिक-या-कम सामान्य स्थानों के साथ सभी संबद्ध फाइलें हैं।

यह आपको एक ही बार में कई संस्करण रखने और उनमें से किसी का भी उपयोग करने की अनुमति देता है। निक्सोस के पास एक संपूर्ण दर्शन है जो इसे प्रतिलिपि प्रस्तुत करने योग्य कॉन्फ़िगरेशन से जुड़ा हुआ है: यह अनिवार्य रूप से एक कॉन्फ़िगरेशन प्रबंधन प्रणाली है जिसे शुरू से इसमें बेक किया गया है। यह उपयोगकर्ता को स्थापित कार्यक्रमों की सही दुनिया को पेश करने के लिए कुछ पर्यावरणीय हेरफेर पर निर्भर करता है।


LFS

लिनक्स से स्क्रैच के माध्यम से जाना और आप जो पदानुक्रम चाहते हैं, उसे पूरी तरह से सेट करना बिल्कुल सरल है : बस निर्देशिकाएं बनाएं और सही जगह पर स्थापित करने के लिए सब कुछ कॉन्फ़िगर करें। मैंने इसे GoboLinux प्रयोगों के निर्माण में कुछ बार किया है, और यह सादे LFS की तुलना में बहुत कठिन नहीं है। आपको उस स्थिति में अनुकूलता को सहानुभूति बनाने की आवश्यकता है; अन्यथा यह काफी कठिन है, लेकिन यूनियन माउंट का सावधानीपूर्वक उपयोग शायद इससे बच सकता है यदि आप वास्तव में चाहते थे।

मुझे लगता है कि एक बिंदु पर ठीक उसी के बारे में एक एलएफएस संकेत था , लेकिन मैं अब इसे ढूंढ नहीं पा रहा हूं।


व्यवहार्यता पर

एफएचएस के बारे में बात यह है कि यह एक मानक है, यह बहुत सामान्य है, और यह उस समय व्यापक रूप से मौजूदा उपयोग को दर्शाता है जब यह लिखा गया था। अधिकांश उपयोगकर्ता कभी भी उस सिस्टम पर नहीं होंगे जो सार में उस लेआउट का पालन नहीं करता है। उसी का नतीजा है कि बहुत सारे सॉफ्टवेयर में इस पर अव्यक्त निर्भरता है कि किसी को एहसास नहीं होता है, अक्सर पूरी तरह से अनजाने में।

उन सभी लिपियों के साथ #!/bin/bash? यदि आपके पास बैश नहीं है तो अच्छा नहीं है। यही कारण है कि GoboLinux उन सभी संगतता symlinks है; यह सिर्फ व्यावहारिक है। बहुत सारे सॉफ्टवेयर या तो निर्माण के समय या गैर-मानक लेआउट के तहत रन टाइम पर कार्य करने में विफल होते हैं, और फिर इसे सही करने के लिए पैचिंग की आवश्यकता होती है, अक्सर काफी घुसपैठ के साथ।

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

रनटाइम फिर से एक और मामला है। कई कार्यक्रमों के बारे में धारणा है कि उनकी अपनी फाइलें, या किसी और की फाइलें, या तो उनके सापेक्ष पाई जाती हैं या बिल्कुल। जब आप एक सुसंगत दृश्य को प्रस्तुत करने के लिए सीमलिंक का उपयोग करना शुरू करते हैं, तो बहुत सारे कार्यक्रमों में उन्हें (या कभी-कभी, यकीनन सही व्यवहार होता है जो आपके लिए अयोग्य होता है)। उदाहरण के लिए, एक उपकरण foobarइसके bazआगे, या में निष्पादन योग्य को खोजने की उम्मीद कर सकता है ../sbin। यह निर्भर करता है कि वह अपना सिम्लिंक पढ़ता है या नहीं, वे दो अलग-अलग जगह हो सकते हैं, और उनमें से कोई भी सही नहीं हो सकता है।

एक संयुक्त समस्या /usr/shareनिर्देशिका है। यह साझा फ़ाइलों के लिए है, निश्चित रूप से, लेकिन जब आप हर कार्यक्रम को अपने उपसर्ग में रखते हैं तो वे अब वास्तव में साझा नहीं होते हैं। यह मानक आइकन और पसंद को खोजने में असमर्थ कार्यक्रमों की ओर जाता है। GoboLinux ने इसे बहुत ही बदसूरत तरीके से निपटाया: निर्माण के समय, लिंक $prefix/shareकरने के लिए एक सहानुभूति थी $prefix/Sharedऔर निर्माण के बाद लिंक को वैश्विक shareनिर्देशिका में इंगित किया गया था । यह अब share(और अन्य निर्देशिकाओं) से निपटने के लिए संकलन-समय सैंडबॉक्सिंग और फ़ाइल आंदोलन का उपयोग करता है , लेकिन लिंक पढ़ने से रनटाइम त्रुटियां अभी भी एक मुद्दा हो सकती हैं।

कई कार्यक्रमों के सूट एक और समस्या है। GoboLinux ने GNOME को पूरी तरह से काम करते हुए कभी नहीं देखा है, और मेरा मानना ​​है कि NixOS के पास भी नहीं है, क्योंकि लेआउट अन्योन्याश्रय इतने बेक किए गए हैं कि यह उन सभी को ठीक करने के लिए असाध्य है।

तो, हाँ, यह संभव है , लेकिन:

  • सिर्फ काम करने के काम में काफी काम शामिल है।
  • कुछ सॉफ्टवेयर बस कभी काम नहीं कर सकते हैं।
  • लोग आपको मजाकिया लगेंगे।

उन सभी को आप के लिए एक समस्या हो सकती है या नहीं हो सकती है।


14 संस्करण 14.01 का उपयोग करता है /System/Index, जो सीधे मैप करता है /usr। मुझे संदेह है कि भविष्य का संस्करण लिंक / इंडेक्स पदानुक्रम को छोड़ सकता है और /usrपूरे बोर्ड में उपयोग कर सकता है।

² यह /bin/shडिफ़ॉल्ट रूप से मौजूद होना चाहिए।


1
बहुत बढ़िया जवाब! क्या सॉफ्टवेयर लेखक ज्यादातर पैच के प्रति ग्रहणशील होते हैं ताकि वे इसे गोबोलिनक्स या शत्रुतापूर्ण कार्य करने के लिए तैयार कर सकें?
ब्योर्न लिंडक्विस्ट

अधिकांश समय उल्टा पैच ठीक चलता है, लेकिन कभी-कभी एफएचएस पर भरोसा करने के बारे में अनुचर थोड़ा जुझारू हो सकते हैं। मुझे यह भी याद है कि केडीई अनुरक्षकों ने जोर देकर कहा था कि एक असम्पीडित टेम्प्लेट फ़ाइल के लिए एक सिम्लिंक को कॉपी करने के बजाय इसे डिज़ाइन द्वारा कॉपी करने के लिए डेरेफ़रिंग करने के बजाय। ढेर सारे पैच एक उचित फिक्स के बजाय एक हार्ड-कोडेड पथ से दूसरे में होते हैं, इसलिए वे वैसे भी अपस्ट्रीम भेजने के लायक नहीं होते हैं।
माइकल होमर

तो अगर आपने पाया और फंड (समय या धन में) आप चाहते हैं कि सभी सॉफ्टवेयर का निर्माण / forking / पैचिंग, (जैसे हेम, जैसे Apple / Microsoft करता / करता है), तो आपका स्वर्ण? यही मुझे अच्छा लगता है। मैं भी इस तरह के रूढ़िवादी-तोड़ने वाले नवाचारों में दिलचस्पी रखता हूं जो इस तरह से शत्रुतापूर्ण-से-डेस्कटॉप-कट्टरपंथी नहीं हैं।
थोरसुमोनर

2
@ थोरसुमोनर: अधिकांश वितरण अपने सभी सॉफ्टवेयरों को जोर से दबाते हैं; वह "फंडिंग" पहले से ही वास्तविकता है। वे पैच कार्यात्मक का मिश्रण हैं और हां, वितरण की विशेषताओं से मेल खाने के लिए पथ परिवर्तन। बेशक, एक अंतिम उपयोगकर्ता के रूप में, आप वास्तव में इसे नोटिस नहीं करते हैं, लेकिन यह वहां है - एक वितरण के पीछे बहुत श्रम है जिसे दी गई लेना आसान है। बड़े और आपको चीजों को पैच करने की ज़रूरत नहीं है - केवल 13% गोबॉइनक्स व्यंजनों में किसी भी तरह का पैच शामिल है, उदाहरण के लिए, जो वास्तव में, डेबियन की तुलना में कम है, हालांकि यह पैचिंग का एक कष्टप्रद प्रकार है जब यह करना है आवश्यक है।
माइकल होमर

6

दोनों GoboLinux (जो F.sb उल्लेख किया) और जीएनयू guix वितरण कि एक द्विआधारी की "वर्तमान" संस्करण के लिए बात करने के लिए सिमलिंक के साथ एक प्रति पैकेज निर्देशिका संरचना का उपयोग कर रहे हैं।

यदि आप एक स्थिर प्रणाली चाहते हैं तो GoboLinux बेहतर दांव लगता है। GNU guix स्पष्ट रूप से कहता है कि यह अभी तक तैयार नहीं है। GoboLinux लगभग वर्षों से है। मैंने कभी भी खुद की कोशिश नहीं की।


5

GoboLinux की जाँच करें ।

यदि आप चाहते हैं कि निर्देशिका संरचना बदली जाए तो आपको कुछ कर्नेल कोड, बूट प्रक्रिया, आरसी फ़ाइलों के आधार पर निर्देशिका रनलेवल्स और पैकेज प्रबंधक को बदलना चाहिए, फिर निर्देशिका संरचना।


5

लिनक्स FHS सन और अन्य UNIX कंपनियों ने 1980 के दशक के अंत में क्या निर्णय लिया था, पर आधारित है।

उस समय एक महत्वपूर्ण परिवर्तन को छोड़ना /usr/local/और परिचय देना था /opt// { bin! lib! man! ...}

यदि आप इस कारण की तलाश कर रहे हैं कि क्यों / usr / bin आज डंपिंग ग्राउंड के रूप में उपयोग किया जाता है, तो मेरा मानना ​​है कि GNOME सबसे जिम्मेदार परियोजनाओं में से एक है।

32 बिट बनाम 64 बिट लाइब्रेरी के साथ जो हुआ वह एफएचएस के कारण होता है।

सोलारिस में मंच विशिष्ट उपनिर्देशिका शुरू की /lib /usr/binऔर /usr/lib। क्या आपकी इच्छा है कि सन ने 1988 से आधार अवधारणा को कैसे बढ़ाया।


मैं यह नहीं देखता कि "परित्याग / usr / स्थानीय" कहने से आपका क्या मतलब है। FHS में विशेष रूप से / usr / लोकल के साथ-साथ / ऑप्ट का भी उल्लेख है
बजे एक सीवी

2
सन, एचपी, आईबीएम, एटीएंडटी, एसजीआई द्वारा विकसित मूल एफएचएस ने निश्चित रूप से गैर-व्यवस्थित और समस्याग्रस्त / यूएसआर / स्थानीय को हटा दिया। मुझे नहीं पता कि लिनक्स के लोगों ने उस गलती को फिर से प्रस्तुत क्यों किया।
विद्वान

2
"क्या आपकी इच्छा है कि सन ने 1988 से आधार अवधारणा को कैसे बढ़ाया।" मैं इस वाक्य को नहीं समझता।
फहीम मीठा

4

अगर हर पैकेज फाइल सिस्टम का अपना हिस्सा था, तो आप बहुत बड़े और बोझल वातावरण चर आवश्यकता होगी PATH, LD_LIBRARY_PATHऔर इसी तरह की।

आप निश्चित रूप से अपने आप को इस तरह से पैकेज स्थापित कर सकते हैं, और फिर GNU मॉड्यूल जैसे कुछ का उपयोग करके यह प्रबंधित कर सकते हैं कि वे आपके वातावरण में हैं या नहीं, और यही हम वैज्ञानिक सॉफ्टवेयर के लिए करते हैं जहां मैं काम करता हूं, लेकिन हम इसके लिए नहीं करते हैं सिस्टम सॉफ्टवेयर।

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