Làm thế nào để 'apt' quyết định giữ bao nhiêu hạt nhân cũ?


23

Tôi đang quản lý một vài máy chủ cho các dịch vụ cốt lõi (NTP, DNS, v.v.) và tôi nhận thấy rằng một trong những máy chủ dường như giữ 3 hạt nhân mới nhất, thay vì 2 trên các hạt nhân khác:

nul@quark:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@quark:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-51-generic       3.13.0-51.84                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-51-generic 3.13.0-51.84                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

...

nul@dwarf:~$ sudo apt-get autoremove --purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
0 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
nul@dwarf:~$ dpkg -l |grep linux-image
ii  linux-image-3.13.0-52-generic       3.13.0-52.85                     amd64        Linux kernel image for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-3.16.0-37-generic       3.16.0-37.49~14.04.1             amd64        Linux kernel image for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-extra-3.13.0-52-generic 3.13.0-52.85                     amd64        Linux kernel extra modules for version 3.13.0 on 64 bit x86 SMP
ii  linux-image-extra-3.16.0-37-generic 3.16.0-37.49~14.04.1             amd64        Linux kernel extra modules for version 3.16.0 on 64 bit x86 SMP
ii  linux-image-generic                 3.13.0.52.59                     amd64        Generic Linux kernel image
ii  linux-image-generic-lts-utopic      3.16.0.37.29                     amd64        Generic Linux kernel image

Tất cả các máy chủ được duy trì giống hệt nhau, không biết những gì tôi có thể làm, phải là một tham số ở đâu đó nhưng không thể tìm thấy nó!

Hãy nuôi dưỡng sự tò mò của tôi! Cảm ơn bạn

Câu trả lời:


32

Có một tệp được tạo tự động cho apt-getbiết hạt nhân nào sẽ tự động chuyển và cái nào cần giữ.
Các tập tin cho biết apt-getchúng là hạt nhân /etc/apt/apt.conf.d/01autoremove-kernelsnào được tạo ra /etc/kernel/postinst.d/apt-auto-removal.

Thông thường những gì xảy ra là khi bạn nhận được thông tin cập nhật kernel, khi những thay đổi phiên bản hạt nhân, nói từ 3.13đến 3.16, /etc/apt/apt.conf.d/01autoremove-kernelssau đó sẽ được cập nhật để giữ cho các 3.16*hạt nhân và sau đó được thiết lập để loại bỏ tất cả các 3.13hạt nhân trừ khi xác định bởi các kịch bản tạo để không bị loại bỏ.

Từ apt-auto-removalkịch bản:

# Tác giả: Steve Langasek 
#
# Đánh dấu là không tự động chạy các gói kernel đó là:
# - phiên bản hiện đang khởi động
# - phiên bản kernel mà chúng tôi đã được gọi cho
# - phiên bản kernel mới nhất (được xác định bằng cách sử dụng các quy tắc được sao chép từ grub
# gói để quyết định khởi động kernel nào)
# - phiên bản kernel mới nhất thứ hai, nếu phiên bản kernel đã khởi động là
# đã là phiên bản mới nhất và tập lệnh này được gọi cho cùng một phiên bản,
# để đảm bảo dự phòng vẫn có sẵn trong trường hợp cài đặt mới
# kernel tại ABI này không khởi động được
# Trong trường hợp phổ biến, điều này dẫn đến chính xác hai hạt nhân được lưu, nhưng nó có thể
# kết quả trong ba hạt nhân được lưu. Tốt hơn hết là nên đứng về phía
# tiết kiệm quá nhiều hạt nhân hơn là tiết kiệm quá ít.
#
# Chúng tôi tạo danh sách này và lưu nó vào /etc/apt/apt.conf.d thay vì đánh dấu
# gói trong cơ sở dữ liệu vì điều này chạy từ tập lệnh postinst và apt
# sẽ ghi đè db khi thoát.

Tuy nhiên, điều này đôi khi sẽ không đánh dấu chúng để tự động xóa vì một số mã đã thay đổi qua các phiên bản để ngăn điều này xảy ra.

Nếu bạn muốn đánh dấu các hạt nhân trước đó autoremovengoại trừ các hạt nhân cần thiết dựa trên các tập lệnh, hãy chạy lệnh sau từ cửa sổ đầu cuối:

sudo apt-mark auto ^linux-image-

Sau đó, khi bạn chạy apt-get autoremovelệnh, chỉ những cái cũ và không còn cần thiết có thể được gỡ bỏ. Tôi đã đưa ra các ví dụ dưới đây:

Cái đầu tiên này hiển thị tất cả các kernel trên hệ thống trừ kernel đang chạy.

root @ terrance-Linux: / home / share # dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\([ ^ 0-9] \ + \) / \ 1 / ")" '/ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
tiêu đề linux-3.16.0-34
linux-headers-3.16.0-34-generic
tiêu đề linux-3.16.0-36
linux-headers-3.16.0-36-generic
tiêu đề linux-3.16.0-37
linux-headers-3.16.0-37-generic
tiêu đề linux-4.0.0-040000
linux-headers-4.0.0-040000-generic
linux-image-3.16.0-34-generic
linux-image-3.16.0-36-generic
linux-image-3.16.0-37-generic
linux-image-4.0.0-040000-chung
linux-image-Extra-3.16.0-34-generic
linux-image-Extra-3.16.0-36-generic
linux-image-Extra-3.16.0-37-generic

