hạ cấp các gói ppa xuống các phiên bản có sẵn tại một thời điểm trước đó


14

Cơ sở là các trình điều khiển GPU Intel thông thường không thực hiện các phần mở rộng OpenGL khác nhau mà mã hóa sở thích của tôi và một số trò chơi muốn. Vì vậy, tôi phải cài đặt xorg-edgers và sau đó nó hạnh phúc. Tuy nhiên, vào thứ Tư tuần trước, đã có một bản cập nhật cho xorg-edgers - rất nhiều gói - và nó đã bị hỏng nặng; các trình điều khiển khóa và mang theo toàn bộ máy tính với họ; yêu cầu thiết lập lại cứng.

Vậy làm thế nào bạn có thể hạ cấp - chọn các phiên bản gói trong PPA đại diện cho một điểm trong quá khứ, bỏ qua các phiên bản mới hơn đó?

Câu trả lời:


17

Sử dụng xorg-edgers ppa cho công việc hàng ngày có thể là một ý tưởng khá tồi.

Nó có thể cung cấp cho bạn trình điều khiển mới nhất, đúng, nhưng bạn cũng có thể không có trình điều khiển làm việc.

Để xóa PPA và hạ cấp các gói được thay thế bởi nó (vì vậy hãy quay lại các gói có sẵn trên kho chính thức), trước tiên hãy cài đặt ppa-purge:

sudo apt-get install ppa-purge

Và sau đó loại bỏ PPA, hạ cấp một cách duyên dáng xuống các gói chính thức:

sudo ppa-purge ppaname

Điều này sẽ hạ cấp các gói của bạn trở lại các gói chính thức.

Các gói khác trong PPA nhưng không có trong kho chính thức sẽ không được gỡ cài đặt. Bạn nên thủ công nói với người quản lý gói để loại bỏ chúng, ví dụ như sử dụng apt:

sudo apt-get purge packagename

Bạn có thể tìm thấy tên của ppa đang xem phần "Nguồn phần mềm" trong Cài đặt Ubuntu và xem danh sách các gói mà nó cung cấp trên trang launchpad của nó (hoặc xem phần "Nguồn gốc" của Trình quản lý gói Synaptic, nếu được cài đặt).


1
Như tôi đã nói, các trình điều khiển bình thường không làm việc cho tôi. Tôi cần xorg-edgers. Tôi chỉ muốn vượt qua phiên bản mới nhất của trình điều khiển của tôi.
Sẽ

mười lần tiếp theo bạn sử dụng xorg edgers ppa (và hoạt động) chỉ cần vô hiệu hóa ppa và gắn bó với các phiên bản gói đó
xangua 04

2
sudo ppa-purge ppa:someppa/ppa
DmitrySandalov

nó loại bỏ mọi thứ trong trường hợp của tôi
noone

2

Tôi đã gặp vấn đề tương tự ngày hôm nay, tôi nhận thấy rằng ~ 2 tuần trước tôi đã cài đặt các bản cập nhật cho hệ thống của mình và vẫn kích hoạt pub ub Ubuntu-x-swat có trình điều khiển nvidia mới. Cái cũ vẫn ổn, cái mới đã phá vỡ hệ thống của tôi (chỉ một chút thôi, tôi phải mất một lúc mới để ý).

Vì vậy, tôi đã tìm trong /var/log/apt/history.log để tìm số phiên bản trước của gói trình điều khiển nvidia mà tôi đã cài đặt và sau đó cố gắng tìm gói trong / var / cache / apt / archives, nơi bạn sẽ bình thường tìm tất cả các gói được tải xuống bởi apt, nhưng nó không có ở đó. Và ppa không giữ phiên bản trước của các gói của nó xung quanh một khi chúng được thay thế bởi phiên bản mới hơn nên tôi cũng không thể lấy nó từ đó.

Tuy nhiên, sự khác biệt từ phiên bản gói trước sang phiên bản mới hơn được giữ trong ppa cho tất cả các phiên bản và cùng với tarball gốc và bản vá lỗi của nó, có thể đảo ngược tất cả các thay đổi của phiên bản mới hơn và lấy các nguồn phiên bản trước.

Tôi sẽ mô tả ngắn gọn các bước cần thiết:

  • Đi đến ppa, tìm phiên bản gói mới nhất và tải xuống tarball gốc và các bản vá debian (tùy chọn), trong trường hợp của tôi được tìm thấy trên trang đó:

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

    Tarball ban đầu được đặt tên:

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

    Các bản vá debian tạo ra một gói có thể xây dựng từ tarball là:

    nvidia-graphics-drivers_290.10-0ubuntu1~lucid~xup1.diff.gz
    
  • Trích xuất những cái đó ở đâu đó tốt nhất trong một thư mục mới và trống, sau đó áp dụng các bản vá cho cây nguồn

    ~/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
    [...]
    

    Bạn không nên nhận bất kỳ khối bị từ chối khi vá.

  • Trên cùng một trang ppa, bạn sẽ tìm thấy một khác biệt từ phiên bản gói trước đó đến phiên bản bạn đang xem, dưới bài giảng "Có sẵn khác biệt".

    Đối với tôi đó là:

    diff from 285.05.09-0ubuntu1~lucid~xup1 to 290.10-0ubuntu1~lucid~xup1
    
  • Tải xuống, trích xuất và áp dụng ngược lại cho các nguồn gốc đã vá:

    ~/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
    [...]
    
  • Mau! Bây giờ bạn nên có cây nguồn phiên bản trước để sẵn sàng xây dựng gói:

    ~/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
    
  • Cung cấp cho bạn gói phiên bản trước có thể được cài đặt với dpkg:

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

0

Trong tương lai, nếu bạn đang sử dụng synaptic (giả sử bạn có thể khởi động vào X), bạn có thể chọn từ các phiên bản có sẵn bằng cách tô sáng gói cần thay đổi và sau đó chọn 'bắt buộc phiên bản' từ menu. Từ đó bạn sẽ có thể hạ cấp.


0

[Áp phích gốc]

Không có nhiều niềm vui, tôi đã viết một kịch bản để tính toán sự khác biệt và thực hiện lệnh khôi phục; Có khoảng 100 gói tham gia. Đáng buồn là việc hạ cấp của tôi không thành công vì nhiều gói không còn khả dụng :(

#!/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))

Tội nghiệp bạn. Bạn có biết rằng lịch sử cài đặt chỉ có sẵn trong /var/log/apt/history.log?
Lekensteyn

dpkg.log là thông tin tương tự nhưng cũng bao gồm các ứng dụng khác ngoài apt.
Sẽ

Những ứng dụng khác sử dụng dpkgtrực tiếp sau đó? Synaptic là một mặt trước của apt-get.
Lekensteyn

người dùng có thể sử dụng trực tiếp dpkg; người dùng cũng có thể sử dụng gdebi hoặc một số công cụ khác. Tôi đã phải chọn một tệp để phân tích cú pháp, vì vậy tôi đã chọn một tệp thích hợp - dpkg.log. Nó xảy ra tôi sử dụng apt độc quyền, nhưng cùng một sự khác biệt.
Will
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.