dpkg একটি FAT ফাইল সিস্টেমে ফাইল প্রতিস্থাপন


22

আপনি যখন কোনও প্যাকেজ আপগ্রেড বা পুনরায় ইনস্টল করেন dpkg(এবং শেষ পর্যন্ত এটি যেটি ব্যবহার করে যেমন অ্যাপটি-গেট ইত্যাদি) এটি প্রতিস্থাপনের আগে ফাইলটিতে একটি হার্ড লিঙ্ক তৈরি করে বিদ্যমান ফাইলগুলিকে ব্যাক আপ করে। যদি আনপ্যাক ব্যর্থ হয় তবে এটি সহজেই বিদ্যমান ফাইলগুলি পিছনে রাখতে পারে। এটি দুর্দান্ত, যেহেতু এটি অপারেটিং সিস্টেমটিকে খারাপ জিনিসগুলি from ঘটনার থেকে রক্ষা করে।

ব্যতীত ... এটি তখনই কাজ করে যদি আপনার ফাইল সিস্টেমটি হার্ড লিঙ্কগুলিকে সমর্থন করে । সমস্ত ফাইল সিস্টেমগুলি যেমন - 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

এবং পুরো আপগ্রেড ব্যর্থ।

আমি ওয়েবে স্ক্রোল করেছি এবং কেবলমাত্র উল্লেখগুলি কেবলমাত্র নির্দিষ্ট আপগ্রেড করার সময় নির্দিষ্ট সমস্যাযুক্ত নির্দিষ্ট ব্যক্তিদের মধ্যে পাওয়া যায়, যার উত্তর সাধারণত "মুছুন / বুট / ভিএমলিনিউজ 3.18.11+ এবং আবার চেষ্টা করুন" এবং হ্যাঁ, এটি নির্দিষ্ট সমস্যা সমাধান করে।

তবে এটি আমার পক্ষে উত্তর নয়। আমি একটি ওএস ডিস্ট্রিবিউটর, কোনও ওএস ব্যবহারকারী নই, সুতরাং এটিকে ঠিক করার জন্য আমার এমন একটি উপায়ের দরকার যা শেষ ব্যবহারকারীকে কোনও আপগ্রেড করার আগে ম্যানুয়ালি তাদের কার্নেল ফাইলগুলি মুছতে জড়িত না। / বুটে থাকা ফাইলগুলির জন্য "কপি করুন, হার্ড লিঙ্ক নয়" (বা আমার সমস্ত যত্নের জন্য সমস্ত ফাইল, যদিও এটি আপগ্রেড অপারেশনটিকে কিছুটা ধীরে ধীরে কমিয়ে দেবে), বা আরও ভাল যদি "হার্ড লিঙ্ক ব্যর্থ হয়, অভিযোগ করবেন না, কেবল পরিবর্তে এটি অনুলিপি করুন "।

আমি --force-unsafe-ioএবং এমনকি --force-allপতাকাগুলি এর মতো জিনিসগুলি চেষ্টা করেছি dpkg, তবে কোনও কিছুরই প্রভাব নেই।


কোনও ইচ্ছা তালিকা বাগের জন্য সময়ের মতো শোনাচ্ছে। :-)
ফাহিম মিঠা

উত্তর:


13

আপনি যে আচরণটি দেখছেন তা উত্স, 1030 লাইনে প্রয়োগ করা archives.cহয়েছে (সংস্করণ 1.18.1 এর জন্য):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এই আচরণটি সরবরাহের জন্য ইতিমধ্যে কোনও বিকল্প নেই available )


অবশ্যই dpkg এর নিজস্ব সংস্করণটি প্যাকেজিং করা একটি সম্ভাবনা, যদিও আমি আমার সংস্করণে প্রবাহের পরিবর্তনগুলি ট্র্যাক করার ওভারহেড না পছন্দ করি।
মাজেঙ্কো

ঠিক আছে, আমি নিশ্চিত করতে পারি যে এটি কাজ করে ঠিক তাই এটি অবশ্যই একটি বিকল্প। আমার কাছে অন্য একটি সম্ভাবনা দেখা দিতে পারে যা প্যাকেজের preinstস্ক্রিপ্টে আপত্তিজনক ফাইলগুলি ম্যানুয়ালি সরানো হয় , তবে কার্নেলটি স্ট্যান্ডার্ড কার্নেল প্যাকেজিং স্ক্রিপ্টগুলির দ্বারা নির্মিত হওয়ায় আমি কীভাবে এটি পরিবর্তন করব তা নিশ্চিত নই। এছাড়াও কোনও স্বয়ংক্রিয় রোলব্যাক সুবিধা থাকবে না।
মাজনকো

1
আসলে, এটি কাজ করবে; আপনি dpkgহুকগুলিও তদন্ত করতে পারেন ( dpkg --pre-invoke=)।
স্টিফেন কিট

+1 আপনি কীভাবে dpkgবিশেষজ্ঞ নন যখন আপনি এটি জানেন!
নিখিল

1
ডিএসপিজি-ডাইভার্ট ব্যবহার করে রাস্পবেরিপি কার্নেলটি একই ধরণের কৌশল দ্বারা আপডেট করা হয়। থেকে নেওয়া raspberrypi.stackexchange.com/questions/51410/... ,
akarapatis
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.