अगर कुछ गलत हो जाता है तो क्या मैं एक अपग्रेड प्राप्त कर सकता हूं?


53

क्या कोई रास्ता है, aptitude upgradeया शुरू करने से पहले apt-get upgrade, कुछ सेट करने के लिए ताकि आप "आसानी से" अपने सिस्टम को "उपयुक्त" स्थिति में रोलबैक कर सकें यह वास्तविक अपग्रेड से पहले था, अगर कुछ गलत हो जाता है?

उदाहरण के लिए, प्रक्रिया के दौरान उन्नत किए गए संकुल के पुराने संस्करण को पुनः स्थापित करें।

(EDIT) कुछ संकेत : मैं जानता हूं कि etckeeperउदाहरण के लिए कुछ हुक का उपयोग करता है aptताकि जब भी aptकिसी पैकेज को स्थापित या अनइंस्टॉल किया जाए तो उसे अधिसूचित किया जा सके । मुझे लगता है कि कुछ प्रकार की स्क्रिप्ट हो सकती है जो नए स्थापित पैकेज की सूची और उनके पिछले संस्करण की संख्या को aptकैश ( /var/cache/apt/archives) से उन्हें फिर से स्थापित करने में सक्षम होने के लिए बचा सकती है । वहाँ भी है checkinstallजो फ़ाइल संशोधनों का ट्रैक रख सकता है ...

कैसे ठीक से प्राप्त करने के लिए पर कोई विवरण?


मुझे इस बात की जानकारी नहीं है कि निर्माण में ऐसा कुछ है, आपको वर्तमान में स्थापित पैकेज नंबरों आदि का ध्यान रखना होगा। यदि आवश्यक हो तो कल बैकअप को बहाल करने के लिए आसान IMHO।
एंथन

जवाबों:


46

मुझे अभी इसका उत्तर देना था, क्योंकि apt-get upgradeडेबियन सर्वर पर अंतिम ने व्यस्त बॉक्स से सबसे हाल के कर्नेल को बूट करना असंभव बना दिया था, जो कि zfs रूट विभाजन को माउंट करने में विफल था। कम से कम एक पुराना कर्नेल अभी भी बूट हो सकता है, लेकिन अन्य सॉफ़्टवेयर के साथ असंगत था। इस प्रकार रोलबैक की आवश्यकता।

संक्षिप्त उत्तर - आप निम्नलिखित कमांड का उपयोग कर सकते हैं:

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

यदि यह वह है जो आप हटाना चाहते हैं -sऔर इसे फिर से चलाएं। इस कार्य को ठीक से करने के लिए मैंने यहां कदम उठाए हैं:

  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कार्यों में हस्तक्षेप करता है , जैसे कि एक असंगत dpkg डेटाबेस। उस स्थिति में, आपको आगे बढ़ने से पहले समस्या को ठीक करना होगा।


4

नहीं, यह आसान नहीं है।

सबसे अच्छा विकल्प कुछ प्रकार के स्नैपशॉट है। यदि आप किसी प्रकार के VM का उपयोग कर रहे हैं तो फ़ाइल सिस्टम स्नैपशॉट lvm / zfs / btrfs या उदाहरण स्नैपशॉट के माध्यम से।

एकमात्र अन्य विकल्प पहले और बाद में स्थापित संकुल (dpkg -l) की एक सूची लेना है। यदि आप "रोल बैक" करना चाहते हैं, तो आपको पिछले संस्करण को स्पष्ट रूप से स्थापित करना होगा।


मैं सटीक संस्करण जानता हूं, लेकिन उपयुक्त इनकार करता है: 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और मैं सोच रहा हूं कि क्या अब कुछ CORS / CSP समस्याएँ पैदा हो रही हैं
Csaba Toth

यह अब रिपॉजिटरी में नहीं हो सकता है।
भामत
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.