जवाबों:
जैसा कि @ कुसलानंद द्वारा उल्लेख किया गया है, आमतौर पर पुरानी फ़ाइल को हटाकर, उसी नाम से एक नया निर्माण करके अपग्रेड किया जाता है। यह वास्तव में एक नई फ़ाइल के साथ एक नया इनोड बनाएगा, जो पुराने के उपयोग के लिए सिस्टम को तब तक मुफ्त छोड़ देगा जब तक यह खुला है।
एक सरलीकृत उदाहरण के रूप में, सामान की तरह
rm /bin/cat
cp /new/version/of/cat /bin/cat
तार्किक रूप से नई फ़ाइल बनाएगा, और भले ही cat
चल रहा हो। वही पुस्तकालयों के लिए चला जाता है। (ऊपर एक उदाहरण है, वास्तविक दुनिया में फ़ाइल को अपग्रेड करने का एक मजबूत तरीका नहीं है।)
कोई भी एक ही नाम के साथ एक नया बनाने के बजाय बाइनरी इन-प्लेस को बदलने की कोशिश कर सकता है। इस मामले में, कम से कम लिनक्स वास्तव में एक निष्पादन योग्य में परिवर्तन करने से रोकता है जो उपयोग में है:
window 1 # ./cat
window 2 # echo foobar > cat
-bash: cat: Text file busy
हालाँकि, यह गतिशील रूप से भरी हुई लाइब्रेरियों के साथ काम नहीं करता ...
मैंने libc.so.6
परीक्षण के लिए एक प्रतिलिपि बनाई , और इसे उपयोग में रहने के दौरान जीरो से भर दिया:
window 1 /tmp/lib# LD_LIBRARY_PATH=/tmp/lib ldd ./cat
linux-vdso.so.1 (0x00007ffcfaf30000)
libc.so.6 => /tmp/lib/libc.so.6 (0x00007f1145e67000)
/lib64/ld-linux-x86-64.so.2 (0x00007f1146212000)
window 1 /tmp/lib# LD_LIBRARY_PATH=/tmp/lib ./cat
foo
foo
Segmentation fault
(इस बीच foo
, सेगफॉल्ट से पहले , एक अन्य विंडो में )
window 2 /tmp/lib# dd if=/dev/zero of=libc.so.6 bs=1024 count=2000
वास्तव में ऐसा कुछ भी नहीं है जो कार्यक्रम खुद इसके खिलाफ कर सकता है, क्योंकि मैंने इसके कोड को प्रभावी रूप से ऑनलाइन संपादित किया है।
(यह सिस्टम पर निर्भर होने की संभावना है, मैंने डेबियन जेसी 8.5, लिनक्स 3.16.7-ckt25-2 +88u3 पर परीक्षण किया है। विशेष रूप से IIRC विंडोज सिस्टम इन-यूज़ फ़ाइलों को संशोधित होने से रोकने के बारे में और भी आक्रामक हैं।)
तो मुझे लगता है कि उत्तर यह है कि उन्नयन आमतौर पर किसी भी तरह की समस्याओं से बचा जाता है, और यह फाइल सिस्टम इंटर्न द्वारा मदद की जाती है। लेकिन (लिनक्स पर) वास्तव में गतिशील पुस्तकालयों को दूषित करने के खिलाफ कोई सुरक्षा उपाय नहीं प्रतीत होते हैं।
install
तरह के सामान के लिए आमतौर पर उपयोगिता का उपयोग किया जाता है। आपको rm
गंतव्य फ़ाइल को स्पष्ट रूप से दिखाने की आवश्यकता नहीं है । इसके अलावा यह मौजूदा फ़ाइल की अनुमतियों को संरक्षित करता है, बैकअप बना सकता है, एक नया मोड सेट कर सकता है, आदि उदाहरण उपयोग:install /new/version/of/cat /bin/cat
rm
+ cp
एक उदाहरण के रूप था। यह भी हो सकता है कि नई फ़ाइल को नाम बदलने के लिए परमाणु रूप से रखा जाए, एक छोटी खिड़की से बचें जिसमें न तो संस्करण उपलब्ध हो। (हालांकि, GNU install
भी ऐसा नहीं करता है, hmpf।)
rm
) है, तो वह अभी तक डिलीट नहीं हुई है। यह डिस्क पर मौजूद होगा और इसे अभी भी खुली हुई सभी प्रक्रियाओं द्वारा पढ़ा जा सकता है। यह केवल तभी हटाया जाएगा जब इसकी हार्ड-लिंक गिनती शून्य तक पहुँच जाए और फ़ाइल खोलने के साथ पूर्व की संख्या शून्य तक पहुँच जाए।
install
उपयोगिता विशेष रूप से असुरक्षित है! यह एटॉमिकली रीप्लेस करने के बजाए टारगेट फाइल को ओवरराइट कर देता है। mv
(एक ही निर्देशिका में स्रोत और भाग्य के साथ, स्रोत आमतौर पर एक अस्थायी फ़ाइल) फ़ाइलों को स्थापित करने का एकमात्र सुरक्षित तरीका है।
strace
बताती है, install
GNU कोरुटिल्स में लक्ष्य फ़ाइल को अनलिंक किया जाता है और फिर उसकी जगह एक नया कॉपी किया जाता है। जिसका अर्थ है कि एक छोटी विंडो है जिसके दौरान फ़ाइल आंशिक है। यह नाम के साथ फ़ाइल को एटोमिकली सेट नहीं करता है।
यदि वे अभी भी खोले गए हैं, तो फ़ाइलें "ठीक से नष्ट नहीं" होंगी। जब वे बंद हो जाते हैं, तो उनके द्वारा उपयोग किए जाने वाले डिस्क स्थान को फिर से "मुक्त" माना जाएगा। यह वर्तमान में चल रहे अनुप्रयोगों और उनके साझा पुस्तकालयों के लिए भी जाता है।
केवल एक चीज जो मुझे असफल दिखाई दे रही है वह यह होगी कि यदि कोई प्रोग्राम dlopen()
साझा लाइब्रेरी को मांग पर लोड करने के लिए उपयोग किया जाता है, या यदि प्रोग्राम को डिमांड पर अन्य फाइलों जैसे डिक्शनरी, थीम फाइल, या अन्य फाइलें जो अचानक गायब हो गईं, तक पहुंचना पड़ता है।
वर्णन करने के लिए: vim
दूसरे शेल सत्र की स्थापना को हटाने के vim
दौरान एक शेल सत्र में चलना "भ्रष्ट" नहीं होगा या वर्तमान में चल रहे vim
सत्र को समाप्त करेगा । लेकिन कुछ चीजें विफल होने लगेंगी, जैसे उदाहरण के लिए वर्तनी जांच, जिसकी vim
स्थापना में फ़ाइलों को खोलने की आवश्यकता होती है।
ln -sf
, जब पुस्तकालयों से अधिक की अदला-बदली क्योंकि-f
अनुमति आप "अधिलेखित" एक नया एक के साथ प्रतीकात्मक कड़ी की मौजूदा गंतव्य, बिना यह कभी "टूट" जा रहा है (करने के लिए विपरीत यदि आप एक थाrm
जिसके बाद एln -s
)। इसलिए कमांड से पहले, Library.so को पुराने संस्करण में इंगित किया गया, उदा। library.so.4 ... आदेश के बाद, यह बस की ओर इशारा किया library.so.5 (या जो भी) के बजाय - कभी बिना नहीं एक वैध पुस्तकालय की ओर इशारा करते।