Làm thế nào để ngăn chặn cập nhật một gói cụ thể?


374

lỗi # 693758 tôi muốn ngăn apt-get upgradevà Trình quản lý cập nhật cập nhật gói "libgtk2.0-0".

Làm thế nào điều này có thể đạt được?


@hhlp: Nhưng câu hỏi này là hỏi về một gói chưa bao giờ được cài đặt.
Nathan Osman

1
@George Edison - Ngoài ra còn có gói giữ, cho phép bạn không cập nhật gói. Vì vậy, giữ một gói về cơ bản có nghĩa là bạn đang nói với người quản lý gói để giữ phiên bản hiện tại bất kể điều gì. Điều này hữu ích nếu phiên bản gần đây hơn của chương trình hiện đang hoạt động bị hỏng sau khi cập nhật. (bạn không thể giữ một gói chưa bao giờ được cài đặt cũng thấy câu hỏi của tôi giống nhau) .... tôi đã kiểm tra ngay bây giờ - xem anh ấy nóidisable packages from the auto-update
hhlp

Câu trả lời:


554

Giữ

Có bốn cách để giữ lại các gói: với dpkg, apt, aptitude hoặc dselect.

dpkg

Đặt một gói đang chờ:

echo "<package-name> hold" | sudo dpkg --set-selections

Xóa phần giữ:

echo "<package-name> install" | sudo dpkg --set-selections

Hiển thị trạng thái của các gói của bạn:

dpkg --get-selections

Hiển thị trạng thái của một gói duy nhất:

dpkg --get-selections | grep "<package-name>"

đúng cách

Giữ một gói:

sudo apt-mark hold <package-name>

Xóa phần giữ:

sudo apt-mark unhold <package-name>

Hiển thị tất cả các gói đang chờ:

sudo apt-mark showhold

chọn

Với DSelect, nhập màn hình bầu [S], tìm gói bạn muốn giữ ở trạng thái hiện tại và nhấn =hoặc H. Các thay đổi sẽ có hiệu lực ngay lập tức sau khi thoát khỏi màn hình bầu [S].


Các cách tiếp cận sau đây bị hạn chế trong việc khóa / giữ một gói trong aptitude hoặc synap không ảnh hưởng đến apt-get / apt.

năng khiếu

Giữ một gói:

sudo aptitude hold <package-name>

Xóa phần giữ:

sudo aptitude unhold <package-name>

Khóa với Trình quản lý gói Synaptic

Chuyển đến Trình quản lý gói Synaptic (Hệ thống> Quản trị> Trình quản lý gói Synaptic).

Nhấp vào nút tìm kiếm và nhập tên gói.

Khi bạn tìm thấy gói, chọn nó và vào menu Gói và chọn Phiên bản khóa .

Menu synap

Gói đó bây giờ sẽ không hiển thị trong trình quản lý cập nhật và sẽ không được cập nhật.


4
Điều này cũng hoạt động để ngăn chặn một gói được cài đặt. Khi cài đặt devscripts, rất nhiều gói được kéo như gói khuyến nghị. Vì tôi không cần mailserver (postfix), tôi có thể vô hiệu hóa cài đặt của nó bằng cách chạy echo postfix hold | sudo dpkg --set-selectionstrước khi chạy sudo apt-get install devscripts. Hành động giữ này chỉ tồn tại cho cài đặt này, sau khi cài đặt, các lựa chọn được đặt lại.
Lekensteyn

3
Cũng đáng để chỉ ra, các gói giữ đôi khi phá vỡ các bản nâng cấp và vá lỗi bằng cách tạo ra một tình huống mà không có giải pháp pháp lý nào apt có thể tính toán cho một phụ thuộc. Nếu gói foo có == <hoặc <= phụ thuộc vào libbar, thì apt sẽ từ chối nâng cấp libbar cũng như foo. Theo thời gian, các phụ thuộc xếp tầng này có thể phát triển để chặn một số lượng lớn các bản cập nhật, bao gồm các bản cập nhật bảo mật quan trọng. Bạn sẽ cần phải xóa lệnh giữ và để nâng cấp xảy ra hoặc xây dựng lại các gói bạn đang giữ so với các phiên bản mới hơn của phần phụ thuộc nếu điều này xảy ra.
Stephanie

2
Chỉ cần một lưu ý: apt-markkhông hỗ trợ holdtrong phiên bản 0.7.25 (Ubuntu Lucid)
Joril

1
Điều này đặc biệt hữu ích khi cố gắng giữ lại trình điều khiển đồ họa. Đối với người dùng ATI , apt-mark hold fglrx fglrx-amdcccle fglrx-dev && aptitude hold fglrx fglrx-amdcccle fglrx-dev.
earthmeLon

