उपयोगकर्ता स्थान को कभी न तोड़ने के लिए लिनक्स कर्नेल नीति क्यों है?


38

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

लिनस कभी-कभी एलकेएमएल पर अपनी लपटों के साथ विवाद को आकर्षित करता है। ये लपटें अक्सर अपने स्वयं के प्रवेश द्वारा, उपयोगकर्ता स्थान को तोड़ने के साथ होती हैं। जो मुझे मेरे सवाल पर लाता है।

क्या मेरे पास कुछ ऐतिहासिक दृष्टिकोण है कि उपयोगकर्ता स्थान को तोड़ना इतनी बुरी बात क्यों है? जैसा कि मैं इसे समझता हूं, उपयोगकर्ता के स्थान को तोड़ने से आवेदन स्तर पर सुधार की आवश्यकता होगी, लेकिन क्या यह ऐसा बुरा काम है, अगर यह कर्नेल कोड में सुधार करता है?

जैसा कि मैं इसे समझता हूं, लिनुस की नीति यह बताती है कि कोड की गुणवत्ता सहित अन्य सभी चीजों को उपयोगकर्ता के स्थान को नहीं तोड़ना है। यह इतना महत्वपूर्ण क्यों है, और ऐसी नीति के पक्ष और विपक्ष क्या हैं?

(इस तरह की नीति के लिए स्पष्ट रूप से कुछ सहमति है, लगातार लागू की जाती है, क्योंकि लिनस कभी-कभी इस विषय पर एलकेएमएल पर अपने शीर्ष लेफ्टिनेंट के साथ "असहमति" रखता है। जहां तक ​​मैं बता सकता हूं, वह हमेशा मामले में अपना रास्ता बना लेता है।)


1
आपने परिचय में लिनस का नाम याद किया।
इस्माईल मिगुएल

यह मुझे यकीन नहीं था, लेकिन मैं आगे बढ़ना भूल गया और अब अपना वोट दिया।
इस्माइल मिगुएल

जवाबों:


38

इसका कारण ऐतिहासिक नहीं बल्कि व्यावहारिक है। कई कई प्रोग्राम हैं जो लिनक्स कर्नेल के शीर्ष पर चलते हैं; यदि एक कर्नेल इंटरफ़ेस उन प्रोग्रामों को तोड़ता है, तो हर किसी को उन कार्यक्रमों को अपग्रेड करने की आवश्यकता होगी।

अब यह सच है कि अधिकांश कार्यक्रम वास्तव में सीधे कर्नेल इंटरफेस ( सिस्टम कॉल ) पर निर्भर नहीं होते हैं , लेकिन केवल सी मानक लाइब्रेरी ( सिस्टम कॉल के आसपास सी रैपर ) के इंटरफेस पर । ओह, लेकिन कौन सा मानक पुस्तकालय? Glibc? uclibc? Dietlibc? बायोनिक? Musl? आदि।

लेकिन ऐसे कई कार्यक्रम भी हैं जो ओएस-विशिष्ट सेवाओं को लागू करते हैं और कर्नेल इंटरफेस पर निर्भर करते हैं जो मानक पुस्तकालय द्वारा उजागर नहीं होते हैं। (लिनक्स पर, इनमें से कई के माध्यम से /procऔर की पेशकश की जाती है /sys।)

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

यहां तक ​​कि जब स्रोत उपलब्ध है, तो यह सब इकट्ठा करना एक दर्द हो सकता है। खासकर जब आप अपने कर्नेल को अपने हार्डवेयर के साथ बग को ठीक करने के लिए अपग्रेड कर रहे हों। लोग अक्सर अपने कर्नेल को अपने सिस्टम के बाकी हिस्सों से स्वतंत्र रूप से अपग्रेड करते हैं क्योंकि उन्हें हार्डवेयर समर्थन की आवश्यकता होती है। लिनुस टोरवाल्ड्स के शब्दों में :

