ดาวน์เกรดแพ็กเกจ ppa เป็นเวอร์ชันที่มีอยู่ในช่วงเวลาก่อนหน้า


15

backstory คือไดรเวอร์ปกติของ Intel GPU ไม่ได้ทำส่วนขยาย OpenGL หลากหลายที่งานอดิเรกของฉันเข้ารหัสและบางเกมต้องการ ดังนั้นฉันต้องติดตั้ง xorg-edgers แล้วมีความสุข อย่างไรก็ตามเมื่อวันพุธที่ผ่านมามีการอัพเดท xorg-edgers แพ็คเกจจำนวนมากและมันก็แย่มาก ไดรเวอร์ล็อคและใช้คอมพิวเตอร์ทั้งเครื่องกับพวกเขา; ต้องฮาร์ดรีเซ็ต

ดังนั้นคุณจะลดระดับได้อย่างไร - เลือกรุ่นแพ็คเกจใน PPA ที่แสดงถึงจุดที่ผ่านมาโดยไม่สนใจรุ่นที่ใหม่กว่า?

คำตอบ:


18

การใช้ xorg-edgers ppa สำหรับงานประจำวันอาจเป็นความคิดที่แย่

อาจให้ไดรเวอร์ล่าสุดจริง แต่คุณยังไม่สามารถใช้ไดรเวอร์ได้

หากต้องการลบ PPAและปรับลดรุ่นแพ็กเกจที่ถูกแทนที่ (เพื่อกลับไปเป็นแพคเกจที่เป็นทางการ) ให้ติดตั้ง ppa-purge ก่อน:

sudo apt-get install ppa-purge

จากนั้นนำ PPA ออกการลดระดับอย่างสง่างามเป็นแพ็คเกจอย่างเป็นทางการ:

sudo ppa-purge ppaname

สิ่งนี้จะลดระดับแพ็คเกจของคุณกลับเป็นแพ็คเกจที่เป็นทางการ

แพ็คเกจอื่นที่อยู่ใน PPA แต่ไม่ใช่ในที่เก็บข้อมูลอย่างเป็นทางการจะไม่ถูกถอนการติดตั้ง คุณควรบอกให้ผู้จัดการแพ็คเกจทำการลบออกด้วยตนเองเช่นการใช้ apt:

sudo apt-get purge packagename

คุณสามารถค้นหาชื่อของ ppa ที่ดูในส่วน "แหล่งซอฟแวร์" ของการตั้งค่า Ubuntu และดูรายการแพ็คเกจที่ให้ไว้ในหน้า Launchpad (หรือดูที่ส่วน "แหล่งกำเนิด" ของ Synaptic Package Manager หากติดตั้ง)


1
อย่างที่ฉันพูดไดรเวอร์ปกติไม่ทำงานสำหรับฉัน ฉันต้องการ xorg-edgers ฉันแค่ต้องการเลี่ยงการติดตั้งไดรเวอร์รุ่นล่าสุดของฉัน
Will

สิบครั้งต่อไปที่คุณใช้ xorg edgers ppa (และทำงาน) เพียงแค่ปิดการใช้งาน ppa และติดกับแพ็คเกจแพ็คเกจเหล่านั้น
xangua

2
sudo ppa-purge ppa:someppa/ppa
DmitrySandalov

มันลบทุกอย่างในกรณีของฉัน
noone

2