8
Hiện tại synap và aptitude chỉ khóa các gói trong các chương trình đó. "Bất cứ điều gì khác làm nâng cấp gói (đọc: Update Manager, apt-get, aptitude, v.v.) đều bỏ qua điều này." Từ câu hỏi này .
holocronweaver

44

Để đặt gói "foo" ở trạng thái chờ:

echo "foo hold" | dpkg --set-selections

Trong trường hợp của bạn, chúng tôi sẽ giữ rượu vang:

sudo -i
echo "wine hold" | dpkg --set-selections

Để xóa phần giữ:

sudo -i
echo "wine install" | dpkg --set-selections

Cũng lưu ý rằng trong khi gói đang bị treo, bạn có thể cài đặt một phiên bản cụ thể thông qua apt-get install wine=1.2.3. Bị giữ lại ngăn cản apt-get (dist-)upgradethay đổi nó.
RCoup

@rcoup Nếu bạn có phiên bản cũ bị tạm giữ, sau đó bạn nâng cấp thủ công lên phiên bản mới mà không xóa chế độ giữ như bạn mô tả, phiên bản cũ có được giữ trong bộ đệm để bạn có thể quay lại không?
cxrodgers

1
@cxrodgers bộ đệm cục bộ (thường /var/cache/apt/archives) không phụ thuộc vào giữ & nâng cấp & công cụ, vì vậy tất cả các phiên bản bạn đã tải xuống sẽ ở đó cho đến khi bạn chạyapt-get [auto]clean
RCoup

35

Tôi đã tìm kiếm điều tương tự và sau rất nhiều nghiên cứu tôi thấy rằng sử dụng cú pháp sau đây bạn có thể cấm một phiên bản cụ thể nhưng cho phép cập nhật tiếp theo:

Gói: compiz-plugins-main
Pin: phiên bản 1: 0.9.7.0 ~ bzr19-0ubfox10.1
Pin-Ưu tiên: -1

Điều này đi vào tập tin / etc / apt / Preferences.


9
Đây là một cách tốt hơn nhiều so với việc ngăn chặn cập nhật vô thời hạn
Eero Aaltonen

Với phương pháp này, tôi nghĩ, cơ hội sẽ lớn hơn để ngăn chặn ubfox 'phần mềm quảng cáo' như ubfox một hoặc biểu tượng amazon được cài đặt lại với bản nâng cấp phát hành tiếp theo ...
Daniel Alder

19

Cài đặt synapticbằng sudo apt-get install synaptic.

Chạy bằng cách sử dụng gksudo synapticvà trên hộp tìm kiếm xác định gói bạn muốn khóa, nghĩa là:gedit

nhập mô tả hình ảnh ở đây

Từ menu gói chọn Phiên bản khóa :

nhập mô tả hình ảnh ở đây

Và đó là tất cả, phiên bản hiện được cài đặt tại thời điểm khóa sẽ vẫn được cài đặt ngay cả trong khi nâng cấp.


7
Vui lòng xem "Phiên bản khóa không thông minh như âm thanh. Nó phải làm những gì nó nói trên hộp thiếc, khóa phiên bản ... Nhưng nó chỉ khóa nó trong Synaptic. Mọi thứ khác đều nâng cấp gói (đọc: Trình quản lý cập nhật , apt-get, aptitude, v.v.) bỏ qua điều này. Đây có thể là hành vi có lỗi nên tôi mong điều này sẽ được khắc phục kịp thời. " từ Askubfox.com/questions/9607/what-does-lock-version-do . Tình trạng hiện tại là gì? Nếu một cái gì đó bị khóa trong Synaptic, các nhà quản lý gói khác có "tôn vinh" khóa không?

