dpkg एक FAT फाइलसिस्टम पर फाइलों को प्रतिस्थापित करता है


22

जब आप किसी पैकेज को अपग्रेड करते हैं या dpkg(और आखिरकार इसका उपयोग करने वाले कुछ भी, जैसे कि apt-get etc) से इसे पुनः स्थापित करने से पहले फाइल की हार्ड लिंक बनाकर मौजूदा फाइलों का बैकअप ले लेते हैं। इस तरह से अगर अनपैक विफल हो जाता है तो यह आसानी से मौजूदा फाइलों को वापस रख सकता है। यह बहुत अच्छा है, क्योंकि यह ऑपरेटिंग सिस्टम को बैड थिंग्स ™ से बचाता है।

सिवाय ... यह तभी काम करता है जब आपका फाइलसिस्टम हार्ड लिंक का समर्थन करता है । सभी फाइलसिस्टम ऐसा नहीं करते - जैसे कि FAT फाइलसिस्टम।

मैं एक विशिष्ट एम्बेडेड ARM प्लेटफॉर्म के लिए डेबियन के वितरण पर काम कर रहा हूं, और बूट वातावरण के लिए आवश्यक है कि कुछ फाइलें (कर्नेल शामिल) एक FAT फाइल सिस्टम पर हैं, इसलिए बूट कोड का पता लगाने और उन्हें लोड करने में सक्षम है।

जब आप कर्नेल पैकेज (या किसी अन्य पैकेज में उस FAT विभाजन में फ़ाइलें अपग्रेड करने के लिए जाते हैं) के साथ स्थापित विफल रहता है:

dpkg: error processing archive linux-image3.18.11+_3.18.11.2.armadillian_armhf.deb (--install):
 unable to make backup link of `./boot/vmlinuz-3.18.11+' before installing new version: Operation not permitted

और पूरा अपग्रेड फेल हो जाता है।

मैंने वेब को स्कैन कर लिया है, और एकमात्र संदर्भ जो मुझे मिल सकता है, विशिष्ट उन्नयन करते समय विशिष्ट लोगों के साथ विशिष्ट लोग हैं, जिसका उत्तर आमतौर पर "/boot/vmlinuz-3.18.11+ हटाएं और फिर से प्रयास करें", और हां, उस विशिष्ट समस्या को ठीक करता है।

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

मैंने इस तरह की चीजों की कोशिश की है --force-unsafe-ioऔर यहां तक ​​कि --force-allझंडे भी हैं dpkg, लेकिन कुछ भी प्रभाव नहीं है।


विशलिस्ट बग के लिए समय की तरह लगता है। :-)
फहीम मीठा

जवाबों:


13

आपके द्वारा देखा जा रहा व्यवहार स्रोत 10 लाइन (संस्करण 1.18.1 के लिए) archives.cमें लागू किया गया है :dpkg

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf))
  ohshite(_("unable to make backup link of '%.255s' before installing new version"),
          ti->name);

यह मुझे लगता है कि आप 1003 और बाद में इस्तेमाल की जाने वाली रेखाओं का नाम बदलकर लिंक विफलता को संभाल सकते हैं; कुछ ऐसा है (यह अप्राप्त है):

debug(dbg_eachfiledetail, "tarobject nondirectory, 'link' backup");
if (link(fnamevb.buf,fnametmpvb.buf)) {
  debug(dbg_eachfiledetail,"link failed, nonatomic");
  nifd->namenode->flags |= fnnf_no_atomic_overwrite;
  if (rename(fnamevb.buf,fnametmpvb.buf))
    ohshite(_("unable to move aside '%.255s' to install new version"),
            ti->name);
}

मैं dpkgहालांकि एक विशेषज्ञ नहीं हूँ ... (और dpkgइस व्यवहार को प्रदान करने के लिए पहले से कोई विकल्प उपलब्ध नहीं है।)


निश्चित रूप से dpkg के अपने स्वयं के संस्करण की पैकेजिंग एक संभावना है, हालांकि मैं अपने संस्करण में अपस्ट्रीम परिवर्तनों को ट्रैक करने का ओवरहेड नहीं करना पसंद करूंगा।
मजनू

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

1
वास्तव में, यह काम करेगा; आप dpkgहुक ( dpkg --pre-invoke=) की भी जांच कर सकते हैं ।
स्टीफन किट

dpkgजब आप यह जानते हैं तो आप कैसे एक विशेषज्ञ नहीं हैं !
निखिल

1
raspberrypi कर्नेल भी dpkg-divert का उपयोग करके एक समान चाल के माध्यम से अद्यतन किया जाता है। Raspberrypi.stackexchange.com/questions/51410/… से लिया गया ,
akarapatis
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.