ฉันมีปัญหาเดียวกันในวันนี้ฉันสังเกตเห็นว่า ~ 2 สัปดาห์ก่อนฉันติดตั้งการอัปเดตระบบของฉันและยังคงเปิดใช้งาน ubuntu-x-swat ppa ซึ่งมีไดรเวอร์ nvidia ใหม่ อันเก่าก็โอเคแล้วอันใหม่ที่ทำให้ระบบของฉันพัง (เพียงเล็กน้อย

ดังนั้นฉันจึงค้นหาใน /var/log/apt/history.log เพื่อค้นหาหมายเลขรุ่นก่อนหน้าของแพคเกจไดรเวอร์ nvidia ที่ฉันติดตั้งแล้วลองค้นหาแพ็คเกจใน / var / cache / apt / archives ซึ่งปกติคุณจะใช้ ค้นหาแพ็คเกจทั้งหมดที่ดาวน์โหลดโดย apt แต่ไม่ได้อยู่ที่นั่น และ ppa ไม่ได้เก็บแพ็คเกจรุ่นก่อนหน้าเอาไว้เมื่อมันถูกแทนที่ด้วยเวอร์ชั่นที่ใหม่กว่าดังนั้นฉันจึงไม่สามารถรับมันได้จากที่นั่น

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

ฉันจะอธิบายขั้นตอนที่จำเป็นโดยย่อ:

  • ไปที่ ppa ค้นหาเวอร์ชันแพ็คเกจล่าสุดและดาวน์โหลด tarball ดั้งเดิมและเดเบียนเดเบียนที่เป็นตัวเลือกในกรณีของฉันที่พบในหน้านั้น:

    https://launchpad.net/~ubuntu-x-swat/+archive/x-updates/+sourcepub/2087970/+listing-archive-extra
    

    tarball ดั้งเดิมมีชื่อ:

    nvidia-graphics-drivers_290.10.orig.tar.gz
    

    โปรแกรมแก้ไข debian ที่สร้างแพ็คเกจที่ build ได้จาก tarball คือ:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • แตกไฟล์เหล่านั้นลงในไดเร็กทอรีใหม่และว่างจากนั้นนำแพตช์ไปใช้กับทรีซอร์ส

    ~/nvidia> tar xvzf nvidia-graphics-drivers_290.10.orig.tar.gz
    [...]
    ~/nvidia> gzip -d nvidia-graphics-drivers_290.10-0ubuntu1\~lucid\~xup1.diff.gz
    ~/nvidia> patch -p0 < nvidia-graphics-drivers_290.10-0ubuntu1\~lucid\~xup1.diff
    [...]
    

    คุณไม่ควรได้รับชิ้นส่วนที่ถูกปฏิเสธเมื่อทำการปะแก้

  • ในหน้า ppa เดียวกันคุณจะพบความแตกต่างจากเวอร์ชั่นแพคเกจก่อนหน้าไปยังเวอร์ชั่นที่คุณกำลังดูภายใต้ส่วน "Available Diffs"

    สำหรับฉันนั่นคือ:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • ดาวน์โหลดนั้นแตกและย้อนกลับใช้กับแหล่งต้นฉบับที่ได้รับการแพตช์:

    ~/nvidia> gzip -d nvidia-graphics-drivers_285.05.09-0ubuntu1\~lucid\~xup1_290.10-0ubuntu1\~lucid\~xup1.diff.gz
    ~/nvidia> patch -R -p0 < nvidia-settings_285.05.09-0ubuntu1\~lucid\~xup1_290.10-0ubuntu1\~lucid\~xup1.diff
    [...]
    
  • โอมเพี้ยง! ตอนนี้คุณควรจะมีซอร์สโค้ดเวอร์ชันก่อนหน้าพร้อมที่จะสร้างแพ็คเกจ:

    ~/nvidia> mv nvidia-settings-290.10/ nvidia-settings-285.05.09
    ~/nvidia> cd nvidia-settings-285.05.09/
    ~/n/nvidia-settings-285.05.09> dpkg-buildpackage
    
  • ซึ่งควรให้แพคเกจเวอร์ชันก่อนหน้านี้ที่สามารถติดตั้งด้วย dpkg ได้:

     ~/n/nvidia-settings-285.05.09> cd ..
     ~/nvidia> sudo dpkg -i nvidia-current_285.05.09-0ubuntu1\~lucid\~xup1_amd64.deb
     [...]
    

0

ในอนาคตหากคุณกำลังใช้ synaptic (สมมติว่าคุณสามารถบูตเป็น X) คุณสามารถเลือกได้จากรุ่นที่มีอยู่โดยเน้นแพคเกจที่จะเปลี่ยนแล้วเลือก 'รุ่นบังคับ' จากเมนู จากนั้นคุณควรจะสามารถลดระดับ


0

[โปสเตอร์ต้นฉบับ]

ฉันสนุกมากฉันเขียนสคริปต์เพื่อคำนวณความแตกต่างและดำเนินการคำสั่งกู้คืน มีประมาณ 100 แพ็คเกจที่เกี่ยวข้อง น่าเสียดายที่การปรับลดรุ่นของฉันล้มเหลวเนื่องจากแพ็คเกจจำนวนมากไม่สามารถใช้งานได้อีก :(

#!/usr/bin/env python

import sys, getopt, os
from datetime import datetime
datefmt = "%Y-%m-%d %H:%M:%S"

dry_run = True
try:
    opts,args = getopt.getopt(sys.argv[1:],"y")
    if not args:
        raise Exception("no date specified")
    elif len(args) == 1:
        args.append("00:00:00") # default time
    elif len(args) != 2:
        raise Exception("unexpected arguments")
    snapshot = datetime.strptime(" ".join(args),datefmt)
    for opt,_ in opts:
        if opt == "-y":
            dry_run = False
        else:
            raise Exception("unsupported option %s"%opt)
except Exception as e:
    print "error:",e
    print "usage:",sys.argv[0],"[flags] YYYY-MM-DD [HH:MM:SS]"
    print "flags: -y = for real; don\'t just show it, restore it"
    sys.exit(1)

# work out what to do
history = {}
restore = set()
remove = set()
with open("/var/log/dpkg.log","r") as log:
    for line in log:
        date,time,action,line = line.split(None,3)       
        when = datetime.strptime("%s %s"%(date,time),datefmt)
        package,ver = line.strip().split(None,1)
        if when <= snapshot:
            if action in ("upgrade","install"):
                prev_ver,new_ver = ver.split()
                history[package] = new_ver
            elif action == "remove":
                if package in history:
                    del history[package]
                else:
                    print "(cannot remove %s)"%line
        else:
            if action == "install":
                remove.add(package)
            elif action == "upgrade":
                if package in history:
                    restore.add(package)
                elif package not in remove:
                    print "(cannot revert %s)"%line
            elif action == "remove":
                if package in history:
                    restore.add(package)
                elif package in remove:
                    remove.remove(package)
                else:
                    print "(cannot revert %s)"%line

# show what to do
for package in restore:
    print "restore",package,history[package]
for package in remove:
    print "remove",package

# do it
if not dry_run:
    print "======"
    def execute(cmd):
        print cmd
        os.system(cmd)
    #execute("apt-get remove "+" ".join(remove))
    execute("apt-get install "+" ".join("%s=%s"%(package,history[package]) for package in restore))

น่าสงสารคุณ. คุณทราบหรือไม่ว่าประวัติศาสตร์การติดตั้งที่มีอยู่เพียงแค่ใน/var/log/apt/history.log?
Lekensteyn

dpkg.log เป็นข้อมูลเดียวกัน แต่ยังรวมถึงแอพอื่น ๆ ที่เหมาะสมกว่า
Will

มีแอพอื่นใดที่ใช้dpkgโดยตรง Synaptic เป็น front-end apt-getของ
Lekensteyn

ผู้ใช้สามารถใช้ dpkg โดยตรง ผู้ใช้อาจใช้ gdebi หรือเครื่องมืออื่นแทน ฉันต้องเลือกไฟล์เพื่อแจงดังนั้นฉันจึงเลือกไฟล์ที่เหมาะสม - dpkg.log มันเกิดขึ้นฉันใช้ฉลาด แต่แตกต่างกัน
Will
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.