2
vasa1: Kể từ phiên bản 0.75.13, vẫn không có :( Cùng một vấn đề với năng khiếu.
syockit

16

Ngăn chặn một gói được cài đặt được gọi là "giữ gói" và rất đơn giản để thực hiện:

echo gói_name giữ | dpkg - bộ lựa chọn

... trong đó * pack_name * là tên của gói bạn muốn ngăn cài đặt.

Lưu ý: lệnh trên giả định quyền root. Nói cách khác, bạn có thể sẽ cần phải gõ sudo sutrước khi chạy nó.


Hoàn hảo đây là câu trả lời. Cảm ơn bạn.
asoundmove

s/sudo su/sudo -s/g(hoặc sudo -i). ( -isẽ cung cấp một vỏ đăng nhập, -ssẽ không).
derobert

6

Do một số thời gian apt-getđược thay thế bằng apt, vì vậy, ví dụ tôi muốn ngăn Firefox cập nhật lên phiên bản trên 56, vì rất nhiều tiện ích bổ sung, như "Nhóm Tab" không hoạt động nữa với Firefox 57 mới (xem "WebExtensions Cập nhật ").

Có thể giữ nhiều gói với một lệnh và sử dụng ký tự đại diện.

Ngăn Firefox cập nhật

sudo apt-mark hold firefox firefox-locale-*

Nếu bạn nên từ bỏ để mở ra chúng sau này, đó sẽ là lệnh:

sudo apt-mark unhold firefox firefox-locale-*

4

Tôi đồng bộ bạn có thể đóng băng phiên bản của một gói cụ thể Tôi không chắc chắn 100% về việc liệu điều này có sửa đổi apt-get hay không nhưng chắc chắn nó sẽ dừng trình quản lý cập nhật.

Để đóng băng một gói, chọn nó trong synaptic, sau đó mở menu gói và chọn phiên bản đóng băng.

Hi vọng điêu nay co ich

chỉnh sửa: Câu hỏi này 16668 xử lý một tình huống tương tự



3

Xem lỗi # 75332 , # 158981# 72806 .

Tóm tắt là việc giữ ở mức apt-get / aptitude không kích hoạt trạng thái giữ trong dpkg (đặc biệt là xem lỗi 72806) và trình quản lý cập nhật đọc trạng thái từ dpkg.

cách giải quyết được chạy dưới quyền root: echo "package hold" | dpkg --set-selections


2

Bạn có thể sử dụng trên aptitude "ghi đè cụ thể", như thế này:

aptitude reinstall ~i oracle-java8-jre:

Đây chỉ là một lần sử dụng (không được lưu trữ cho các lần cài đặt lại trong tương lai), giữ nguyên ghi đè cụ thể, để cài đặt lại tất cả các gói trong hệ thống của bạn chứ không phải oracle-java8-jre.

Nếu bạn sử dụng ghi đè cụ thể, gói trong giây lát sẽ ở trạng thái giữ năng lực sẽ không cố gắng cài đặt nó.

Một điều rất tốt nếu bạn nghĩ rằng hệ thống của bạn đã bị xâm phạm một số cách.


1

Nếu bạn đã cài đặt Synaptic, bạn có thể chọn gói và sử dụng menu Gói -> Phiên bản khóa để ngăn không cho cập nhật.

Bạn có thể cài đặt Synaptic với sudo apt-get install synaptic. Cá nhân tôi thấy nó hữu ích hơn Trung tâm phần mềm ... một lần nữa, tôi khá già đi học. :)


0

Đôi khi người ta có thể muốn giữ lại tất cả các gói hiện được cài đặt. Đây là cách.

Đầu tiên lưu trạng thái hiện tại, vì vậy bạn có thể hoàn tác:

dpkg --get-selections > current_selections.txt

Sau đó, để giữ lại tất cả các gói:

dpkg --get-selections | sed -r "s/\tinstall/hold/" |dpkg --set-selections

Cuối cùng, khi bạn muốn trở lại trạng thái trước đó:

dpkg --set-selections < current_selections.txt

Một trường hợp sử dụng cho điều này có thể là khi tạo ảnh chụp nhanh VM hoặc Amazon AMI để di chuyển từ QA sang môi trường sản xuất.


0

Thêm chi tiết vào nhận xét của @ soger so với Ubuntu 16.04.

Ubuntu 16.04 không có tệp / etc / apt / Preferences hiện có theo mặc định. Nếu bạn hiện không có tệp nào, chỉ cần tạo một tệp mới và điền vào đó một khổ thơ như @soger mô tả ở trên để loại trừ gói đã cho và các phụ thuộc của nó khỏi các bản cập nhật.

Sau đó, chạy apt updatevà bạn là GTG. : 0)

Ví dụ: tôi có máy chủ Ubuntu 16.04.5 LTS với thẻ video Intel nhúng và thẻ NVidia. Thẻ NVidia là thẻ duy nhất được sử dụng. Máy chủ cũng sử dụng trình điều khiển CUDA. Tôi đã có một vấn đề mà aptcứ khăng khăng

va-driver-all

(Trình điều khiển Intel) yêu cầu cập nhật, nhưng nó không thể xác định phiên bản nào sẽ cài đặt. Điều này đã khiến tôi phát điên và dù sao tôi cũng không cần trình điều khiển Intel. Tôi đã nhập văn bản này vào tập tin ưu tiên và xóa apt, vấn đề đã được giải quyết.

Package: va-driver-all
Pin: release *
Pin-Priority: -1
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.