Các gói sau đây đã được giữ lại: Tại sao và làm thế nào để tôi giải quyết nó?


877

Tôi vừa thêm một kho lưu trữ PPA cho phiên bản phát triển của GIMP, nhưng tôi gặp lỗi này:

$ apt-get update && apt-get upgrade
...
The following packages have been kept back:
  gimp gimp-data libgegl-0.0-0 libgimp2.0

Tại sao và làm thế nào tôi có thể giải quyết nó để tôi có thể sử dụng phiên bản mới nhất thay vì phiên bản tôi có bây giờ?


17
Nói đúng ra, tôi sẽ nói đó là một cảnh báo, không phải là một lỗi.
Kazark

Câu trả lời:


904

Theo một bài viết trên debian-ad dùng.org ,

Nếu các phụ thuộc đã thay đổi trên một trong các gói bạn đã cài đặt để gói mới phải được cài đặt để thực hiện nâng cấp thì nó sẽ được liệt kê là "giữ lại".

Giải pháp thận trọng 1:

Theo câu trả lời của Pablo , bạn có thể chạy sudo apt-get --with-new-pkgs upgradevà nó sẽ cài đặt các gói giữ lại.

Điều này có lợi ích là không đánh dấu các gói giữ lại là "cài đặt thủ công", điều này có thể buộc nhiều người dùng can thiệp hơn (xem bình luận).

Nếu giải pháp của Pablo phù hợp với bạn, vui lòng nâng cấp nó. Nếu không, xin vui lòng bình luận những gì đã đi sai.

Giải pháp thận trọng 2:

Giải pháp thận trọng là chạy sudo apt-get install <list of packages kept back>. Trong hầu hết các trường hợp, điều này sẽ cung cấp cho các gói giữ lại những gì họ cần để nâng cấp thành công.

Giải pháp tích cực:

Một giải pháp tích cực hơn là chạy sudo apt-get dist-upgrade, điều này sẽ buộc phải cài đặt những phụ thuộc mới đó.

Nhưng dist-upgrade có thể khá nguy hiểm . Không giống như nâng cấp, nó có thể loại bỏ các gói để giải quyết các tình huống phụ thuộc phức tạp. Không giống như bạn, APT không phải lúc nào cũng đủ thông minh để biết liệu những bổ sung và xóa này có thể tàn phá hay không.

Vì vậy, nếu bạn thấy mình ở một nơi mà "giải pháp thận trọng" không hoạt động, dist-upgrade có thể hoạt động ... nhưng có lẽ bạn nên tìm hiểu thêm một chút về APT và giải quyết các vấn đề phụ thuộc "bằng tay" bằng cách cài đặt và gỡ bỏ gói trên cơ sở từng trường hợp.

Hãy nghĩ về nó giống như sửa xe ... nếu bạn có thời gian và tiện dụng với cờ lê, bạn sẽ có được sự an tâm bằng cách đọc và tự sửa chữa. Nếu bạn cảm thấy may mắn, bạn có thể thả xe cùng với anh em họ của mình dist-upgradevà hy vọng cô ấy biết công cụ của mình.


180
Vì đây là một nhu cầu trả lời được chấp nhận, nó thực sự cần cập nhật để cảnh báo về việc sử dụng dist-upgradetrên một hệ thống ổn định như nhiều câu trả lời khác dưới đây đã chỉ ra. Cá nhân tôi nghĩ rằng có một câu trả lời đơn giản / an toàn hơn cần được quảng bá: apt-get install <list of pkgs>
Cas

7
Cas, tôi có nên thêm rằng việc chạy nâng cấp trên hệ thống ổn định có nguy hiểm không? Tại sao chính xác là nguy hiểm? (Thành thật mà nói tôi không biết nhiều về điều đó.)
Michael Crenshaw

17
Có một câu trả lời Server Fault giải thích nâng cấp chi tiết hơn một chút. Tôi nghĩ rằng nó chỉ đáng để làm rõ (không nguy hiểm như vậy) rằng nó có thể nâng cấp toàn bộ hệ thống có thể vượt quá những gì người dùng mong đợi / muốn, ví dụ như trong OP, họ đang tự hỏi tại sao gimp lại bị giữ lại.
Cas

