যদি কিছু ভুল হয়ে যায় তবে আমি কি অ্যাপটি-আপগ্রেড রোলব্যাক করতে পারি?


53

কোনও কিছুর শুরু করার আগে aptitude upgradeবা কোনও apt-get upgradeসেট আপ করার আগে কি এমন কোনও উপায় আছে যাতে আপনি আপনার সিস্টেমকে "অ্যাপ্ট" অবস্থাতে রোলব্যাক করতে পারেন এটি যদি সত্যিকারের আপগ্রেডের আগে ছিল, যদি কিছু ভুল হয়ে যায়?

এটি উদাহরণস্বরূপ, প্রক্রিয়া চলাকালীন আপগ্রেড হওয়া প্যাকেজগুলির পুরানো সংস্করণটি পুনরায় ইনস্টল করুন।

(সম্পাদনা) কয়েকটি ইঙ্গিত : আমি জানি যে etckeeperউদাহরণস্বরূপ কিছু হুক ব্যবহার করা হয় aptযাতে এটি যখনই aptকোনও প্যাকেজ ইনস্টল বা আনইনস্টল করে তা অবহিত হয় । আমি মনে করি এমন কোনও স্ক্রিপ্ট থাকতে পারে যা নতুন ইনস্টল করা প্যাকেজটির তালিকা এবং তাদের পূর্ববর্তী সংস্করণ নম্বরটি aptক্যাশে থেকে পুনরায় ইনস্টল করতে সক্ষম হতে পারে ( /var/cache/apt/archives)। checkinstallফাইল পরিবর্তনগুলির উপর নজর রাখতে পারে এমনও রয়েছে ...

কীভাবে এটি সঠিকভাবে অর্জন করবেন তার কোনও বিশদ?


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

উত্তর:


46

আমাকে এখনই এর উত্তর বের করতে হয়েছিল, কারণ apt-get upgradeডিবিয়ান সার্ভারে সর্বশেষতম কার্নেলটি ব্যস্তবক্সের বাইরে বুট করা অসম্ভব করে দিয়েছিল, zfs রুট পার্টিশনটি মাউন্ট করতে ব্যর্থ হয়েছিল। কমপক্ষে কোনও পুরানো কার্নেলটি এখনও বুট করতে পারে তবে এটি অন্যান্য সফ্টওয়্যারটির সাথে বেমানান। এইভাবে একটি রোলব্যাকের প্রয়োজন।

সংক্ষিপ্ত উত্তর - আপনি নিম্নলিখিত কমান্ডটি ব্যবহার করতে পারেন:

$ apt-get -s install $(apt-history rollback | tr '\n' ' ')

এটি যদি আপনি যা চান তা করে -sএবং এটি আবার চালান run এটি সঠিকভাবে কাজ করতে আমি যে পদক্ষেপ নিয়েছি তা এখানে:

  1. আমি /var/log/dpkg.logআজকের আপগ্রেড ছেড়ে সাময়িকভাবে আমার ছাঁটাই করেছি

  2. আমি অতি ক্ষুদ্র স্ক্রিপ্ট ইনস্টল apt-historyথেকে এখানে মধ্যে ~/.bashrcএবং দৌড়ে

    $ apt-history rollback > rollback.txt
    ...
    libzfs2:amd64=0.6.4-4~wheezy 
    zfsutils:amd64=0.6.4-4~wheezy 
    zfs-initramfs:amd64=0.6.4-4~wheezy
    ...
    
  3. এটিকে খাওয়ানোর মাধ্যমে রোল-ব্যাক করতে সংস্করণযুক্ত প্যাকেজগুলির একটি দুর্দান্ত বিন্যাসিত তালিকা সরবরাহ করে apt-get install। একটি পাঠ্য সম্পাদকের প্রয়োজন অনুসারে এই তালিকাটি ছাঁটাই করুন এবং তারপরে চালান ( -sশুকনো রান চালানোর জন্য প্রথমে):

    $ apt-get -s install $(cat rollback.txt | tr '\n' ' ')
    $ apt-get install $(cat rollback.txt | tr '\n' ' ')
    

অপ্টটি ডাউনগ্রেডগুলি সম্পর্কে সতর্ক করবে যা প্রত্যাশিত। পরের আপগ্রেডের মাধ্যমে এই রোলব্যাকটি ওভাররাইট হওয়া রোধ করতে, মূল সমস্যাটি সমাধান না হওয়া অবধি প্যাকেজগুলি পিন করা দরকার। উদাহরণস্বরূপ:apt-mark hold zfsutils libzfs2 ...


function apt-history(){
    case "$1" in
      install)
            cat /var/log/dpkg.log | grep 'install '
            ;;
      upgrade|remove)
            cat /var/log/dpkg.log | grep $1
            ;;
      rollback)
            cat /var/log/dpkg.log | grep upgrade | \
                grep "$2" -A10000000 | \
                grep "$3" -B10000000 | \
                awk '{print $4"="$5}'
            ;;
      *)
            cat /var/log/dpkg.log
            ;;
    esac
}