उपयोगकर्ता प्रोग्राम तोड़ना केवल स्वीकार्य नहीं है। (…) हम जानते हैं कि लोग वर्षों और वर्षों के लिए पुराने बायनेरिज़ का उपयोग करते हैं, और एक नई रिलीज़ करने का मतलब यह नहीं है कि आप बस इसे बाहर फेंक सकते हैं। आप हम पर भरोसा कर सकते हैं।

वह यह भी समझाता है कि इसे एक मजबूत नियम बनाने का एक कारण निर्भरता नरक से बचना है जहाँ आपको काम करने के लिए कुछ नए कर्नेल प्राप्त करने के लिए न केवल दूसरे प्रोग्राम को अपग्रेड करना होगा, बल्कि एक और प्रोग्राम को अपग्रेड करना होगा, और दूसरा, और दूसरा , क्योंकि सब कुछ एक निश्चित संस्करण पर निर्भर करता है।

यह कुछ हद तक एक अच्छी तरह से परिभाषित एक तरह से निर्भरता के लिए ठीक। यह दुखद है, लेकिन कभी-कभी अपरिहार्य है। (…) क्या ठीक नहीं है दो तरह से निर्भरता है। यदि उपयोगकर्ता-स्पेस एचएएल कोड एक नए कर्नेल पर निर्भर करता है, तो यह ठीक है, हालांकि मुझे संदेह है कि उपयोगकर्ताओं को उम्मीद होगी कि यह "सप्ताह का कर्नेल" नहीं होगा, लेकिन अधिक "पिछले कुछ महीनों की कर्नेल" चीज।

लेकिन अगर आपके पास TWO-WAY निर्भरता है, तो आप खराब हैं। इसका मतलब है कि आपको लॉक-स्टेप में अपग्रेड करना होगा, और यह केवल स्वीकार्य नहीं है। यह उपयोगकर्ता के लिए भयानक है, लेकिन इससे भी महत्वपूर्ण बात यह है कि यह डेवलपर्स के लिए भयानक है, क्योंकि इसका मतलब है कि आप "बग नहीं हुआ" नहीं कह सकते हैं और इसे बिसनेस या समान के साथ संकीर्ण करने की कोशिश जैसी चीजें करते हैं।

यूज़र्सस्पेस में, उन पारस्परिक निर्भरताओं को आमतौर पर विभिन्न लाइब्रेरी संस्करणों को रखकर हल किया जाता है; लेकिन आपको केवल एक कर्नेल चलाना है, इसलिए इसे उन सभी चीजों का समर्थन करना होगा जो लोग इसके साथ करना चाहते हैं।

आधिकारिक तौर पर ,

[सिस्टम कॉल को स्थिर घोषित किया गया] के लिए बैकवर्ड संगतता कम से कम 2 साल की गारंटी होगी।

हालांकि व्यवहार में,

अधिकांश इंटरफ़ेस (जैसे syscalls) से अपेक्षा की जाती है कि वे कभी न बदलें और हमेशा उपलब्ध रहें।

क्या अधिक बार बदलता है इंटरफेस है जो केवल हार्डवेयर से संबंधित कार्यक्रमों द्वारा उपयोग किए जाने के लिए होता है, में /sys। ( /procदूसरी ओर, जो कि /sysगैर-हार्डवेयर-संबंधित सेवाओं के लिए आरक्षित किए जाने के बाद से, असंगत तरीकों से बहुत अधिक कभी नहीं टूटता है।)

संक्षेप में,

उपयोगकर्ता स्थान को तोड़ने से आवेदन स्तर पर सुधार की आवश्यकता होगी

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


1
जवाब के लिए धन्यवाद। तो, जिन इंटरफेस को स्थिर घोषित किया गया है, वे POSIX सिस्टम कॉल के सुपरसेट हैं? इतिहास के बारे में मेरा सवाल है कि यह अभ्यास कैसे विकसित हुआ। संभवतः लिनक्स कर्नेल के मूल संस्करणों ने कम से कम शुरुआत में, उपयोगकर्ता अंतरिक्ष के टूटने के बारे में चिंता नहीं की।
फहीम मीठा

