Tôi có thể khôi phục nâng cấp apt-get nếu có sự cố không?


53

Có cách nào không, trước khi bắt đầu aptitude upgradehoặc apt-get upgrade, để thiết lập một cái gì đó để bạn có thể "dễ dàng" khôi phục hệ thống của mình về trạng thái "apt" trước khi nâng cấp thực sự, nếu có sự cố xảy ra?

Đó là, ví dụ, cài đặt lại phiên bản cũ của các gói đã được nâng cấp trong quá trình.

(EDIT) Một vài gợi ý : Tôi biết rằng etckeeperví dụ sử dụng một số hook aptđể nó được thông báo mỗi khi aptcài đặt hoặc gỡ cài đặt gói. Tôi cho rằng có thể có một số loại kịch bản có thể lưu danh sách gói mới được cài đặt và số phiên bản trước đó của chúng để có thể cài đặt lại chúng từ aptbộ đệm ( /var/cache/apt/archives). Ngoài ra còn checkinstallcó thể theo dõi các sửa đổi tập tin ...

Bất kỳ chi tiết về làm thế nào để đạt được điều đó đúng?


Tôi không biết rằng apt có một cái gì đó tương tự như vậy, bạn sẽ phải theo dõi các số gói hiện đang được cài đặt, vv IMHO dễ dàng hơn chỉ để khôi phục sao lưu vào thứ năm nếu cần thiết.
Anthon

Câu trả lời:


46

Bây giờ tôi chỉ phải tìm ra câu trả lời cho điều này, bởi vì cái cuối cùng apt-get upgradetrên máy chủ Debian khiến nó không thể khởi động hạt nhân gần đây nhất ngoài một hộp bận, không thể phân vùng gốc zfs. Ít nhất một kernel cũ hơn vẫn có thể khởi động, nhưng không tương thích với các phần mềm khác. Do đó, cần phải có một rollback.

Câu trả lời ngắn - bạn có thể sử dụng lệnh sau:

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

nếu nó làm những gì bạn muốn loại bỏ -svà chạy lại nó. Dưới đây là các bước tôi đã thực hiện để làm việc này đúng cách:

  1. Tôi tạm thời cắt giảm /var/log/dpkg.logđể chỉ nâng cấp ngày hôm nay

  2. Tôi đã cài đặt tập lệnh nhỏ apt-historytừ đây vào ~/.bashrcvà chạy

    $ 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. Điều này cung cấp một danh sách được định dạng độc đáo của các gói được phiên bản để quay lại bằng cách đưa nó vào apt-get install. Cắt danh sách này khi cần trong trình soạn thảo văn bản và sau đó chạy (với -schạy khô trước):

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

Apt sẽ cảnh báo về việc hạ cấp dự kiến. Để ngăn việc rollback này bị ghi đè bởi lần nâng cấp tiếp theo, các gói sẽ cần được ghim, cho đến khi vấn đề ban đầu được giải quyết. Ví dụ với: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
}

Rất vui khi tìm thấy những tài nguyên đó! Câu trả lời chính xác!
L0j1k

1
Các apt-history rollbacklệnh có thể được thay thế bằng một cái gì đó giống như awk '$3 ~ /upgrade/ {print $4"="$5}' dpkg.log.
Toto

Với tiện ích mở rộng sau, nó chỉ phù hợp với các bản nâng cấp của ngày đã cho (vì vậy không cần phải sửa đổi nhật ký trước đó):awk '$1 == "2018-09-07" && $3 == "upgrade" {print $4"="$5}' /var/log/dpkg.log
lưu trữ

1
Sau khi cắt dpkg.log, tôi nhận được một loạt các phiên bản không tìm thấy tin nhắn, tức là E: Version '5.24.1-3+deb9u3' for 'libperl5.24' was not found. Tôi đang sử dụng Debian Stretch cho Raspian.
dps

7

Các tệp nhật ký /var/log/apt/history.log/var/log/apt/term.loglà những thứ gần nhất có sẵn cho mô tả của bạn:

Tôi cho rằng có thể có một số loại kịch bản có thể lưu danh sách gói mới được cài đặt và số phiên bản trước đó của chúng

history.logđưa ra một danh sách tóm tắt của mọi hành động aptthực hiện theo định dạng sau:

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

Cụ thể, nó cung cấp một danh sách các gói mới được cài đặt hoặc các gói bị loại bỏ. Ngoài ra, term.loghiển thị những gì thực sự xuất hiện trên thiết bị đầu cuối trong khi hành động, do đó sẽ hiển thị các phiên bản cũ và mới của các gói. Một mẫu ngẫu nhiên từ của tôi 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) 

Cố gắng apttự động quay lại không được khuyến khích, nhưng nếu bạn sử dụng nhật ký, thì có thể thực hiện thủ công trừ khi hành động thất bại đã phá vỡ thứ gì đó can thiệp vào apthành động của nó, ví dụ: cơ sở dữ liệu dpkg không nhất quán. Trong trường hợp đó, bạn sẽ phải khắc phục sự cố trước khi tiếp tục.


4

Không, apt không làm điều đó dễ dàng.

Tùy chọn tốt nhất là một số loại ảnh chụp nhanh. Ảnh chụp nhanh hệ thống tập tin thông qua lvm / zfs / btrfs hoặc ảnh chụp nhanh cá thể nếu bạn đang sử dụng một loại VM nào đó.

Tùy chọn duy nhất khác là lấy một kho lưu trữ các gói đã cài đặt (dpkg -l) trước và sau. Nếu bạn muốn "quay lại", bạn phải cài đặt rõ ràng phiên bản trước.


Tôi biết phiên bản chính xác, nhưng apt từ chối: apt install openssl=1.0.2g-1ubuntu4.12kết quả E: Version '1.0.2g-1ubuntu4.12' for 'openssl' was not found. Tôi mới nâng cấp lên 1.0.2g-1ubuntu4.13và tôi tự hỏi liệu điều đó có gây ra một số vấn đề về CORS / CSP không
Csaba Toth

Nó có thể không còn trong kho lưu trữ.
bahamat
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.