ฉันจะย้อนกลับการอัพเกรด apt-get ได้ไหมถ้ามีอะไรผิดพลาด?


53

มีวิธีก่อนที่จะเริ่มต้นaptitude upgradeหรือapt-get upgradeการตั้งค่าบางสิ่งบางอย่างเพื่อให้คุณสามารถ "ได้อย่างง่ายดาย" ย้อนกลับระบบของคุณไปที่ "ฉลาด" รัฐมันเป็นก่อนการอัพเกรดที่เกิดขึ้นจริงถ้ามีอะไรผิดหรือเปล่า?

ตัวอย่างเช่นติดตั้งแพ็กเกจเวอร์ชันเก่าที่อัพเกรดระหว่างกระบวนการ

(แก้ไข) คำแนะนำเล็กน้อย : ฉันรู้ว่าetckeeperตัวอย่างเช่นใช้เบ็ดบางอย่างaptเพื่อที่จะได้รับแจ้งเมื่อใดก็ตามที่aptติดตั้งหรือถอนการติดตั้งแพคเกจ ฉันคิดว่าอาจมีสคริปต์บางประเภทที่สามารถบันทึกรายการแพคเกจที่ติดตั้งใหม่และหมายเลขรุ่นก่อนหน้าเพื่อให้สามารถติดตั้งใหม่ได้จากaptแคช ( /var/cache/apt/archives) นอกจากนี้ยังมีcheckinstallที่สามารถติดตามการแก้ไขไฟล์ ...

รายละเอียดเกี่ยวกับวิธีการที่จะบรรลุอย่างถูกต้อง?


ฉันไม่ทราบว่า apt มีบางอย่างในตัวคุณจะต้องติดตามหมายเลขแพ็คเกจที่ติดตั้งอยู่ในปัจจุบันและอื่น ๆ ที่ง่ายกว่า IMHO เพียงเพื่อคืนค่าการสำรองข้อมูลเมื่อวานหากจำเป็น
Anthon

คำตอบ:


46

ตอนนี้ฉันต้องหาคำตอบสำหรับเรื่องนี้เพราะสุดท้ายapt-get upgradeบนเซิร์ฟเวอร์ Debian ทำให้มันเป็นไปไม่ได้ที่จะบูตเคอร์เนลล่าสุดนอกเหนือจาก busybox ไม่สามารถเมาต์รูตของ 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. นี้จะมีการจัดรูปแบบรายการเป็นอย่างดีของแพคเกจ versioned apt-get installจะม้วนกลับไปด้วยการกินมันเข้าไป ตัดรายการนี้ตามต้องการในเท็กซ์เอดิเตอร์จากนั้นรัน (ด้วย-sสำหรับการรันแบบแห้งก่อน):

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

Apt จะเตือนเกี่ยวกับการลดระดับซึ่งคาดว่า เพื่อป้องกันไม่ให้การย้อนกลับนี้ถูกเขียนทับโดยการอัพเกรดครั้งต่อไปแพ็คเกจจะต้องถูกตรึงไว้จนกว่าปัญหาเดิมจะได้รับการแก้ไข ตัวอย่างเช่น: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
Totor

ด้วยส่วนขยายต่อไปนี้จะตรงกับการอัปเกรดของวันที่ที่กำหนดเท่านั้น (ไม่จำเป็นต้องแก้ไขบันทึกก่อน):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
luator

1
หลังจากตัดแต่ง dpkg.log E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not foundฉันได้รับพวงของรุ่นไม่พบข้อความเช่น ฉันใช้ Debian Stretch สำหรับ Raspian
dps

7

ไฟล์บันทึก/var/log/apt/history.logและ/var/log/apt/term.logเป็นคำอธิบายของคุณที่ใกล้เคียงที่สุด:

ฉันคิดว่าอาจมีสคริปต์บางชนิดที่สามารถบันทึกรายการแพ็คเกจที่เพิ่งติดตั้งใหม่และหมายเลขเวอร์ชันก่อนหน้า

history.logให้รายการสรุปของทุกการกระทำที่aptเกิดขึ้นในรูปแบบต่อไปนี้:

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

ไม่ apt ไม่ได้ง่ายขนาดนั้น

ตัวเลือกที่ดีที่สุดคือภาพรวมบางประเภท ระบบไฟล์สแน็ปช็อตผ่าน lvm / zfs / btrfs หรือสแน็ปช็อตอินสแตนซ์หากคุณใช้ VM บางชนิด

ตัวเลือกอื่น ๆ ที่จะนำสินค้าคงคลังของแพคเกจที่ติดตั้ง (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

อาจไม่อยู่ในที่เก็บอีกต่อไป
บาฮามาต
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.