3
@FaheemMitha हाँ, उन्होंने 1991 के बाद से किया । मुझे नहीं लगता कि लिनुस का दृष्टिकोण विकसित हुआ है, यह हमेशा "सामान्य अनुप्रयोगों के लिए इंटरफेस नहीं बदलता है, सॉफ्टवेयर के लिए इंटरफेस जो बहुत दृढ़ता से कर्नेल परिवर्तनों से बहुत मजबूती से बंधा होता है"।
गिल्स एसओ- बुराई को रोकें '

24

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

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

हर तरह से फायदे हैं। एकीकरण पश्चगामी संगतता की कीमत पर "नई" सुविधाएँ प्रदान करता है। जबकि अमूर्तता "नई" कॉल पर स्थिरता प्रदान करती है। हालांकि यह ध्यान रखना महत्वपूर्ण है कि यह प्राथमिकता का मामला है, संभावना नहीं।

वास्तव में अच्छे कारण के बिना एक सांप्रदायिक दृष्टिकोण से, एक जटिल प्रणाली में अमूर्तता हमेशा बेहतर होती है। उदाहरण के लिए, कल्पना करें कि fs.open()कर्नेल संस्करण के आधार पर अलग तरीके से काम किया जाए। फिर एक साधारण फ़ाइल सिस्टम इंटरैक्शन लाइब्रेरी को कई सौ अलग-अलग "खुली फ़ाइल" विधियों (या शायद ब्लॉक) की आवश्यकता होगी। जब एक नया कर्नेल संस्करण सामने आया, तो आप "अपग्रेड" करने में सक्षम नहीं होंगे, आपको अपने द्वारा उपयोग किए जाने वाले सॉफ़्टवेयर के हर एक टुकड़े का परीक्षण करना होगा। कर्नेल 6.2.2 (नकली) आपके पाठ संपादक को तोड़ सकता है।

कुछ वास्तविक दुनिया उदाहरणों के लिए OSX उपयोगकर्ता स्थान को तोड़ने की परवाह नहीं करता है। वे "अमूर्त" से अधिक बार "एकीकरण" का लक्ष्य रखते हैं। और हर बड़े ओएस अपडेट में, चीजें टूट जाती हैं। यह नहीं कहना है कि एक तरीका बेहतर है तो दूसरा। यह एक विकल्प और डिजाइन निर्णय है।

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

उदाहरण के लिए, मैंने एक पैच सबमिट किया BuildNotify.py। इसलिए नहीं कि मैं परोपकारी हूं, बल्कि इसलिए कि मैं उपकरण का उपयोग करता हूं, और मुझे एक सुविधा चाहिए थी। यह आसान था, इसलिए यहाँ, एक पैच है। यदि यह जटिल होता, या बोझिल होता, तो मैं उपयोग नहीं करता BuildNotify.pyऔर मुझे कुछ और मिल जाता। अगर हर बार एक कर्नेल अपडेट सामने आया तो मेरा टेक्स्ट एडिटर टूट गया, मैं बस एक अलग ओएस का उपयोग करूंगा। समुदाय में मेरा योगदान (हालांकि छोटा है) जारी रहेगा या मौजूद नहीं होगा, और इसी तरह।

इसलिए, डिजाइन का निर्णय अमूर्त प्रणाली कॉल के लिए किया गया था, ताकि जब मैं ऐसा करूं तो fs.open()यह सिर्फ काम करे। इसका मतलब है कि लोकप्रियता हासिल करने के fs.openबाद लंबे समय तक बनाए रखना fs.open2()

ऐतिहासिक रूप से, यह सामान्य रूप से POSIX सिस्टम का लक्ष्य है। "यहां कॉल और अपेक्षित रिटर्न मान हैं, आप बीच का पता लगाते हैं।" पोर्टेबिलिटी कारणों के लिए फिर से। लिनुस उस पद्धति का उपयोग करने का विकल्प क्यों चुनता है, यह उसके मस्तिष्क के लिए आंतरिक है, और आपको उसे यह जानने के लिए कहना होगा कि वास्तव में क्यों। यदि यह मुझे था, लेकिन मैं एक जटिल प्रणाली पर एकीकरण पर अमूर्तता का चयन करूंगा।