Cái này cho thấy kernel đang chạy.

terrance @ terrance-Linux: ~ $ uname -r
4.0.1-040001-chung
terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
[sudo] mật khẩu cho lãnh thổ: 
Đọc danh sách gói ... Xong
Xây dựng cây phụ thuộc       
Đọc thông tin trạng thái ... Xong
0 được nâng cấp, 0 mới cài đặt, 0 để loại bỏ và 0 không được nâng cấp.
terrance @ terrance-Linux: ~ $ sudo apt-mark auto ^ linux-image-
linux-image-Extra-3.16.0-33-generic không thể được đánh dấu vì nó không được cài đặt.
linux-image-Extra-3.13.0-27-generic không thể được đánh dấu vì nó chưa được cài đặt.
linux-image-3.13.0-44-lowlatency không thể được đánh dấu vì nó không được cài đặt.
linux-image-3.13.0-27-generic không thể được đánh dấu vì nó không được cài đặt.
linux-image-3.16.0-31-lowlatency không thể được đánh dấu vì nó không được cài đặt.
linux-image-3.16.0-36-generic được cài đặt tự động.
linux-image-lowlatency-lts-utopic không thể được đánh dấu vì nó không được cài đặt.
linux-image-Extra-3.13.0-36-generic không thể được đánh dấu vì nó chưa được cài đặt.
linux-image-3.13.0-36-generic không thể được đánh dấu vì nó không được cài đặt.
linux-image-4.0.0-040000-generic được cài đặt tự động.
linux-image-Extra-3.13.0-45-generic không thể được đánh dấu vì nó chưa được cài đặt.
linux-image-3.16.0-25-generic không thể được đánh dấu vì nó không được cài đặt.

LƯU Ý: Cái trên quá dài để liệt kê, vì vậy tôi đã cắt ngắn một chút.

terrance @ terrance-Linux: ~ $ sudo apt-get autoremove
Đọc danh sách gói ... Xong
Xây dựng cây phụ thuộc       
Đọc thông tin trạng thái ... Xong
Các gói sau sẽ được KHAI THÁC:
  linux-image-3.16.0-34-linux-image-3.16.0-36-generic
  linux-image-4.0.0-040000-chung linux-image-Extra-3.16.0-34-generic
  linux-image-Extra-3.16.0-36-generic
0 nâng cấp, 0 mới cài đặt, 5 để loại bỏ và 0 không nâng cấp.
Sau thao tác này, dung lượng đĩa 613 MB sẽ được giải phóng.
Bạn có muốn tiếp tục? [Y / n]

Vì vậy, sau khi chạy các lệnh đó, bạn có thể thấy rằng bây giờ tôi có thể tự động xóa tất cả kernel cũ nhưng kernel hiện tại (4.0.1-040001-generic) và mới nhất tiếp theo (3.16.0-37-generic).

Hy vọng điều này sẽ giúp.


Ubuntu không tự động xóa theo mặc định phải không?. Chúng tôi có tùy chọn nhưng vẫn (vẫn) được coi là không thể quyết định hạt nhân "không mong muốn" là gì (trên hệ điều hành khác "không mong muốn" bằng với "không sử dụng").
Rinzwind

Được. Tôi đã đọc sai bài viết của bạn trên bit đó ;-)
Rinzwind

1
@Terrance tôi đã cố gắng để vượt qua sudo apt-mark auto ^linux-image-tiếp theo sudo apt-get autoremove --purgenhưng không có kết quả; tuy nhiên, một chút dist-upgradesửa đổi 2 hạt nhân (3.13.0-52 và 3.16.0.37) và sau đây autoremoveđã loại bỏ 3.13.0-51 ...
ionreflex

1
@ionreflex Rất vui vì bạn đã tìm thấy điều đó. Không phải mọi câu trả lời đều hoàn hảo, và nó có thể không hiệu quả với tất cả mọi người. Nhưng tôi thấy thật tuyệt khi những người như mình có thể khắc phục một chút sự cố và tìm ra cách để loại bỏ chúng. Tôi nghĩ rằng dist-upgradebạn đã khởi động cái /etc/kernel/postinst.d/apt-auto-removalmà sau đó sửa đổi và /etc/apt/apt.conf.d/01autoremove-kernelssau đó nói với nó cái nào cần giữ.
Terrance

1
@Terrance Khá chắc chắn tôi đã làm một điều dist-upgradetrước đây, nhưng có lẽ thực tế là các hạt nhân đã được nâng cấp sáng nay đã lừa ... dù sao, chúc mừng, và cảm ơn bạn vì câu trả lời của bạn, tôi đã học được rất nhiều thông qua nó!
ionreflex
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.