19
Xin lưu ý rằng sudo apt-get dist-upgradecũng có thể loại bỏ các gói. Do đó, tốt nhất là luôn luôn kiểm tra danh sách các thay đổi sẽ được thực hiện trước khi đồng ý với chúng, khi chạy sudo apt-get dist-upgrade.
Eliah Kagan

6
@EliahKagan Tôi apt-get upgradecó thể thêm rằng thậm chí có thể loại bỏ các gói không? Nó sẽ luôn luôn làm điều đó khi có một phiên bản xung đột khác. Hãy nghĩ về llvm3.6vs. llvm3.6v5(với "v5" có nghĩa là nó được biên dịch với gcc 5). Cả hai không thể cùng tồn tại , chỉ một trong hai có thể được giữ trên hệ thống. Vì vậy, có dist-upgradethể loại bỏ một số gói là tốt, nhưng nó không chỉ dist-upgradelàm điều đó; trong những trường hợp nhất định, upgradecũng sẽ như vậy.
cú pháp

500

Bất cứ khi nào bạn nhận được từ lệnh apt-get upgrade, tin nhắn

The following packages have been kept back:

sau đó để nâng cấp một hoặc tất cả các gói giữ lại, mà không thực hiện nâng cấp phân phối (đây là điều dist-upgradecần làm, nếu tôi nhớ chính xác) là phát lệnh:

apt-get install <list of packages kept back>

điều này sẽ giải quyết các vấn đề được giữ lại và sẽ yêu cầu cài đặt các gói bổ sung, v.v. như đã được giải thích bằng các câu trả lời khác.


3
Khi các gói được giữ lại theo cách này và tôi thủ công apt-get upgrade <list of packages>, nếu tôi làm lại apt-get upgrade, nó sẽ liệt kê các gói được đề cập là không còn cần thiết và tôi có thể sử dụng apt autoremoveđể loại bỏ chúng, sau đó tôi làm và sau đó apt-get upgradechúng không còn được liệt kê dưới dạng giữ lại ... Rất kỳ lạ. Có suy nghĩ gì không?
cram2208

apt-get installcũng gỡ bỏ các gói khi cần thiết để giải quyết các tình huống phụ thuộc gnarly, hoặc bạn sẽ phải chạy một riêng biệt apt-get removelệnh để thực hiện điều đó một phần của quá trình nâng cấp?
Michael Crenshaw

@ cram2208 Tôi tin rằng đó là hành vi dự kiến. Các gói "được cài đặt tự động và [...] không còn cần thiết" là các phiên bản trước của gói nâng cấp, hiện không còn cần thiết nữa. apt autoremovesau đó loại bỏ các phụ thuộc không sử dụng.
Alex

3
Nếu nâng cấp sẽ yêu cầu gói mới được cài đặt, gói sẽ được "giữ lại". Trước tiên hãy xem xét sử dụng: sudo apt-get --with-new-pkgs upgradesẽ không có tác dụng phụ khiến các gói được đánh dấu là cài đặt thủ công
l --marc l

@ mac9416 đúng vậy.
jarno

174

apt-get dist-upgrade nguy hiểm cho môi trường ổn định,

  1. cài đặt source.list sai và bạn kết thúc với Ubuntu bị hỏng.
  2. bạn có thể nâng cấp toàn bộ ứng dụng lên phiên bản bạn không muốn.

Trường hợp sử dụng: nâng cấp kernel giữ lại, bạn chỉ muốn nâng cấp kernel, không muốn nâng cấp toàn bộ phân phối.

Cách tốt hơn để xử lý gói giữ lại:

sudo aptitude

Nếu bạn đã giữ lại gói, bạn sẽ thấy Gói nâng cấp ở đầu danh sách.

  • Nhấn + vào danh sách đó
  • Lượt g hai lần
  • Trả lời công cụ gỡ lỗi nếu được hỏi
  • Nhấn quay lại để tiếp tục
  • Nhấn Q
  • Bấm có

Gói giữ lại của bạn được cài đặt.


