2016-01-13 9 views
12

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

मैं पुस्तकालयों और निष्पादन योग्य न्यूनतम सेट के साथ एक सुरक्षित उत्पादन मशीन स्थापित करने के लिए निक्स का उपयोग करना चाहता हूं। मैं नहीं चाहता कि कोई कंपाइलर या अन्य निर्माण उपकरण मौजूद हों क्योंकि ये सुरक्षा जोखिम हो सकते हैं।

जब मैं कुछ संकुल स्थापित करता हूं, ऐसा लगता है कि वे केवल रनटाइम निर्भरताओं के न्यूनतम सेट पर निर्भर करते हैं। उदाहरण के लिए यदि मैं apache-tomcat-8.0.23 इंस्टॉल करता हूं तो मुझे जावा रनटाइम (जेआरई) और पूर्व-निर्मित जेएआर फाइलें शामिल हैं जो टोमकैट शामिल हैं।

दूसरी तरफ, कुछ पैकेजों में निर्भरता के रूप में एक पूर्ण निर्माण टूलचेन शामिल है। एक और जावा आधारित उदाहरण लें तो जब मैं spark-1.4.0 स्थापित निक्स जावा डेवलपमेंट किट (JDK) जो एक संकलक शामिल नीचे खींचती है, और यह भी खींचती Maven उपकरण का निर्माण आदि

तो, मेरे सवालों का इस प्रकार हैं:

  1. क्या निक्स पैकेज बिल्ड और रनटाइम निर्भरताओं के बीच कोई भेद करते हैं?
  2. कुछ पैकेज बिल्ड टूल्स पर निर्भर क्यों दिखते हैं जबकि अन्य केवल रनटाइम की आवश्यकता होती है? क्या यह सब नीचे है कि पैकेज लेखक ने एप्लिकेशन को कैसे लपेट लिया?
  3. यदि किसी पैकेज में बिल्ड निर्भरताएं हैं जो मैं नहीं चाहता हूं, तो क्या कोई ऐसा ऑपरेटर है, जो ऑपरेटर के रूप में, उसी एप्लिकेशन के लिए अपना वैकल्पिक पैकेजिंग डिज़ाइन को छोड़कर इसके बारे में कर सकता है?

बहुत धन्यवाद।

उत्तर

18
  1. क्रम निर्भरता का निर्माण समय निर्भरता कि निक्स प्रत्येक निर्माण समय निर्भरता 'दुकान पथ के हैश भाग के लिए उत्पन्न उत्पादन को स्कैन करके स्वतः ही निर्धारित करता का एक सबसेट है। उदाहरण के लिए, यदि आप कंपाइलर /nix/store/abcdef...-foo-1.20 का उपयोग करके एक पैकेज बनाते हैं, तो निक्स हैश बिट abcdef... के लिए जेनरेट आउटपुट में सभी फ़ाइलों को स्कैन करेगा। यदि वह हैश पाया जाता है, तो आउटपुट को किसी भी तरह से कंपाइलर को संदर्भित करने के लिए माना जाता है, इसलिए यह रनटाइम निर्भरता के रूप में kepts है। यदि वह हैश नहीं होता है, तो, जेनरेट आउटपुट में कंपाइलर का कोई संदर्भ नहीं है और इसलिए इसे रनटाइम पर एक्सेस नहीं किया जा सकता है, इसलिए foo-1.20 को बिल्ड-टाइम-केवल निर्भरता के रूप में माना जाता है।

  2. कुछ पैकेज सूचनात्मक/डिबगिंग उद्देश्यों के लिए अपने निर्माण पर्यावरण के बड़े हिस्से रिकॉर्ड करते हैं। उदाहरण के लिए, पर्ल, इसे संकलित करने के लिए उपयोग किए जाने वाले टूल के बारे में हर छोटी जानकारी संग्रहीत करता है, इसलिए उन सभी स्टोर पथों को रनटाइम निर्भरताओं के रूप में माना जा रहा है, इस तथ्य के बावजूद कि पर्ल को वास्तव में रनटाइम पर उनकी आवश्यकता नहीं है, लेकिन निक्स को पता नहीं है: यह सिर्फ जानता है कि पर्ल स्टोर पथ संदर्भ उन टूल्स। अब, निक्सपक्स रखरखाव आमतौर पर इसे साफ़ करने का प्रयास करते हैं, यानी लॉगफाइल को छूकर, जिसमें इंस्टॉलेशन से उन सभी स्टोर पथ शामिल हैं, लेकिन निश्चित रूप से डेटाबेस में अभी भी बहुत से पैकेज हैं जिन्हें अनुकूलित नहीं किया गया है वह अभी तक खत्म हो गया है।

  3. मान लीजिए कि आप openssh के संस्करण को संकलित करना चाहते हैं जो PAM पर निर्भर नहीं है। फिर आप ओवरराइड के माध्यम से अभिव्यक्ति से निर्माण इनपुट को हटा सकते हैं, यानी आप pam तर्क को प्रतिस्थापित कर सकते हैं जो आमतौर पर opensshnull के साथ फ़ंक्शन का निर्माण करता है।ऐसा करने के लिए, ~/.nixpkgs/config.nix

    { 
        packageOverrides = super: let self = super.pkgs; in { 
        openssh-without-pam = super.openssh.override { 
         pam = null; 
        }; 
        }; 
    } 
    

    में निम्न फ़ाइल की दुकान और अब चलाकर कि पैकेज स्थापित:

    $ nix-env -f "<nixpkgs>" -iA openssh-without-pam 
    
+0

इस विस्तृत और व्यापक जवाब के लिए धन्यवाद। –

+0

आप "जेनरेट आउटपुट स्कैन करके स्वचालित रूप से" का उल्लेख करते हैं, वास्तव में यह कैसे करता है? क्या यह बाइनरी के अंदर 'exec' के माध्यम से गतिशील रूप से निष्पादित पथों के साथ काम करता है? या शायद एक जेनरेट की गई कॉन्फ़िगरेशन फ़ाइल किसी अन्य पैकेज की बाइनरी के पथ को संग्रहीत कर रही है? – CMCDragonkai

+0

@CMCDragonkai, हाँ ऐसा लगता है कि निक्स वास्तव में व्युत्पन्न हैश के लिए बाइनरी स्कैन करता है। दुर्भाग्यवश, मैं वास्तविक कोड नहीं ढूंढ पा रहा हूं, लेकिन यहां कुछ विवरण हैं https://lethalman.blogspot.ru/2014/08/nix-pill-9-automatic-runtime.html – cvb

संबंधित मुद्दे