1
'Syscall' एपीआई, यूजरस्पेस के लिए एपीआई, अच्छी तरह से परिभाषित (विशेष रूप से POSIX सबसेट) और स्थिर है, क्योंकि इसके किसी भी हिस्से को हटाने से सॉफ्टवेयर टूट जाएगा जो लोगों ने स्थापित किया हो सकता है। क्या यह नहीं है एक स्थिर ड्राइवर एपीआई है।
pjc50

4
@FaheemMitha, यह दूसरा तरीका है। जब भी वे चाहें, कर्नेल डेवलपर्स ड्राइवर एपीआई को तोड़ने के लिए स्वतंत्र होते हैं, इसलिए जब तक वे अगले रिलीज से पहले सभी इन-कर्नेल ड्राइवरों को ठीक कर लेते हैं। यह यूज़र्सस्पेस एपीआई को तोड़ रहा है, या नॉन-एपीआई चीजें भी कर रहा है जो कि यूजर्स को तोड़ सकता है, जो लिनुस से महाकाव्य प्रतिक्रियाएं पैदा करता है।
मार्क

4
उदाहरण के लिए, यदि कोई किसी परिस्थिति में ioctl () से एक अलग त्रुटि कोड लौटाकर इसे बदलने का फैसला करता है: lkml.org/lkml/2012/12/23/75 (इसमें जिम्मेदार डेवलपर पर शपथ ग्रहण और व्यक्तिगत हमले शामिल हैं)। उस पैच को अस्वीकार कर दिया गया था क्योंकि यह पल्सएडियो को तोड़ देगा, और इसलिए गनोम सिस्टम पर सभी ऑडियो।
pjc50

1
@FaheemMitha, मूल रूप से, def add (a, b); वापसी एक + बी; अंत --- डिफ ऐड (ए, बी); c = a + b; वापसी c; अंत --- डिफ ऐड (ए, बी); c = a + b +10; वापसी c - 10; अंत - ऐड के सभी "समान" कार्यान्वयन हैं। जब उसे लोग परेशान करते हैं, तो लोग ऐड (ए, बी) करते हैं; वापसी (ए + बी) * -1; end संक्षेप में, कर्नेल के काम के लिए "आंतरिक" चीजों को बदलना ठीक है। एक परिभाषित और "सार्वजनिक" एपीआई कॉल में जो बदला गया है वह नहीं है। दो प्रकार के एपीआई कॉल "निजी" और "सार्वजनिक" हैं। उसे लगता है कि सार्वजनिक एपीआई कॉल को अच्छे कारण के बिना कभी नहीं बदलना चाहिए।
coteyr

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

8

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

पेशेवरों का कहना है कि उपयोगकर्ता देवता अपने कोड को अचानक नए कर्नेल पर मनमाने और आकर्षक कारणों से नहीं तोड़ पाएंगे।

विपक्ष का मानना ​​है कि कर्नेल को पुराने कोड और पुराने सिसकल्स आदि को हमेशा के लिए अपने पास रखना है (या, कम से कम, लंबे समय तक उनके उपयोग के आधार पर)।


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

नहीं, क्षमा करें, मुझे याद नहीं है कि यह कैसे हुआ। आप लिनुस या एलकेएमएल को ईमेल कर सकते हैं और उससे पूछ सकते हैं।
कैस

2
मर्क्यूरियल OS नहीं है। एक OS का संपूर्ण बिंदु इसके शीर्ष पर अन्य सॉफ़्टवेयर को चलाने में सक्षम करना है, और अन्य सॉफ़्टवेयर को तोड़ना बहुत अलोकप्रिय है। तुलना करके विंडोज ने बहुत लंबे समय तक बैकवर्ड संगतता बनाए रखी है; 16-बिट विंडोज कोड हाल ही में बाधित किया गया था।
pjc50

@ pjc50 यह सच है कि मर्क्युरियल एक OS नहीं है, लेकिन परवाह किए बिना, वहाँ है अन्य सॉफ्टवेयर, भले ही स्क्रिप्ट, कि उस पर निर्भर करते हैं। और परिवर्तनों द्वारा संभावित रूप से तोड़ा जा सकता है।
फहीम मीठा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.