34
apt-get dist-upgradechỉ nguy hiểm nếu bạn có kho lưu trữ xấu trong /etc/apt/sources.list*. Thật tốt khi biết rằng dist-upgradenâng cấp tất cả các gói, nhưng với kho lưu trữ mặc định, điều đó sẽ ổn. Không sử dụng dist-upgradecó thể nguy hiểm, vì bạn có thể bỏ lỡ các bản cập nhật bảo mật.
Flimm

6
apt-get dist-upgradecó thể loại bỏ cũng như thêm các gói, nhưng nó không thực sự nguy hiểm. Bất kỳ lệnh cài đặt gói nào cũng có thể gây ra thiệt hại nghiêm trọng nếu bạn gặp sự cố trong sources.listtệp của mình ! apt-get upgradeLệnh thông thường sẽ cài đặt bất kỳ gói nào từ bất kỳ nguồn phần mềm nào được bật; dist-upgradekhông phải là duy nhất theo cách này. Hơn nữa, sử dụng aptitudeđể thực hiện bất kỳ hoạt động nào, ít nhất là trên amd64, nguy hiểm hơn nhiều so với chạy apt-get dist-upgrade, trong một bản phát hành mà lỗi 831768 không được sửa.
Eliah Kagan

Đối với tôi, thật dễ dàng hơn (máy cục bộ có X chạy) chỉ cần mở synap và buộc nâng cấp gói. Vì một số lý do, nó dường như không xuất hiện ở tất cả những gì bạn mô tả trong synap.
djvs

3
Ngoài rasudo aptitude safe-upgrade
msanford

146

Tại sao bạn không thử câu trả lời Unix SE này :

sudo apt-get --with-new-pkgs upgrade

Điều này cho phép các gói mới được cài đặt. Nó sẽ cho bạn biết những gói nào sẽ được cài đặt và nhắc bạn trước khi thực sự cài đặt.

aptlệnh ( thân thiện thay thế để apt-get) chia sẻ tùy chọn này.

Sử dụng apt install <pkg>thay thế sẽ đánh dấu pkg là "cài đặt thủ công" !! Để đánh dấu lại là "cài đặt tự động" sử dụng apt-mark auto <pkg>(xem thêm tiểu ban showmanual). Thông tin thêm về câu trả lời này .


20
+1 vì nó không có tác dụng phụ khiến các gói được đánh dấu là cài đặt thủ công.
ctrl-alt-delor

1
Lưu ý cho những ai đã từng đọc bình luận của tôi ở trên: không có tác dụng phụ của việc đánh dấu là cài đặt thủ công là một điều tốt. Tôi thích câu trả lời này.
ctrl-alt-delor

1
Đúng. apt-mark auto <pkg>chỉ cần đánh dấu một gói là được cài đặt tự động ( ở đây trang man ).
Pablo A

11
Vì một số lý do sudo apt-get --with-new-pkgs upgradevẫn hiển thị các gói là "giữ lại". Không có thông báo lỗi.
Franklin Yu

2
Chỉ muốn thêm rằng đối với nhiều trường hợp máy chủ debian 9.6 cập nhật, đây là giải pháp an toàn tuyệt đối nhất mà không phá vỡ mọi thứ. Cảm ơn bạn vì điều này, Pablo, vì tôi đã may mắn kiểm tra các tùy chọn khác về môi trường dàn dựng trước đó và có thể quản trị nhiều máy chủ theo tiêu chuẩn bảo mật nhờ vào --with-new-pkgs với kết quả sạch hơn cho quản lý gói trong tương lai. Thực sự, câu trả lời UNIX SE này nên được nâng cấp!
Julius

34

Thông thường có hai lý do bạn có thể thấy thông báo này.

Nếu nâng cấp chương trình (thông qua sudo apt-get upgrade) sẽ khiến các gói được thêm hoặc xóa, thì chương trình sẽ bị giữ lại. Bạn có thể sử dụng sudo apt-get dist-upgradetrong trường hợp này, sau đó sẽ cung cấp để thêm hoặc xóa các chương trình bổ sung.