ভাল লাগছে সেই রিসোর্স গুলো! দুর্দান্ত উত্তর!
L0j1k

1
apt-history rollbackকমান্ড মত কিছু দিয়ে প্রতিস্থাপিত হতে পারে awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log
টোটার

নিম্নলিখিত সম্প্রসারণের সাথে, এটি কেবলমাত্র প্রদত্ত তারিখের আপগ্রেডগুলির সাথে মেলে (সুতরাং আগে লগটি সংশোধন করার দরকার নেই):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
লুয়েটর

1
Dpkg.log ছাঁটাইয়ের পরে আমি একটি গুচ্ছ সংস্করণ পাইনি বার্তাগুলি পাওয়া গেল না, যেমন E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found। আমি রাস্পিয়ানদের জন্য ডেবিয়ান স্ট্রেচ ব্যবহার করছি।
dps

7

লগ ফাইল /var/log/apt/history.logএবং /var/log/apt/term.logআপনার বর্ণনার জন্য উপলব্ধ নিকটতম জিনিস:

আমি মনে করি যে কোনও ধরণের স্ক্রিপ্ট থাকতে পারে যা সদ্য ইনস্টল হওয়া প্যাকেজটির তালিকা এবং তাদের পূর্ববর্তী সংস্করণ নম্বরটি সংরক্ষণ করতে পারে

history.logaptনিম্নলিখিত ফর্ম্যাটে নেওয়া প্রতিটি ক্রিয়াকলাপের সংক্ষিপ্ত তালিকা দেয় :

Start-Date: 2013-06-21  16:05:05
Commandline: apt-get install rdiff-backup
Install: python-pyxattr:i386 (0.5.0-3, automatic), rdiff-backup:i386 (1.2.8-6), python-pylibacl:i386 (0.5.0-3, automatic
), librsync1:i386 (0.9.7-7, automatic)
End-Date: 2013-06-21  16:05:42

বিশেষত, এটি সদ্য ইনস্টল হওয়া প্যাকেজগুলির বা মুছে ফেলা প্যাকেজের তালিকা সরবরাহ করে। অতিরিক্তভাবে, term.logক্রিয়াকলাপের সময় টার্মিনালে আসলে কী উপস্থিত হয়েছিল তা দেখায়, যাতে প্যাকেজগুলির পুরানো এবং নতুন সংস্করণ দেখা যায়। আমার থেকে একটি এলোমেলো নমুনা history.log:

Preparing to replace gnupg 1.4.10-4 (using .../gnupg_1.4.10-4+squeeze1_i386.deb) ...
Unpacking replacement gnupg ...
Processing triggers for install-info ...
Processing triggers for man-db ...
Processing triggers for doc-base ...
Processing 1 changed doc-base file(s)...
Registering documents with scrollkeeper...
Setting up gnupg (1.4.10-4+squeeze1) 

aptস্বয়ংক্রিয়ভাবে ফিরে রোল করার চেষ্টা করার পরামর্শ দেওয়া হয় না, তবে আপনি যদি লগগুলি ব্যবহার করেন তবে ব্যর্থ aptক্রিয়াকলাপের কোনও ক্রিয়াকলাপ যাতে ভাঙা যায় না যেমন ম্যানুয়ালি এটি করা সম্ভব হবে , উদাহরণস্বরূপ একটি বেমানান ডিপি কেজি ডাটাবেস। সেক্ষেত্রে এগিয়ে যাওয়ার আগে আপনাকে সমস্যাটি সমাধান করতে হবে।


4

না, অ্যাপটি এটিকে সহজ করে না।

সেরা বিকল্পটি হ'ল এক ধরণের স্ন্যাপশট। যদি আপনি কোনও ধরণের ভিএম ব্যবহার করেন তবে lvm / zfs / btrfs বা উদাহরণ স্ন্যাপশটের মাধ্যমে ফাইল সিস্টেম স্ন্যাপশট।

আর একমাত্র বিকল্প হ'ল আগে এবং পরে ইনস্টল করা প্যাকেজগুলির (ডিপিকিজি-এল) একটি তালিকা নেওয়া। আপনি যদি "রোল ব্যাক" করতে চান তবে আপনাকে পূর্ববর্তী সংস্করণ স্পষ্টভাবে ইনস্টল করতে হবে।


আমি সঠিক সংস্করণ জানি, কিন্তু উপযুক্ত প্রত্যাখ্যান: apt install openssl=1.0.2g-1ubuntu4.12ফলাফল E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found। আমি কেবল আপগ্রেড 1.0.2g-1ubuntu4.13করেছি এবং আমি ভাবছি যে এটি এখন কিছু সিওআর / সিএসপি সমস্যা সৃষ্টি করছে
সিসাবা টথ

এটি আর ভান্ডারে থাকতে পারে না।
বাহামাত
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.