Tại sao không apt-get autoremove loại bỏ các hạt nhân cũ của tôi?


53

Phân vùng khởi động của tôi nằm trên ổ SSD, vì vậy nó không có chỗ cho hơn 8 phiên bản kernel đã cài đặt và cuối cùng một số cập nhật kernel sẽ không cài đặt được vì phân vùng khởi động của tôi có đầy đủ các phiên bản cũ. Có rất nhiều câu hỏi về cách loại bỏ các phiên bản cũ (thậm chí làm thế nào để tự động hóa quy trình), nhưng câu hỏi của tôi chỉ đơn giản là: Tại sao không apt-get autoremovetự động phát hiện và xóa chúng, và có cách nào để tôi làm như vậy không? Ý tôi là, apt-getcái gì đã cài đặt chúng, vì vậy nó biết về chúng, vậy tại sao nó lại chọn để lại tất cả các phiên bản cũ?



1
Autoremove sẽ loại bỏ các hạt nhân cũ trong hầu hết các trường hợp. Kernels tích lũy vì hệ thống không tự động chạy tự động theo mặc định. Đó là một thiết lập trong các nâng cấp không giám sát và có thể được thay đổi. Autoremove không thể loại bỏ các nhân cũ khi các hành động apt được xếp hàng trước đó (như cài đặt kernel mới) không thành công (do không đủ dung lượng). Xem bug.launchpad.net/bugs/1357093 để biết bản vá cho các nâng cấp không giám sát sẽ tự động loại bỏ các hạt nhân cũ.
dùng535733

Câu trả lời:


36

Để trả lời tại sao, hãy tham khảo tệp /etc/apt/apt.conf.d/01autoremove-kernels

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

Như bạn có thể thấy, apt được yêu cầu không bao giờ tự động di chuyển các hạt nhân, như được nói bởi một tệp (script) khác , /etc/kernel/postinst.d/apt-auto-removal. Và đây là:

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

Nếu bạn cài đặt thủ công 2 hạt nhân đã chọn, tức là hạt nhân đầu tiên và hiện tại, thì apt-autoremove sẽ chỉ xóa các phiên bản cũ hơn mà bạn không cài đặt thủ công, vì vậy bạn sẽ luôn có 2 tùy chọn đó cộng với bất kỳ tùy chọn mới nhất nào.

Cập nhật:

Trong /etc/kernel/postinst.d/apt-auto-removalđó có phần này:

if [ "$latest_version" != "$installed_version" ] \
   || [ "$latest_version" != "$running_version" ] \
   || [ "$installed_version" != "$running_version" ]
then
        # We have at least two kernels that we have reason to think the
        # user wants, so don't save the second-newest version.
        previous_version=
fi

Vì vậy, nếu bạn so sánh đầu ra của 01autoremove-kernelstệp và uname -rbạn sẽ nhận ra rằng hạt nhân hiện đang chạy và gần đây nhất trước nó, sẽ không bao giờ bị xóa bởi tập lệnh đó. Hóa ra là một tập tin khác /etc/apt/apt.conf.d/01autoremove, nơi có các dòng:

    APT
    {
      NeverAutoRemove
      {
            "^firmware-linux.*";
            "^linux-firmware$";
      };
  VersionedKernelPackages
  {
        # linux kernels
        "linux-image";
        "linux-headers";
        "linux-image-extra";
        "linux-signed-image";
        # kfreebsd kernels
        "kfreebsd-image";
        "kfreebsd-headers";
        # hurd kernels
        "gnumach-image";
        # (out-of-tree) modules
        ".*-modules";
        ".*-kernel";
        "linux-backports-modules-.*";
        # tools
        "linux-tools";
  };

Vì vậy, bạn có thể nhận xét những điều này và nó sẽ cho phép bạn tự động loại bỏ các hạt nhân bằng apt-autoremove, mặc dù vậy, hãy nhớ - làm điều này có nguy cơ của riêng bạn


1
Rất thú vị! My /etc/apt/apt.conf.d/01autoremove-kernelscó nhiều dòng, nhưng chỉ có hai phiên bản trong số chúng: 3.13.0. {39,43}. Nhưng dpkg -l linux-*liệt kê bốn phiên bản, 3.13.0. {39,40,41,43}, vì vậy một cái gì đó khác hơn /etc/apt/apt.conf.d/01autoremove-kernelslà giữ những phiên bản giữa đó, phải không?
BlueBomber

1
TL: DR: 01autoremovelà tệp bạn muốn, 01autoremove-kernelscó lẽ chỉ là một sự bảo vệ, do đó apt không xóa kernel hiện được cài đặt và gần đây nhất (chỉ trong trường hợp mới nhất là bắt vít)
Sergiy Kolodyazhnyy

1
Trừ khi tôi đọc sai 01autoremove, nó chỉ bảo vệ chống lại việc tự động loại bỏ các gói phụ thuộc linux-image-extra. Thay đổi nó sẽ không ảnh hưởng đến việc có được tự động hay không linux-image-3.16.0-31-generic. Không có mẫu nào trong đó khớp với tên gói mà chúng tôi muốn tự động xóa.
Peter Cordes

1
@PeterCordes Đừng xóa hoặc nhận xét dòng trong /etc/apt/apt.conf.d/01autoremove. Điều đó không giúp bạn trong việc tự động chạy các gói kernel đã được phiên bản cũ, nhưng có thể có các hiệu ứng không mong muốn. Tệp không bảo vệ khỏi chế độ tự động chạy linux-image-extranhưng các gói khớp với các biểu thức thông thường trong NeverAutoRemovephần.
jarno

2
@BlueBomber, lý do tại sao apt-get autoremovekhông loại bỏ các hạt nhân không được liệt kê trong /etc/apt/apt.conf.d/01autoremove-kernelsđó là những hạt nhân đó được đánh dấu là cài đặt thủ công; thấy tôi trả lời .
jarno

8

Đối với tôi, nó đã giúp cài đặt Ubuntu (X) mới nhất (15.10). Trong các bản phát hành trước đó, các gói kernel có thể được đánh dấu là đã cài đặt thủ công, ít nhất, nếu được cài đặt bằng cách sử dụng Trình cập nhật phần mềm, do đó sudo apt-get autoremove --purgekhông thể xóa chúng. Có các báo cáo lỗi liên quan đến vấn đề: Bug # 1175637 , Bug # 1439469

Trong bản phát hành trước đó, bạn có thể thử đánh dấu các gói kernel được cài đặt tự động sudo apt-mark auto $(apt-mark showmanual | grep -E "^linux-([[:alpha:]]+-)+[[:digit:].]+-[^-]+(|-.+)$")và chạy sudo apt-get autoremove --purgesau đó để xem, nếu nó tạo ra sự khác biệt. Lệnh vẫn không nên xóa các gói hạt nhân được hiển thị trong /etc/apt/apt.conf.d/01autoremove-kernels, nhưng an toàn nhất là chạy apt-get autoremovevới --dry-runtùy chọn trước.


Ồ, lệnh autoremove có xu hướng loại bỏ quá nhiều hạt nhân, xem Bug # 1440608
jarno

1
Tôi apt-markđã lừa tôi, ước gì tôi có thể nâng cấp 10 lần: P
Mike Gleason jr Couturier
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.