Điều này là khá phổ biến và thường không phải là một vấn đề. Thỉnh thoảng (đặc biệt là trong Ubuntu alpha), một dist-upgradeđề nghị sẽ loại bỏ rất nhiều chương trình khác, trong trường hợp đó bạn có thể muốn hủy bỏ nó.

Nếu chương trình phụ thuộc vào các gói hoặc phiên bản không có sẵn, thì chương trình sẽ bị giữ lại. Bạn thực sự không thể làm gì ngoài việc chờ đợi trong trường hợp này, vì gói về cơ bản có thể gỡ cài đặt. Điều này có thể xảy ra khi các gói được thêm vào kho không theo thứ tự, khi gói được đổi tên hoặc khi gói ngừng cung cấp gói ảo.


5
Có cách nào để xác định xem gói bị giữ có cần một phụ thuộc không thể được cài đặt hay không nếu nó được giữ vì các gói khác phụ thuộc vào nó. Tôi có nhiều gói được tổ chức và tôi tin rằng cả hai trường hợp này đều có thể áp dụng trên hệ thống của tôi.
Jake

Cảm ơn, lý do thứ hai là vấn đề cho tôi. Thậm chí apt-get dist-upgradetừ chối cài đặt nó. Kiểm tra gói với aptitude cho thấy nó phụ thuộc vào gói không có sẵn. Tôi đoán tôi sẽ phải chờ.
jlh

23

Bạn cũng có thể thử:

sudo aptitude safe-upgrade.

Nó an toàn hơn full-upgrade(ban đầu được đặt tên là nâng cấp) vì "các gói sẽ không bị xóa trừ khi chúng không được sử dụng".

Từ man aptitude:

nâng cấp an toàn

Nâng cấp các gói cài đặt lên phiên bản mới nhất của họ. Các gói đã cài đặt sẽ không bị xóa trừ khi chúng không được sử dụng /.../ Các gói chưa được cài đặt có thể được cài đặt để giải quyết các phụ thuộc trừ khi tùy chọn dòng lệnh --no-new-installs được cung cấp.


21

Nhiều khả năng các gói này bị giữ lại vì cài đặt của chúng sẽ tạo ra sự không nhất quán phụ thuộc. Điều này có thể xảy ra bởi vì bạn đang sử dụng tài liệu lưu trữ dưới sự phát triển tích cực, ppas hoặc vì gương bạn sử dụng không được cập nhật đầy đủ.

Trong trường hợp cuối cùng, chỉ cần chờ đợi, khi các phụ thuộc được giải quyết, nó sẽ được cài đặt vào lần tiếp theo.

Biên tập:

Có một khả năng khác, các gói có thể bị giữ lại nếu có giữ chúng hoặc nếu chúng được ghim.


Bạn dựa vào khả năng nào, mà không biết bất cứ điều gì anh ta đã chạy nâng cấp apt-get hoặc nâng cấp apt-get dist (alt. Tương đương năng khiếu)?
andol

đây là vấn đề xảy ra nhiều nhất trong các câu hỏi và lỗi hỗ trợ
txwikinger

Đã đồng ý. Bạn có lẽ nên chờ đợi và kiểm tra bạn apt_preferences. Điều này thường được gây ra bởi tài liệu lưu trữ phát triển trong đó các phụ thuộc gói và có sẵn đang thay đổi rất nhanh. Đợi họ ổn định và bạn có thể không cần gì dist-upgradecả. Nếu bạn vẫn thích dist-upgrade, hãy xem các gói MỚI sẽ được cài đặt và các gói sẽ bị xóa trước khi tiếp tục.
Umang

Đây là trường hợp của tôi vì tôi nhận được thông báo "giữ lại" bằng cách nâng cấp dist
Postadelmaga

Trong trường hợp sự cố này là do sự lộn xộn với các tùy chọn apt (ghim), tôi thấy việc cài đặt lại các gói được giữ giúp tôi : apt-get install --reinstall <packages>.
tanius

9

Điều này thường là do gói đã thêm phụ thuộc và nâng cấp không muốn thêm nó cho bạn mà không được phép.

Nếu bạn chạy:

sudo apt-get install gimp gimp-data libgegl-0.0-0 libgimp2.0

Sau đó, các phiên bản mới nên được cài đặt cùng với sự phụ thuộc mới của chúng.


Nâng cấp các gói cụ thể (và phụ thuộc của chúng) mà không có cam kết (rủi ro) của việc nâng cấp xa.
John Mee

8

Điều này làm việc cho tôi

sudo aptitude full-upgrade

Thậm chí aptitude upgradelàm việc cho tôi.
Bibhas 14/12/13

Tôi đang sử dụng Ubuntu 14.04và tôi không có aptitudedòng lệnh
ahmed hamdy

apt-get dist-upgradeđã cho tôi cùng một thông điệp, nhưng điều này đã giải quyết nó cho tôi. Tôi đã có một gói đã phá vỡ nâng cấp của gói khác. Tôi không cần cái tôi đã cài đặt, vì vậy aptitude full-upgradeđã cho tôi tùy chọn loại bỏ nó để nó có thể nâng cấp mọi thứ khác.
f.ardelian

6

Tôi đã thấy rằng aptitude thực hiện công việc tốt hơn trong việc nâng cấp các gói nếu các phiên bản chỉ khác nhau một chút. Tôi đã có một tình huống như thế này:

me@compy:/etc/apt$ apt-cache policy gzip
gzip:
  Installed: 1.3.5-15
  Candidate: 1.3.5-15+etch1
  Version table:
     1.3.5-15+etch1 0
        500 http://archive.debian.org etch/main Packages
 *** 1.3.5-15 0
        100 /var/lib/dpkg/status

Điều này làm cho apt-get giữ lại bản cập nhật, nhưng aptitude đã cập nhật nó tốt. Tôi không chắc chắn thuật toán nào được sử dụng để xác định xem gói có nên được cập nhật hay không. Tôi đoán hai người này có cùng một phiên bản, chỉ có một 'vòng loại' khác nhau. Nhưng trong mọi trường hợp, apt-get sẽ không cập nhật nó, nhưng aptitude sẽ.


4

Trong trường hợp của tôi, các gói được giữ lại là những gói liên quan đến tiêu đề linux và kernel. Tôi đã giải quyết vấn đề này bằng cách cố gắng giải quyết vấn đề bằng cách có dấu chấm than màu đỏ trong vùng thông báo và không thể cập nhật các gói.

Để giải quyết nó, tôi không phải sử dụng nâng cấp hay cài đặt apt-get bằng tay .

Những gì tôi đã làm và đã giúp được đơn giản và sạch sẽ :

sudo apt-get update
sudo apt-get autoremove
sudo apt-get autoclean
sudo apt-get upgrade

Tôi phải tự xác nhận cập nhật Grub và cấu hình của nó.

Sau đó, tôi chỉ làm việc với máy tính một lúc và sau đó đối thoại cập nhật tiêu chuẩn đã xuất hiện trở lại cuối cùng bao gồm phần "cơ sở Ubuntu" với kernel và có liên quan. Bản cập nhật được thực hiện mà không gặp rắc rối nào và tôi không thấy bất kỳ gói giữ lại nào nữa.

Ngoài ra, điều rất quan trọng cần lưu ý là các bản cập nhật * buntu bao gồm các bản cập nhật kernel rất nhạy cảm với chế độ ngủ đông - Tôi đã gặp vấn đề này nhiều lần và tôi luôn giải quyết nó bằng cách khởi động lại máy và thực hiện các bước trên.

Vì vậy, có lẽ điều này là vừa đủ?!

(tình huống được mô tả ở đây có liên quan đến Xubfox 15.10 của tôi vào cuối tháng 12 năm 2015)


3

Tôi gặp vấn đề này khi một kernel mới được phát hành. (Có thể do tôi đã bật cập nhật không ổn định.) Tôi đã tìm thấy cách đơn giản nhất để thực hiện cài đặt là thông qua trình cài đặt đồ họa của Ubuntu ( update-manager).


2

Tôi gặp vấn đề này khi sử dụng synap vì nó dường như bị treo, và để thử và sửa lỗi này, tôi đã khởi động lại và thử lại.

Sau đó, tôi phát hiện ra một tin nhắn thông tin như là một phần của gói với một số hướng dẫn sau khi cài đặt cho tôi.

Tôi đã phải nhấn " chi tiết ", và sau đó ' q ' để thoát sau khi đọc tin nhắn, và sau đó mọi việc diễn ra bình thường.


2

Đây có vẻ là cách chính xác để cài đặt lại gói giữ lại:

apt-get install --reinstall libjpeg-progs

Ít nhất điều này làm việc cho tôi khi libjpeg-progsbị kẹt sau khi nâng cấp từ Ubuntu 14.04 lên 16.04. Tôi chắc chắn rằng bạn có thể làm tương tự với bất kỳ ứng dụng giữ lại nào khác, vd gimp.

Nguồn: https://ubuntuforums.org/showthread.php?t= 2321702 & p = 13476183 # post13476183


1
Bạn có thể làm điều đó mà không cần --reinstall, quá.
jarno

Điều thú vị là nó loại bỏ gói libjpeg-turbo-pross.
jarno

1

Trong thực tế, công tắc bạn cần là dselect-upgradecài đặt / loại bỏ các phụ thuộc cho bộ gói cụ thể liên quan.


1

Tôi đã đọc tất cả các bài viết và thấy rằng có nhiều lời giải thích thú vị. Tôi đã thử tất cả chúng nhưng không có kết quả hoàn toàn. Tôi gặp vấn đề với các tiện ích mysql mà tôi không thể nâng cấp. Việc cập nhật đã được đề xuất bởi hệ thống. Vì vậy, tôi muốn chỉ ra một số bước để làm điều đó. Tất nhiên, tôi sẽ lặp lại trong một số khoảnh khắc tất cả các bài viết đã nói ở trên. Đây là sai lầm của tôi, vâng tôi đã tìm thấy nó bởi các bài viết đã tồn tại, nhưng tôi nên làm gì tiếp theo? nhập mô tả hình ảnh ở đây

Bước tiếp theo là:

sudo apt-get --purge remove mysql-utilities

Kết quả chúng ta có thể thấy trong hình ảnh bên dưới. Tôi gỡ bỏ gói và kiểm tra điều này bằng lệnh:

sudo apt-get -f install

Kết quả - Tốt thôi! Sau này tôi cài đặt phiên bản mới của gói này một cách chính xác. nhập mô tả hình ảnh ở đây

Theo cách này, tôi nghĩ có thể giúp nhiều người mới hơn vì có các gói khác chúng ta có thể thực hiện các bước tương tự.

Một lần, tôi xin lỗi, khi tôi lặp lại ở một số nơi bài viết khác.


5
Vui lòng không sử dụng ảnh chụp màn hình cho văn bản đầu cuối, vì điều đó khiến Google không thể tìm kiếm và một số người không thể đọc được. Thay vào đó, dán văn bản đầu cuối vào câu trả lời của bạn, chọn văn bản đó và nhấn {}nút trong trình chỉnh sửa để định dạng chính xác.
Chai T. Rex

@ ChaiT.Rex Cảm ơn bạn đã nhận xét, tôi sẽ đưa ra ý kiến ​​cho tương lai.
Vasyl Lyashkevych

1

Ubuntu 18.04 cung cấp một cú pháp mới hơn, được sắp xếp hợp lý thông qua aptđó có thể được sử dụng thay thế apt-get.

sudo apt full-upgrade

sudo apt upgradeđược sử dụng để cài đặt các bản nâng cấp có sẵn của tất cả các gói hiện được cài đặt trên hệ thống từ các nguồn được định cấu hình qua nguồn.list (5). Các gói mới sẽ được cài đặt nếu được yêu cầu để đáp ứng các phụ thuộc, nhưng các gói hiện tại sẽ không bao giờ bị xóa. Nếu việc nâng cấp cho gói yêu cầu loại bỏ gói đã cài đặt thì việc nâng cấp cho gói này không được thực hiện.

sudo apt full-upgrade thực hiện chức năng nâng cấp nhưng sẽ loại bỏ các gói hiện đang cài đặt nếu điều này là cần thiết để nâng cấp toàn bộ hệ thống.

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.