Làm cách nào để xóa phiên bản kernel cũ để dọn sạch menu khởi động?


701

Mỗi lần tôi cài đặt kernel Linux mới, nó sẽ bị bỏ lại trong grub_config, làm cho menu boot dài hơn mỗi lần.

Tôi biết tôi có thể tự tìm kiếm thông qua các gói đã cài đặt và xóa chúng.

Ubuntu có cung cấp bất kỳ cách nào dễ dàng hơn để dọn sạch chúng hoặc ngăn chúng hiển thị trong danh sách khởi động không?


10
Có một lệnh ub Ubuntu gọi là purge-old-kernel để thực hiện công việc. Xem câu trả lời của tôi để biết thêm thông tin.
jarno

29
sudo apt-get autoremovenên thực hiện thủ thuật trên Ubuntu 14.04+
hobs

1
Sự tích lũy của các hạt nhân cũ là một lỗi, đang được sửa chữa: bug.launchpad.net/bugs/1357093 . Khi sửa lỗi được phát hành, các hạt nhân cũ hơn sẽ tự động di chuyển theo mặc định.
dùng535733

1
@hobs Lệnh không thực hiện thủ thuật cho tôi trong Ubuntu Studio 14.04, nếu các hạt nhân chưa được cài đặt tự động, nhưng bởi Trình cập nhật phần mềm.
jarno

1
Tôi tiếp tục quay lại trang này ... nhận xét của @hobs chỉ hoạt động nếu hạt nhân của bạn được cài đặt tự động - tuy nhiên bạn thực hiện sudo apt-get autoremove --purge câu trả lời bằng cách làm theo apt-marklời khuyên trên https
//help.ub Ubuntu.com/community/RemoveOldKernels

Câu trả lời:


602

16.04 và các phiên bản mới hơn của Ubuntu

sudo apt autoremove

Lệnh này sẽ loại bỏ các gói được cài đặt tự động để giải quyết sự phụ thuộc, nhưng giờ đây không còn phụ thuộc vào nữa. Điều này bao gồm các phiên bản cũ của linux-headers-*linux-image-*. (Nó cũng thông minh về quy trình này, để lại một phiên bản dự phòng của hạt nhân như một dự phòng!)

11.10 và các phiên bản mới hơn của Ubuntu

GRUB2 và hiển thị tất cả các hạt nhân của nó

Các phiên bản mới nhất của Grub2 được cài đặt trong Ubuntu sẽ tự động hiển thị kernel mới nhất và ẩn các kernel cũ hơn mà bạn có thể đã cài đặt.

GNU GRUB

Nếu bạn không thấy grub của mình - thì hãy nhớ nhấn Shifttrong khi khởi động.

Như bạn có thể thấy, chỉ có kernel mới nhất được hiển thị.

Nếu bạn chọn tùy chọn hiển thị (nhấn Enter) thì tất cả các nhân cũ sẽ hiển thị và có sẵn để khởi động từ đó.

GNU GRUB Phiên bản trước

Làm thế nào để xóa vĩnh viễn hạt nhân cũ

Khởi động đầu tiên với kernel có sẵn mới nhất.

Có một số cách để xóa hạt nhân cũ. Cá nhân, tôi sẽ không chạm vào Máy tính cá nhân vì điều này được thừa nhận là phá vỡ máy tính của bạn với các đề xuất của nó.

khớp thần kinh

Một thay thế là Synaptic ( sudo apt install synaptic)

tìm kiếm hình ảnh linux , nhấp chuột phải vào kernel và chọn loại bỏ hoàn toàn và cuối cùng nhấp vào nút Áp dụng để xóa kernel.

Quản lý gói Synaptic

Lặp lại tìm kiếm nhưng lần này cho tiêu đề linux - bạn có thể xóa các tiêu đề được liên kết cho hình ảnh hạt nhân đã chọn trước đó.

Synaptic mặc dù sẽ không cố gắng xác minh những gì bạn đang cố xóa ... bạn có thể vô tình xóa kernel mới nhất của mình - hoặc thậm chí xóa tất cả các kernel của bạn thông qua công cụ này để lại cho bạn một Ubuntu không thể khởi động được !

Hãy nhớ kiểm tra loại kernel nào bạn đang sử dụng:

uname -r

Kết quả sẽ tương tự như:

Thiết bị đầu cuối <uname -r>

Ghi nhớ kết quả và số - đảm bảo bạn không xóa hình ảnh hoặc tiêu đề tương ứng.

sự giới thiệu

Đề nghị của tôi là giữ ít nhất hai hoặc tốt nhất là ba hạt nhân kể cả mới nhất. Lý do cho khuyến nghị là bạn sẽ có ít nhất một / hai hạt nhân khác để khởi động cùng, nếu vì lý do nào đó, hạt nhân mới nhất mà bạn không thể khởi động hoặc giới thiệu khả năng hồi quy như không dây bị hỏng.


3
Loại bỏ các gói "linux-image *" cũ bằng synaptic, cũng hoạt động tốt với 10.04. (Tôi đề cập đến nó bởi vì tiêu đề cho thấy nó chỉ có thể dành cho 11.10 trở lên)
mivk

4
việc -ychuyển đổi ở cuối apt-getdòng là cần thiết, nếu không thì apt-get chỉ yêu cầu xác nhận và vì đầu vào là một đường ống, nên nó chỉ hủy bỏ. Vì vậy, nó sẽ kết thúc vào:| xargs sudo apt-get purge -y
Josh

37
Xóa khoảng 20 phiên bản cũ linux-imagelinux-headersgiải phóng 4,5 GB dung lượng trên máy của tôi.
Andrew Mao

16
Phương pháp này hoạt động tốt, nhưng việc xóa mọi kernel tái tạo quá mức grub.cfg, sẽ mất thời gian. Có cách nào để vô hiệu hóa điều này để xóa hàng loạt, sau đó tạo lại nó một lần không?
khoảng cách

15
Tôi thứ hai câu hỏi từ @spacesiver - đây là một quá trình chậm điên rồ khi bạn có 38 hạt nhân không cần thiết, vì mỗi cái được gỡ cài đặt, nó sẽ chuyển qua tất cả những cái còn lại trong khi tạo ra một grub.cfg mới. Đó là những gì chúng ta gọi là thao tác N ^ 2 - nó xử lý kernel khoảng (38 ^ 2/2) = 722 lần và rất chậm. Chắc chắn Ubuntu có thể tìm ra thứ gì đó tốt hơn ....
nealmcb

384

Đầu tiên, khởi động lại Hệ thống của bạn để chắc chắn rằng nó đang sử dụng kernel mới nhất. Sau đó mở terminal và kiểm tra kernel hiện tại của bạn:

uname -r 

ĐỪNG BỎ L K KELEL NÀY!

Tiếp theo, gõ lệnh bên dưới để xem / liệt kê tất cả các hạt nhân đã cài đặt trên hệ thống của bạn.

dpkg --list 'linux-image-*'

Tìm tất cả các hạt nhân thấp hơn hạt nhân hiện tại của bạn. Khi bạn biết loại bỏ kernel nào, hãy tiếp tục bên dưới để loại bỏ nó. Chạy các lệnh dưới đây để loại bỏ kernel bạn đã chọn.

sudo apt-get purge linux-image-x.x.x-x-generic 

Cuối cùng, chạy các lệnh bên dưới để cập nhật grub2

sudo update-grub2 

Khởi động lại hệ thống của bạn.


34
Khi thực hiện việc này trong 10.04 và 12.04, tôi thấy update-grub được tự động chạy trong quá trình thanh lọc.
Aidan

93
mở rộng cú đúp của bash có thể được sử dụng, ví dụ sudo apt-get purge linux-image-3.2.0-3{0..5}-generic(loại bỏ 30,31, .., 35)
ajo

12
Không cần phải khởi động lại hệ thống sau đó. Trên thực tế, bạn nên khởi động lại hệ thống trước khi thực hiện các bước này, để đảm bảo bạn đang sử dụng phiên bản kernel mới nhất mà bạn có thể vừa tải xuống và cài đặt (bạn đã cập nhật apt-get && apt-get nâng cấp trước đó, phải không ??)
Ricket

4
Bạn cũng có thể muốn gỡ cài đặt các linux-signed-imagegói có thể được cài đặt trong các hệ thống UEFI: sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-genericsẽ xóa 12, 14 và 24
devius

1
@jarno Tôi không biết liệu tôi có sử dụng kernel đã ký hay không, nhưng uname -rkhông có bất kỳ signedchuỗi nào trên hệ thống của tôi. Tôi dường như đã cài đặt một hình ảnh đã ký và đầu ra của lslệnh đó là : /boot/vmlinuz-3.19.0-16-generic.efi.signed.
devius

283

Lớp lót của tôi để loại bỏ các hạt nhân cũ (điều này cũng giải phóng không gian đĩa)

dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p' | xargs sudo apt-get -y purge

Giải thích (hãy nhớ, |sử dụng đầu ra của lệnh trước làm đầu vào tiếp theo)

  • dpkg --list liệt kê tất cả các gói đã cài đặt
  • grep linux-image tìm kiếm các hình ảnh linux đã cài đặt
  • awk '{ print $2 }' chỉ xuất ra cột thứ 2 (là tên gói)
  • sort -V sắp xếp các mục theo thứ tự số phiên bản
  • sed -n '/'`uname -r`'/q;p' in các dòng trước kernel hiện tại
  • xargs sudo apt-get -y purge thanh trừng các hạt tìm thấy

Hủy kết nối sedlời mời:

  • -nbảo sedhãy im lặng
  • `uname -r` xuất ra bản phát hành kernel đã cài đặt hiện tại - chúng tôi đưa nó vào backticks để đầu ra được bao gồm như một phần của lệnh (bạn cũng có thể thấy điều này như là $(uname -r)
  • /something/qnói dừng khi bạn khớp với 'cái gì đó' (trong trường hợp này, thứ gì đó là đầu ra của uname -r) - /bao quanh một biểu thức chính quy
  • p là in
  • lệnh ;này là lệnh separtor, vì vậy hãy /something/q;pnói thoát khi bạn khớp với thứ gì đó, in khác

hoàn toàn, sed -n '/'`uname -r`'/q;p'là in các dòng cho đến khi nó khớp với tên kernel hiện tại.

Nếu bạn bị hoang tưởng (như tôi), bạn có thể tạo phần cuối cùng xargs echo sudo apt-get -y purgeđể lệnh thanh lọc hạt nhân cũ được in, sau đó bạn có thể kiểm tra xem có gì bất ngờ được đưa vào trước khi bạn chạy nó không.


Phiên bản sửa đổi để loại bỏ các tiêu đề:

dpkg --list | grep 'linux-image' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge
dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo apt-get -y purge

Lưu ý: sedlời mời được sửa đổi. "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"chỉ trích xuất phiên bản (ví dụ: "3.2.0-44"), không có "-generic" hoặc tương tự từuname -r


Phiên bản tất cả trong một để xóa hình ảnh và tiêu đề (kết hợp hai phiên bản trên):

echo $(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -V | sed -n '/'`uname -r`'/q;p') $(dpkg --list | grep linux-headers | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p') | xargs sudo apt-get -y purge

1
Lưu ý rằng sẽ hơi nguy hiểm khi khớp phiên bản kernel hiện tại như biểu thức chính quy như sau: Dots khớp với bất kỳ ký tự nào và 3.1.2-23 khớp với 3.1.2-2 (hoặc là cách khác). Xem thêm câu trả lời của tôi .
jarno

19
Đây là phiên bản tất cả trong một được điều chỉnh: sudo apt-get purge $(for tag in "linux-image" "linux-headers"; do dpkg-query -W -f'${Package}\n' "$tag-[0-9]*.[0-9]*.[0-9]*" | sort -V | awk 'index($0,c){exit} //' c=$(uname -r | cut -d- -f1,2); done)Xem thêm câu trả lời của tôi .
jarno

1
@jarno đã giúp tôi mở rộng rất nhiều ... Kudos cho một lớp lót của bạn
Clain Dsilva

5
Do sự phụ thuộc không được đáp ứng, tôi cần phải sử dụng nó dkpg -Pthay thế. Đây là phiên bản đầy đủ:dpkg --list | grep 'linux-headers' | awk '{ print $2 }' | sort -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"'/q;p' | xargs sudo dpkg -P
Sebastian Sastre

3
KHÔNG LÀM ĐƯỢC NÀY! "Oneliner đó có vẻ hơi nguy hiểm, nhưng chắc chắn 220 người chơi không thể sai!" Tôi nghĩ thầm và dán một cách mù quáng. Khởi động lại, thẳng đến GRUB. Lệnh đó đã xóa sạch tất cả các hạt nhân của tôi, kể cả cái tôi đang sử dụng. Có lẽ tôi đang chạy kernel thời gian thực, thậm chí không thể nhớ được. Hiện đang tìm kiếm một chiếc USB để cài đặt Ubuntu Live CD vào ngày hôm nay :(
Andreas Jansson

60

Ubuntu 16.04 trở lên:

$ sudo apt autoremove
...
The following packages will be REMOVED:
  linux-headers-4.4.0-57 linux-headers-4.4.0-57-generic linux-image-4.4.0-57-generic linux-image-extra-4.4.0-57-generic linux-tools-4.4.0-57 linux-tools-4.4.0-57-generic

Ubuntu 15.10 trở xuống:

Tôi thấy đây là cách dễ nhất và nhanh nhất. Nó giữ kernel mới nhất cũng như hai nhân nữa:

sudo apt-get install bikeshed
sudo purge-old-kernels

Để thay đổi số lượng hạt nhân bổ sung được giữ:

sudo purge-old-kernels --keep 3

1
Lệnh đó là một tập lệnh shell, vị trí mà bạn có thể tìm thấy which purge-old-kernels.
jarno

Vui vì họ đã làm điều này dễ dàng hơn nhiều trong 16.04! Hy vọng câu trả lời này sẽ tiếp tục phát triển ...
Toby J

Trên Ubuntu 16.04 tôi purge-old-kernelskhông có gói bikeshed ( công cụ hữu ích ngẫu nhiên chưa có nhà cố định ) hoặc bất kỳ gói cụ thể nào. Không sử dụng apt-get -ytùy chọn, giống như nhắm mắt và hy vọng mọi thứ sẽ ổn. Ngoài ra, đây là cách autoremove quyết định giữ bao nhiêu hạt nhân cũ.
Pablo A

2
Trong 16.04 hạt nhân thanh lọc cũ được cung cấp bởi gói byobu (gợi ý apt-file search purge-old-kernels:). Đồng ý apt-get -y, tôi sẽ xóa nó.
bmaupin

1
@Dan vì tôi không sử dụng các phiên bản không phải LTS nên tôi không chắc chắn chính xác khi nào nó bắt đầu. Nhưng tôi có thể nói chắc chắn rằng sudo apt-get autoremovekhông loại bỏ hạt nhân trong 14.04. Hãy cập nhật câu trả lời với phiên bản cụ thể nếu bạn biết nó là gì!
bmaupin

43

Xóa các mục trong Grub 2 Các mục nên được xóa bằng cách chỉnh sửa hoặc xóa các tệp trong thư mục /etc/grub.d. Tệp /boot/grub/grub.cfg ở chế độ chỉ đọc và thường không yêu cầu chỉnh sửa.

Quá nhiều hạt nhân?

  • Nếu bạn không chắc chắn về kernel mà bạn hiện đang sử dụng, trong loại thiết bị đầu cuối uname -r .

  • Các hạt nhân được loại bỏ thông qua APT (Synaptic, "apt-get remove", v.v.) sẽ tự động cập nhật grub.cfg và không yêu cầu hành động của người dùng.

  • Một công cụ tuyệt vời để loại bỏ các hạt nhân (và các mục menu) là Ubuntu-Tweak, một ứng dụng GUI an toàn và dễ sử dụng.

  • Cài đặt tinh chỉnh Ubuntu

  • Ubuntu-Tweak sẽ khả dụng trong Ứng dụng> Công cụ hệ thống.

Loại bỏ các mục nhân cũ hơn

  • Chọn "Gói dọn dẹp" ở bên trái và "Hạt nhân sạch" từ bảng bên phải.

  • Nhấn nút "Mở khóa" ở phía dưới bên phải, nhập mật khẩu của bạn.

  • Chọn từ danh sách được hiển thị các hình ảnh hạt nhân và tiêu đề bạn muốn loại bỏ. Hạt nhân đang sử dụng không được liệt kê.

  • Nhấn nút "Dọn dẹp" ở phía dưới bên phải để xóa các hình ảnh và tiêu đề hạt nhân đã chọn.

Xóa hệ điều hành khỏi menu Grub

  • Các hệ điều hành khác đã bị xóa khỏi máy tính cũng sẽ bị xóa khỏi menu sau khi "update-grub" được chạy dưới quyền root.

  • Các mục menu được đặt trên menu Grub2 theo các tập lệnh. Nếu bạn không muốn các Hệ điều hành khác được nhập vào menu, hãy tắt /etc/grub.d/30_osprober

  • Chạy lệnh này để ngăn tập lệnh chạy
    sudo chmod -x /etc/grub.d/30_os-prober

  • DISABLE_30_OS-PROBER = 'true' trong / etc / default / grub

Xóa Memtest86 + khỏi Menu Grub
sudo chmod -x /etc/grub.d/20_memtest86+

  • Chạy lệnh update-grub để cho phép các thay đổi được kết hợp trong grub.cfg

Nguồn

Lưu ý: Sau khi cập nhật kernel, một mục nhập mới được thêm vào menu GRUB. Bạn có thể xóa mục cũ hơn nếu muốn. Tuy nhiên, hầu hết người dùng có kinh nghiệm sẽ khuyên bạn giữ ít nhất một mục dự phòng trong trường hợp có sự cố với nâng cấp và bạn cần phải khởi động một phiên bản kernel cũ hơn cho mục đích khắc phục sự cố.

Cách khác để loại bỏ các mục Kernel (trước 10.04)

cho GRUB chứ không phải GRUB2

giám đốc khởi nghiệp Cài đặt startupmanager

Bạn có thể tìm thấy nó trong Hệ thống >> Quản trị >> văn bản thay thế
văn bản thay thế
Bạn thấy trong ảnh chụp màn hình thứ hai, bạn có thể chọn bao nhiêu hạt nhân để hiển thị? Tôi thường chỉ giữ nó trên 1, nhưng khi tôi nâng cấp kernel, tôi luôn thay đổi nó thành 2 trước khi khởi động lại để tôi có thể chọn kernel cũ hơn nếu kernel mới có vấn đề với phần cứng của tôi. Khi tôi biết kernel mới hoạt động tốt, tôi thay đổi lại thành 1.


2
Trên thực tế, startupmanager cho tôi một cửa sổ như thế này trên Ubuntu 10.04, thay vào đó, nó chỉ đưa ra một cửa sổ có hai tab -> Tùy chọn khởi động và Nâng cao .. và trong nâng cao, dint có tùy chọn để giới hạn số lượng hạt nhân. Vì vậy, vui lòng cập nhật câu trả lời cho Ubuntu 10.04. (Và đó là lý do tại sao tôi đã bỏ phiếu này ..)
Sen

có ai biết "số lượng hạt nhân cần giữ" có thể được định nghĩa như thế nào trên một máy chưa cài đặt GUI (máy chủ) không?
sylvainulg

startupmanager đã lỗi thời. Xem tùy chỉnh grup
muhasturk

39

Hoàn toàn là dòng lệnh, điều này sẽ loại bỏ tất cả trừ hiện tại và thứ hai hiện tại (thông qua "-2" trong lệnh head bên dưới):

OLD=$(ls -tr /boot/vmlinuz-* | head -n -2 | cut -d- -f2- |
    awk '{print "linux-image-" $0 " linux-headers-" $0}' )
if [ -n "$OLD" ]; then
    apt-get -qy remove --purge $OLD
fi
apt-get -qy autoremove --purge

9
một lớp lót từ đó :dpkg -l linux-* | awk '/^ii/{ print $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge
Dmitry Verkhoturov

@DmitryPaskal, Bạn nên thêm câu này dưới dạng câu trả lời mới.
saji89

10
@DmitryPaskal Như mọi khi, đừng chỉ sao chép-dán chúng mà không hiểu chúng. Trên máy của tôi, lớp lót này cũng không khớp linux-libc-dev:amd64.
jamesadney

1
@Kees Cook, không nên tranh luận awk chỉ được bao quanh bởi dấu ngoặc đơn? Nếu mục đích của bạn là thêm "linux-image-" vào các đường ống, điều này dường như chỉ hoạt động nếu bạn sử dụng awk '{print "linux-image-" $0}'.
Đánh dấu

cái này không hoạt động với tôi, nó bao gồm kernel được cài đặt tùy chỉnh của tôi (Ubuntu 14.04 với 3.17)
Alex R

35

Cập nhật: purge-old-kernelsđang bị phản đối hiện nay.

Tôi đã tạo ra một kịch bản để thanh lọc hạt nhân ngay cả trong điều kiện khó khăn. Nó được gọi linux-purgevà bạn có thể tìm thấy nó ở đây .

Nếu bạn chỉ muốn lọc các hạt nhân (và các gói liên quan) cũ hơn kernel hiện đang sử dụng, khi hệ thống không bị hỏng, bạn có thể sử dụng tập lệnh này .

Ngoài ra còn có một trang tài liệu Ubuntu mà tôi đã góp phần liên quan đến việc loại bỏ các hạt nhân cũ ở đây .


Có vẻ như purge-old-kernelskhông có trong phiên bản chính xác (1.22) của bikeshed. Có một cách hợp lý / an toàn để có được một bikeshed gần đây cho chính xác? Hoặc sẽ đơn giản hơn / an toàn hơn khi chỉ cài đặt tập lệnh? Tôi muốn sử dụng repo hơn, mặc dù có danh sách dài các phụ thuộc ..
drevicko

1
@drevicko Xem tại đây .
jarno

1
@drevicko, chắc chắn,dlocate -lsbin bikeshed
jarno


1
@ChrisW đúng là có. Tôi chỉ thực hiện một cải tiến nhỏ cho kịch bản, vì vậy tốt nhất là sử dụng phiên bản mới nhất.
jarno

29

Bạn có thể theo dõi phần Sử dụng phần "nâng cấp không giám sát" của bài viết Cập nhật bảo mật tự động trên Ubuntu Wiki để thực hiện việc này.

Bạn cần thay đổi dòng sau trong tệp /etc/apt/apt.conf.d/50unattends-upgrades ;

//Unattended-Upgrade::Remove-Unused-Dependencies "false";

với

Unattended-Upgrade::Remove-Unused-Dependencies "true";

để tự động loại bỏ các gói cũ, bao gồm cả hạt nhân.

Đồng thời xóa hoặc nhận xét dòng

"^linux-image.*"; 

trong phần "NeverAutoRemove" của tệp /etc/apt/apt.conf.d/01autoremove.


2
Tôi đã làm điều này nhưng nó vẫn đang thu thập hơn 3 hạt nhân cũ tiêu tốn 100 MB. Vì vậy, tôi đã thêm vào apt-get autoremovecông việc định kỳ hàng ngày của mình thực sự là nâng cấp, vì nó không phải lúc nào cũng thông qua trình quản lý cập nhật tích hợp.
Marcos

Tôi nghĩ rằng điều này hoạt động trong Trusty chỉ dành cho các hạt nhân đã được cài đặt tự động.
jarno

Điều này là tuyệt vời để ngăn chặn sự tích tụ của các hạt nhân cũ khi các gói nâng cấp tự động, ví dụ như với các nâng cấp không giám sát. Tuy nhiên, nếu bạn không khởi động lại, bạn có thể thấy rằng gói cho kernel hiện đang chạy đã được gỡ cài đặt! Một vấn đề này có thể gây ra: các thiết bị mới mà bạn cắm vào có thể không hoạt động, vì mô-đun cho chúng không thể được tải nóng, vì nó không còn trên đĩa của bạn nữa. (Cách khắc phục nhanh cho việc này chỉ là cài đặt lại gói kernel, sau đó rút phích cắm và cắm lại thiết bị.)
joeytwiddle 18/03/2017

Tôi đã tạo ra một giải pháp tự động cho vấn đề nói trên. Nếu bạn nghĩ rằng đây là một cách tiếp cận tốt, thì hãy thêm nó vào câu trả lời của Qwerty.
joeytwiddle

27

Cách nhanh nhất / đơn giản hơn (Áp dụng ít nhất kể từ 12.04) có thể đi kèm với Ubuntu là apt-get. Thực hiện như sau nếu bạn muốn xóa tất cả các phiên bản kernel cũ không sử dụng (Ngoại trừ phiên bản trước mà bạn không sử dụng. Điều này là để đảm bảo rằng nếu phiên bản kernel hiện tại bị lỗi theo cách nào đó, bạn có cách để đi trở lại trạng thái trước đó). Làm như sau:

sudo apt-get autoclean

Điều này sẽ loại bỏ mọi tệp cũ (Bao gồm các phiên bản kernel) mà bạn có thể có. Lưu ý rằng nếu bạn có nhiều phiên bản cũ, sẽ mất một lúc vì phải đảm bảo rằng việc gỡ bỏ phiên bản kernel không có vấn đề gì. Đối với tôi, việc loại bỏ 12 phiên bản kernel cuối cùng mất khoảng 2 phút. Bạn cũng có thể làm như sau:

sudo apt-get clean

Mà sẽ loại bỏ mọi thứ được tải xuống và lưu trữ trong thư mục cache của apt. Cuối cùng, bạn có:

sudo apt-get autoremove

trong đó sẽ kiểm tra bất kỳ gói không sử dụng và loại bỏ chúng nếu cần thiết. Điều này rất tốt cho những thư viện và gói phụ thuộc không còn cần thiết bởi bất kỳ ứng dụng nào được cài đặt.


1
Tôi cho rằng điều này đã thay đổi trong các bản phát hành mới hơn vì trong 14.04, điều này chỉ đơn thuần là dọn dẹp bộ đệm của gói và không ảnh hưởng đến các gói hoặc grub đã cài đặt.
jarno

2
Tôi có thể xác nhận rằng sudo apt-get autoremoveloại bỏ các hạt nhân cũ (nhiều hơn một phiên bản trước) trong 14.04. Bạn có thể phải chạy nó trước và sau khi nâng cấp kernel của mình. Khi tôi chạy trước khi nâng cấp, nó chỉ xóa phiên bản chung của kernel cũ. Sau đó, sau khi nâng cấp kernel của tôi, nó cũng loại bỏ phiên bản thấp của kernel cũ.
tekNorah

Tôi có nghĩa là sudo apt-get autocleanlệnh. @tekNorah Tôi đã cài đặt một vài hạt nhân cũ hơn và sau đó chạy sudo apt-get autoremovetrong Ubuntu Studio 14.04. Nó đã không loại bỏ bất kỳ hạt nhân. Tôi chỉ có hạt nhân cài đặt thấp. Tại sao bạn đã cài đặt cả hai nhân -generic và -lowlatency?
jarno

5
Vâng, điều này làm việc rất tốt cho tôi, dọn dẹp tất cả các hạt nhân cũ đúng cách và không dựa vào các kịch bản một dòng điên rồ! Đề nghị, ước gì tôi có thể nâng cao điều này hơn một lần!
Jeff Atwood

1
@JeffAtwood tốt, nó có thể loại bỏ nhiều hạt nhân an toàn. Xem báo cáo lỗi
jarno

25

Phương pháp GUI 10.04

Máy tính Janitor có thể dọn sạch các hạt nhân cũ và tôi tin rằng nó được cài đặt theo mặc định trong Ubuntu (chứ không phải Kubfox).

GRUB 1, nếu bạn đang sử dụng, có một tùy chọn /boot/grub/menu.lstđể chỉ định số lượng hạt nhân sẽ hiển thị tối đa. GRUB 2, theo như tôi có thể nói, thì không.


4
Máy tính Janitor không nên được sử dụng - đó là lỗi và hiện đã bị loại bỏ như một ứng dụng mặc định trong natty / oneiric / chính xác.
fossfreedom

2
Thay vào đó, hãy cài đặt "Ubuntu Tweak" như được mô tả trong một câu trả lời khác (ppa của chính nó), có "trình điều khiển máy tính" riêng (không bị nhầm lẫn với "trình điều khiển máy tính" tạm thời có sẵn trong các phiên bản ub Ubuntu cũ)
michael

25

Để tìm ra những gì nhân và tiêu đề được cài đặt sử dụng

dpkg -l | grep linux-image

dpkg -l | grep linux-headers

Sau đó, bạn có thể xóa từng cái một hoặc cùng nhau, chỉ cần đảm bảo giữ gần đây nhất.

Ngoài ra còn có một số lệnh và tập lệnh tiện dụng để tự động loại bỏ.

http://ubuntuforums.org/showthread.php?t=1658648

Các yêu cầu sau đây để loại bỏ tất cả các hạt nhân và tiêu đề không sử dụng:

dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | grep -v hwe | xargs sudo apt-get purge

(sử dụng apt-get -yđể loại bỏ mà không có câu hỏi)

Đây là những gì xảy ra khi chạy vào ngày 18.04.1:

~$ dpkg -l 'linux-*' | sed '/^ii/!d;/'"$(uname -r | sed "s/\(.*\)-\([^0-9]

\+\)/\1/")"'/d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'|grep -E "(image|headers|modules)" | xargs sudo apt-get -y purge
Reading package lists... Done
Building dependency tree       
Reading state information... Done
The following packages will be REMOVED:
  linux-headers-4.15.0-33* linux-headers-4.15.0-33-generic* linux-headers-4.15.0-34* linux-headers-4.15.0-34-generic* linux-image-4.15.0-33-generic* linux-image-4.15.0-34-generic*
  linux-modules-4.15.0-33-generic* linux-modules-4.15.0-34-generic* linux-modules-extra-4.15.0-33-generic* linux-modules-extra-4.15.0-34-generic*
0 upgraded, 0 newly installed, 10 to remove and 1 not upgraded.
After this operation, 671 MB disk space will be freed.
(Reading database ... 227403 files and directories currently installed.)
Removing linux-headers-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-headers-4.15.0-33 (4.15.0-33.36) ...
Removing linux-headers-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-headers-4.15.0-34 (4.15.0-34.37) ...
Removing linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-image-4.15.0-33-generic (4.15.0-33.36) ...
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-33-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Found linux image: /boot/vmlinuz-4.15.0-34-generic
Found initrd image: /boot/initrd.img-4.15.0-34-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Removing linux-image-4.15.0-34-generic (4.15.0-34.37) ...
I: /vmlinuz.old is now a symlink to boot/vmlinuz-4.15.0-36-generic
I: /initrd.img.old is now a symlink to boot/initrd.img-4.15.0-36-generic
/etc/kernel/postrm.d/initramfs-tools:
update-initramfs: Deleting /boot/initrd.img-4.15.0-34-generic
/etc/kernel/postrm.d/zz-update-grub:
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-4.15.0-36-generic
Found initrd image: /boot/initrd.img-4.15.0-36-generic
Adding boot menu entry for EFI firmware configuration
done
Removing linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
Removing linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
(Reading database ... 156180 files and directories currently installed.)
Purging configuration files for linux-image-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-4.15.0-33-generic (4.15.0-33.36) ...
dpkg: warning: while removing linux-modules-4.15.0-33-generic, directory '/lib/modules/4.15.0-33-generic' not empty so not removed
Purging configuration files for linux-modules-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-image-4.15.0-33-generic (4.15.0-33.36) ...
Purging configuration files for linux-modules-extra-4.15.0-34-generic (4.15.0-34.37) ...
Purging configuration files for linux-modules-extra-4.15.0-33-generic (4.15.0-33.36) ...
~$ uname -r
4.15.0-36-generic

Kịch bản bạn tìm thấy trong diễn đàn bị lỗi. Nó có thể không xóa một số gói tiêu đề mong muốn (nếu bạn tình cờ sử dụng một số kernel -pae cũ) và mặt khác, nó có thể xóa một số gói bạn muốn giữ.
jarno

Cảm ơn bạn đã bình luận. Kịch bản có thể không hoàn hảo, tuy nhiên, tôi đã sử dụng nó trong nhiều năm, chủ yếu là trên 12.04 và 14.04, 32 và 64 bit, và không gặp vấn đề gì. ... Và vâng, linux-libc-devđược cài đặt.
mikewhthing

Tôi cho rằng số phiên bản linux-libc-devkhớp với số phiên bản của ḱernel hiện tại. Ở đây dpkg -l linux-libc-dev | sed '/^ii/!d;s/^[^ ]* [^ ]* \([^ ]*\).*/\1/;/[0-9]/!d'in linux-libc-dev: amd64
jarno

Tôi vẫn không thể sao chép phát hiện của bạn, tuy nhiên, để đảm bảo an toàn, tôi đã sửa đổi lệnh bằng cách thêm bộ lọc bổ sung - grep -E "(image|headers)".
mikewhthing

1
Trước tiên hãy thử rút -ycờ với thanh trừng ..!
nguy hiểm89

16

Để loại bỏ các nhân hình ảnh Linux cũ hơn, trước tiên hãy khởi động trong kernel mà bạn muốn giữ.

Bạn cũng có thể kiểm tra phiên bản kernel bằng lệnh uname -rđể không xóa nhầm.

Bây giờ, hãy chuyển đến trình quản lý gói synap và tìm kiếm linux-imagevà xóa các phiên bản cũ hơn ngoại trừ phiên bản được hiển thị bởi lệnh trên. Nói chung tôi thích đi với cái mới nhất.

Bây giờ khi bạn khởi động lại, bạn sẽ thấy một menu grub sạch hơn.


Đây có lẽ là phương pháp cơ bản nhất dành cho người dùng đã cài đặt w / o Computer Janitor.
Broam

1
Từ Ubuntu 11.04, menu grub chỉ hiển thị kernel hiện tại theo mặc định, các kernel cũ hơn được ẩn trong menu 'kernel trước'. Phương pháp này vẫn sẽ làm việc để làm sạch những cái cũ.
Andy

14

Bạn có thể cài đặt tinh chỉnh Ubuntu và sau đó vào Ứng dụng -> Công cụ hệ thống -> tinh chỉnh ubfox và

nhập mô tả hình ảnh ở đâynhấp vào gói dọn dẹp và làm sạch hạt nhân. nó không hiển thị kernel hiện đang được sử dụng nên bạn sẽ luôn an toàn.


8

Cá nhân, tôi thích sử dụng Synaptic. Nó làm tôi cảm thấy an tâm hơn về những gì đang diễn ra. Ứng dụng duy nhất tôi đã sử dụng có tùy chọn xóa hạt nhân cũ là Ubuntu Tweak .

Cách loại bỏ các hạt nhân bạn không sử dụng:

  • Mở UbuntuTweak
  • Nhấp vào 'Trình dọn dẹp gói' bên dưới 'Ứng dụng' trong khung bên trái
  • Ở bên phải của 'chế độ xem làm sạch', nhấn 'Clean Kernels'
  • Chọn tất cả các hạt nhân - Tôi nghĩ rằng một trong những sử dụng không được liệt kê mà chỉ trong trường hợp kiểm tra chạy uname -atrong một thiết bị đầu cuối

Trong Synaptic, bạn có thể lọc trên 'Thành phần' -> 'Hạt nhân và mô-đun', bao gồm tất cả các hạt nhân. Và sắp xếp theo cột đầu tiên: 'S' (Trạng thái), để bạn có được tất cả các hạt nhân được cài đặt trên đầu trang. Quả thực update-grublà khuyên.
nguy hiểm89

6

Bạn có thể gỡ cài đặt các hạt nhân cũ ( linux-image-...gói) bằng Synaptic và điều đó sẽ xóa chúng khỏi menu khởi động. Cẩn thận không loại bỏ kernel đang chạy (bạn có thể kiểm tra phiên bản của nó với uname -r).

Hãy nhớ rằng có một hoặc hai phiên bản cũ hơn có thể giúp bạn khắc phục sự cố, nếu có sự cố xảy ra.

Ngoài ra, bạn có thể chỉnh sửa / xóa các mục thủ công ( gksu gedit /boot/grub/grub.cfg), nhưng chúng sẽ được tạo lại khi bạn cập nhật lên kernel mới hơn. Nếu bạn đang suy nghĩ về việc loại bỏ recovery modecác tùy chọn - đừng. Chúng có thể có ích nếu bạn phá vỡ thứ gì đó ngăn bạn khởi động.


Tham khảo trang này.


Grub2 hiện xây dựng mục nhập grub của nó mỗi khi cài đặt kernel mới. với update-grubnó sẽ viết lại tất cả những hạt nhân đó.
Marco Ceppi

4

Đây là một giải pháp dòng lệnh thuần túy.

Đầu tiên tạo danh sách tất cả các phiên bản kernel đã cài đặt trừ kernel hiện đang chạy:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    grep -v $(uname -r | cut -d- -f1,2))

Hoặc tạo một danh sách tất cả các phiên bản kernel đã cài đặt trừ hai phiên bản cuối:

dpkg-query -W -f='${Package}\n' |
  grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
    sort -V | head -n -2)

Kiểm tra danh sách. Đảm bảo rằng các phiên bản kernel bạn muốn giữ không nằm trong danh sách. Sử dụng lệnh uname -rđể xem phiên bản của kernel hiện đang chạy.

Nếu bạn hài lòng với kết quả bạn có thể sử dụng apt-getđể loại bỏ các gói.

Đầu tiên là chạy khô (sử dụng trình tạo đầu tiên làm ví dụ):

sudo apt-get --dry-run purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Sau đó chạy thật:

sudo apt-get purge $(
  dpkg-query -W -f='${Package}\n' |
    grep -f <(ls -1 /boot/vmlinuz* | cut -d- -f2,3 |
      grep -v $(uname -r | cut -d- -f1,2)))

Nếu bạn muốn tự động hóa quá trình thì thêm --yestham số:

sudo apt-get --yes purge $(
  ...)

@jarno Tôi đánh giá cao nỗ lực của bạn để kết hợp và tối ưu hóa dòng lệnh của tôi. Tôi loại bỏ dòng lệnh của bạn bởi vì tôi thích dễ đọc và đơn giản. Tôi cố tình điều chỉnh lệnh của tôi để dễ đọc và đơn giản. Ít nhất có thể đọc và đơn giản cho bộ não của tôi. Vui lòng gửi dòng lệnh của bạn dưới dạng một nhận xét hoặc trong câu trả lời của riêng bạn.
lesmana

1
Điều này kết hợp hai mục tiêu: Giữ hai hạt nhân cuối cùng và giữ hạt nhân mới hơn hạt nhân hiện tại sudo apt-get purge -- $(ls -1U /boot/vmlinuz* | cut -d- -f2,3 | sort -uV | head -n -2 | awk -v c=$(uname -r | cut -d- -f1,2) '($0==c){exit} //' | sed -r -e 's/\./\\./g' -e 's/.*/-&($|-)/'). Không cần dpkg-queryapt-getcó thể xử lý các biểu thức thông thường. Xin lưu ý cách tôi thoát dấu chấm, và thêm tiền tố và hậu tố trong biểu thức thông thường. Sử dụng tập lệnh trong câu trả lời của riêng tôi, bạn cũng có thể giữ một số hạt cũ hơn so với hiện tại.
jarno

4

Ưu điểm của câu trả lời này là Ubuntu Bash gốc được sử dụng mà không cần cài đặt các ứng dụng của bên thứ ba. Người dùng hạt nhân tùy chỉnh đã không sử dụng apthoặc dpkgcó thể thay đổi tập lệnh bash này cho phù hợp với nhu cầu của họ. Câu trả lời này dựa trên ( Làm thế nào để chọn lọc tất cả các hạt nhân cũ cùng một lúc ).

Giải pháp dựa trên Zenity

Zenity cung cấp giao diện GUI đẹp cho thiết bị đầu cuối để xử lý danh sách và chọn các mục bằng nút radio :

hạt nhân 1

Vì tiêu đề cho biết kernel hiện tại mà bạn đã khởi động không thể bị xóa và không được đưa vào danh sách. Kích thước được báo cáo là bao nhiêu sẽ được lưu trong /bootthư mục. Nhiều hơn được lưu trên đĩa của bạn vì các nhị phân kernel cũng nằm trong các khu vực khác. Ngày 27 tháng 7 năm 2017 lưu ý: Các thư mục /usr/src/*kernel_version*/lib/modules/*kernel_version*hiện cũng được bao gồm.

Các Date Modified được phát hiện bằng cách sử dụng statlệnh. Trên hệ thống của tôi, ngày đó được "chạm" mỗi khi kernel được khởi động bằng cách này ( Làm thế nào để bạn biết khi nào một phiên bản kernel cụ thể được khởi động lần cuối? ) Kịch bản khởi động lại cron . Tuy nhiên, trên hệ thống của bạn, ngày sẽ là ngày phát hành kernel, không phải là lần cuối bạn khởi động nó.

apt-get purge cho bạn cơ hội phá thai

Bạn được cung cấp một cơ hội cuối cùng để xem mọi thứ sẽ bị xóa và xem tổng dung lượng đĩa (hơi sai lệch) sẽ được phục hồi:

The following packages will be REMOVED:
  linux-headers-4.7.1-040701* linux-headers-4.7.1-040701-generic*
  linux-headers-4.7.2-040702* linux-headers-4.7.2-040702-generic*
  linux-headers-4.7.3-040703* linux-headers-4.7.3-040703-generic*
  linux-headers-4.8.1-040801* linux-headers-4.8.1-040801-generic*
  linux-headers-4.8.10-040810* linux-headers-4.8.10-040810-generic*
  linux-headers-4.8.11-040811* linux-headers-4.8.11-040811-generic*
  linux-headers-4.8.4-040804* linux-headers-4.8.4-040804-generic*
  linux-headers-4.8.5-040805* linux-headers-4.8.5-040805-generic*
  linux-image-4.7.1-040701-generic* linux-image-4.7.2-040702-generic*
  linux-image-4.7.3-040703-generic* linux-image-4.8.1-040801-generic*
  linux-image-4.8.10-040810-generic* linux-image-4.8.11-040811-generic*
  linux-image-4.8.4-040804-generic* linux-image-4.8.5-040805-generic*
0 upgraded, 0 newly installed, 24 to remove and 2 not upgraded.
After this operation, 2,330 MB disk space will be freed.
Do you want to continue? [Y/n] 

Mật mã

Sao chép mã này vào một tệp thực thi có tên rm-kernelstrong /usr/local/bin:

#!/bin/bash

# NAME: rm-kernels
# PATH: /usr/local/bin
# DESC: Provide zenity item list of kernels to remove

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    zenity --error --text "root access required. Use: sudo rm-kernels"
    exit 99
fi

OLDIFS="$IFS"
IFS="|"
choices=()

current_version=$(uname -r)

for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    choices=("${choices[@]}" false "$v" "$d" "$s")
done

# adjust width & height below for your screen 640x480 default for 1920x1080 HD screen
# also adjust font="14" below if blue text is too small or too large

choices=(`zenity \
        --title "rm-kernels - Total: $t MB excluding: $current_version" \
        --list \
        --separator="$IFS" \
        --checklist --multiple \
        --text '<span foreground="blue" font="14">Check box next to kernel(s) to remove</span>' \
        --width=640 \
        --height=480 \
        --column "Select" \
        --column "Kernel Version Number" \
        --column "Modified Date" \
        --column " Size " \
        "${choices[@]}"`)
IFS="$OLDIFS"

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
     apt-get purge $list
fi

LƯU Ý: Bạn cần có quyền sudo để tạo tệp để sử dụng:

gksu gedit /usr/local/bin/rm-kernels

Để làm cho tập tin thực thi sử dụng:

sudo chmod +x /usr/local/bin/rm-kernels

Phiên bản máy chủ

rm-kernels-serverlà phiên bản máy chủ để xóa tất cả các hạt nhân cùng một lúc. Thay vì hộp thoại GUI (đồ họa), hộp thoại dựa trên văn bản được sử dụng để chọn hạt nhân để thanh lọc.

  • Trước khi chạy tập lệnh, bạn cần cài đặt chức năng hộp thoại bằng cách sử dụng:

    sudo apt install dialog

Hộp thoại nằm trong cài đặt Ubuntu Desktop mặc định nhưng không có trong Ubuntu Server.

Màn hình mẫu

rm-hạt nhân-máy chủ 1

rm-kernels-server mã bash

#!/bin/bash

# NAME: rm-kernels-server
# PATH: /usr/local/bin
# DESC: Provide dialog checklist of kernels to remove
#       Non-GUI, text based interface for server distro's.

# DATE: Mar 10, 2017. Modified Jul 28, 2017.

# NOTE: Will not delete current kernel.

#       With 10 kernels on an SSD, empty cache from sudo prompt (#) using:
#       # free && sync && echo 3 > /proc/sys/vm/drop_caches && free
#       First time for `du` 34 seconds.
#       Second time for `du` 1 second.

# PARM: If any parm 1 passed use REAL kernel size, else use estimated size.
#       By default `du` is not used and estimated size is displayed.

# Must be running as sudo
if [[ $(id -u) != 0 ]]; then
    echo "root access required. Use: sudo rm-kernels-server"
    exit 99
fi

# Must have the dialog package. On Servers, not installed by default
command -v dialog >/dev/null 2>&1 || { echo >&2 "dialog package required but it is not installed.  Aborting."; exit 99; }

OLDIFS="$IFS"
IFS="|"
item_list=() # Deviate from rm-kernels here.

current_version=$(uname -r)
i=0
for f in /boot/vmlinuz*
do
    if [[ $f == *"$current_version"* ]]; then continue; fi # skip current version
    [[ $f =~ vmlinuz-(.*) ]]
    ((i++)) # Item List
    v=${BASH_REMATCH[1]}        # example: 4.9.21-040921-generic
    v_main="${v%-*}"            # example: 4.9.21-040921

    # Kernel size in /boot/*4.9.21-040921-generic*
    s=$(du -ch /boot/*-$v* | awk '/total/{print $1}')

    if [[ $# -ne 0 ]] ; then    # Was a parameter passed?
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             # Kernel headers size in /usr/src/*4.9.21-040921*
             s2=$(du -ch --max-depth=1 /usr/src/*-$v_main* | awk '/total/{print $1}')
        else
             s2="0M"            # Linux Headers are not installed
        fi
        # Kernel image size in /lib/modules/4.9.21-040921-generic*
        s3=$(du -ch --max-depth=1 /lib/modules/$v* | awk '/total/{print $1}')
    else
        # Estimate sizof of optional headers at 125MB and size of image at 220MB
        if [[ -d "/usr/src/linux-headers-"$v_main ]] ; then
             s2="125M"
        else
             s2="0M"            # Linux Headers are not installed
        fi
        s3="220M"
    fi

    # Strip out "M" provided by human readable option of du and add 3 sizes together
    s=$(( ${s//[^0-9]*} + ${s2//[^0-9]*} + ${s3//[^0-9]*} ))
    t=$(( t + s ))
    s=$s" MB"
    d=$(date --date $(stat -c %y $f) '+%b %d %Y') # Last modified date for display
    item_list=("${item_list[@]}" "$i" "$v ! $d ! $s" off)
done

cmd=(dialog --backtitle "rm-kernels-server - Total: $t MB excluding: $current_version" \
    --title "Use space bar to toggle kernel(s) to remove" \
    --column-separator "!" \
    --separate-output \
    --ascii-lines \
    --checklist "         Kernel Version --------- Modified Date  Size" 20 60 15)

selections=$("${cmd[@]}" "${item_list[@]}" 2>&1 >/dev/tty)

IFS=$OLDIFS

if [ $? -ne 0 ] ; then
    echo cancel selected
    exit 1
fi

i=0
choices=()

for select in $selections ; do
    ((i++))
    j=$(( 1 + ($select - 1) * 3 ))
    choices[i]=$(echo ${item_list[j]} | cut -f1 -d"!")
done

i=0
list=""
for choice in "${choices[@]}" ; do
    if [ "$i" -gt 0 ]; then list="$list- "; fi # append "-" from last loop
    ((i++))

    short_choice=$(echo $choice | cut -f1-2 -d"-")
    header_count=$(find /usr/src/linux-headers-$short_choice* -maxdepth 0 -type d | wc -l)

    # If -lowlatency and -generic are purged at same time the _all header directory
    # remains on disk for specific version with no -generic or -lowlatency below.
    if [[ $header_count -lt 3 ]]; then
        # Remove all w.x.y-zzz headers
        list="$list""linux-image-$choice- linux-headers-$short_choice"
    else
        # Remove w.x.y-zzz-flavour header only, ie -generic or -lowlatency
        list="$list""linux-image-$choice- linux-headers-$choice" 
    fi

done

if [ "$i" -gt 0 ] ; then
    apt-get purge $list
fi

LƯU Ý: Trong lệnh gọi đến dialoglệnh --ascii-linesđược chuyển để thay thế bộ ký tự mở rộng vẽ đường thẳng ( sshkhông giống như) bằng "+ ----- +" cho các hộp vẽ. Nếu bạn không thích sự xuất hiện này, bạn có thể sử dụng lệnh --no-lineskhông có hộp nào cả.


Cập nhật ngày 28 tháng 7 năm 2017

Kích thước tính toán của mỗi hạt nhân được lấy từ /boot/*kernel_version*đó có 5 tệp tổng cộng ~ 50 MB. Công thức đã thay đổi để bao gồm các tệp trong /usr/src/*kernel_version*/lib/modules/*kernel_version*. Kích thước tính toán cho mỗi hạt nhân hiện là ~ 400 MB. Các mã trên cho rm-kernelsrm-kernels-serverđã được cập nhật. Tuy nhiên, các màn hình mẫu ở trên chưa phản ánh những thay đổi này.

Mặc định là ước tính kích thước tệp cho các tiêu đề linux ở mức 125 MB và hình ảnh linux ở mức 220 MB vì ducó thể bị chậm một cách khó khăn trừ khi các tệp nằm trong bộ đệm. Để có được kích thước thực bằng cách sử dụng duchuyển bất kỳ tham số nào cho tập lệnh.

Tổng số tất cả các kích thước kernel (không bao gồm phiên bản đang chạy hiện tại không thể xóa được) hiện được hiển thị trên thanh tiêu đề.

Hộp thoại được sử dụng để hiển thị Ngày truy cập cuối cùng của mỗi hạt nhân . Ngày này có thể được ghi đè hàng loạt cho tất cả các hạt nhân trong quá trình sao lưu hoặc các hoạt động tương tự. Thay vào đó, hộp thoại hiển thị Ngày sửa đổi .


2

Một cách dễ dàng để loại bỏ gần như tất cả các gói lỗi thời, các gói không còn trong bất kỳ danh sách gói nào, cùng với các hạt đã lỗi thời là thực hiện một trong các cách sau:

dpkg --purge $(aptitude search ?obsolete)

Tuy nhiên, điều này sẽ bỏ lỡ các gói vẫn được các gói khác khuyến nghị và đối số -R / - không có khuyến nghị không giải quyết được vấn đề này.

sau khi chuyển đổi chế độ sắp xếp với 'o' sẽ hiển thị tất cả các gói lỗi thời bao gồm cả những gói bị mất năng lực, nhưng một số người không thích sử dụng nó.


Lệnh đã cho không thanh lọc các nhân cũ cũng như không ảnh hưởng đến menu grub theo kinh nghiệm của tôi.
jarno

2

Câu trả lời được chấp nhận bằng cách sử dụng sedđể loại bỏ các hạt nhân cũ hơn vĩnh viễn có một số sai sót, nếu ai đó chưa khởi động lại máy tính sau khi nâng cấp kernel, lệnh cũng sẽ loại bỏ kernel mới hơn.

Đây là một giải pháp thay thế sẽ xem xét tất cả các tình huống để loại bỏ các hạt nhân cũ thực tế:

#!/bin/bash
kernels=( $(grep -Po "^linux-image-[^-]+-[^-]+-generic\b" < <(dpkg --get-selections)) )
cur_rel=$(grep -Po ".*(?=-[a-z]*$)" < <(uname -r))

for kernel in "${kernels[@]}"; do
    ker_rel=$(grep -Po "[0-9].*(?=-[a-z]*)" <<< "$kernel")
    dpkg --compare-versions "$ker_rel" gt "$cur_rel" && echo "Please Restart your computer first" && break
    dpkg --compare-versions "$ker_rel" lt "$cur_rel" && sudo apt-get remove "$kernel"
done

Nếu bạn có bất kỳ phiên bản nào mới hơn phiên bản hiện tại, điều này sẽ đưa ra cảnh báo khởi động lại máy tính của bạn trước. Cũng lưu ý rằng các hạt nhân cũ hơn được bảo tồn do một lý do chính đáng là nếu bạn bằng cách nào đó làm rối hạt nhân hiện tại của bạn làm cho hệ thống của bạn không ổn định thì bạn có thể khởi động vào bất kỳ hạt nhân cũ nào.


Điều này sẽ không loại bỏ hạt nhân thấp hoặc hạt nhân của bất kỳ hương vị khác ngoài chung chung.
jarno

Tôi cho rằng bạn tham khảo các giải pháp này sed .
jarno

@jarno: Làm thế nào về việc thay thế grep -Po "^linux-image-[^-]+-[^-]+-generic\b"bằng grep -Eo "^linux-(image|headers|tools)-[^-]+-[^-]+(|-generic)\s" | sed -e "s/\s//g"grep -Po ".*(?=-[a-z]*$)"bằng grep -Eo "^[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"grep -Po "[0-9].*(?=-[a-z]*)"với grep -Eo "[0-9]+\.[0-9]+\.[0-9]+-[0-9]+"?
Sadi

@Sadi, xin chào, tôi cũng sẽ không tìm thấy hạt nhân thấp.
jarno

1
Cảm ơn. Các phương pháp khác không hiệu quả với tôi. Bạn đã làm công việc.
Philippe Delteil

1

ailurus có tính năng loại bỏ các hạt nhân cũ cũng như các cấu hình không sử dụng. Cá nhân tôi loại bỏ nó bằng tay từ synap. Bạn có thể cài đặt ailurus từ getdeb cũng như ppa


"Ailurus là một công cụ để sao lưu danh sách tên của phần mềm đã cài đặt. ... Trước đây Ailurus có nhiều chức năng. Bây giờ nó chỉ có một chức năng. Bởi vì tôi nghĩ một chức năng thực sự hữu ích tốt hơn hàng tá chức năng ít hữu ích hơn."
jarno

1

Tôi có một kịch bản cho điều này mà không cần phân tích chuỗi rất lạ mắt.

Xóa các tiêu đề và hình ảnh ngoại trừ tiêu đề hiện tại để giải phóng không gian

sudo apt-get autoremove --purge 'linux-headers-[0-9].*' linux-headers-$(uname -r)+ linux-headers-$(uname -r | cut -d- -f1,2)+ 'linux-image-[0-9].*' linux-image-$(uname -r)+

1

Bạn có thể sử dụng ukuu - đó là tất cả GUI - để cập nhật và xóa Kernels cũ. Làm việc cho tôi!

Chỉ cần nhớ để lại 2 cài đặt cuối cùng và rõ ràng là hạt nhân 'đang chạy'.

Bạn cũng có thể đặt ukuu chỉ hiển thị các bản phát hành chính, thậm chí cả nhân RC, ẩn các bản phát hành điểm.

ukuu

Bạn có thể tìm thấy ukuu trong Synaptic hoặc hướng dẫn tại đây:

Hướng dẫn cài đặt OMG! Ubuntu ukuu


1

Dựa trên câu trả lời trước của David Kemp, đoạn script sau sẽ lọc tất cả các tiêu đề và hình ảnh ngoại trừ 2 phiên bản cuối cùng .

#!/bin/sh
# This script assumes that the installed linux-image and linux-headers packages
# share the same versions (i.e. if a linux-image version number is installed,
# the corresponding linux-headers package will also be installed, and vice
# versa.)

SECONDTOLASTVER=$(dpkg --list | grep linux-image | awk '{ print $2 }' | sort -r -n | sed '/^[^0-9]\+$/d' | sed 's/^.*-\([0-9\.]\+-[0-9]\+\).*/\1/' | uniq | sed -n 2p)

# get a list of package names matching the argument passed to the function, and
# return only those package names which should be removed
get_pkgs_to_remove_matching () {
    if [ -n "$SECONDTOLASTVER" ]; then
        echo $(dpkg --list | grep $1 | awk '{ print $2 }' | sort | sed -n '/'"$SECONDTOLASTVER"'/q;p')
    fi
}

echo $(get_pkgs_to_remove_matching linux-image) $(get_pkgs_to_remove_matching linux-headers) | xargs sudo apt-get purge

(sử dụng apt-get -yđể loại bỏ mà không có câu hỏi)


Bất kỳ lý do tại sao điều này đã bị hạ cấp? Nó không làm việc cho một ai đó? Khi sao chép / dán, đảm bảo bạn không quấn các hàng dài khi bạn dán. Tôi đã không có vấn đề với nó làm việc.
Đánh dấu

Bản phát hành kernel mới nhất trong máy của tôi là 3.13.0-43-lowlatency. Kịch bản này sẽ thanh lọc các tiêu đề linux-3.13.0-43-lowlatency.
jarno

@jarno bạn đã xác định điều đó như thế nào? để dùng thử mà không thực sự làm gì, hãy thêm cờ "-s" vào lệnh apt-get (hoặc chỉ loại bỏ | xargs sudo apt-get -y purgehoàn toàn). Nếu nó in ra 3.13.0-43-lowlatency, thì có lẽ bạn có một số phiên bản mới hơn phiên bản được cài đặt trên hệ thống của bạn.
Đánh dấu

Tôi đã thử mô phỏng. Không, nhưng tôi đã loại bỏ một số phiên bản kernel trước đó, nhưng không bị xóa và các gói tiêu đề tương ứng bị xóa.
jarno

Dù sao, tôi đã phát triển một kịch bản dựa trên ý tưởng về câu trả lời của Sankalp.
jarno

0

Đây là một phác thảo sơ bộ về những gì tôi đã làm, cẩn thận vì tôi không phải là chuyên gia về linux, hãy chắc chắn rằng bạn biết những gì bạn đang làm và đã sao lưu bất kỳ tệp nào bạn đang sửa đổi.

gedit /boot/grub/grub.cfg

sau đó tìm các mục bạn muốn giữ, chúng tôi sẽ đánh dấu và sao chép chúng

cd /etc/grub.d
ls

bạn sẽ thấy danh sách các tệp như 10_linux và 30_os-prober

sudo chmod -x 10_linux

điều này sẽ dừng hình thức tự động thêm tất cả các mục linux vào menu khởi động grub.

gksudo gedit 40_custom

mở tệp menu khởi động tùy chỉnh, sau đó quay lại grub.cfg (vẫn nên mở trong gedit) và sao chép các mục bạn muốn giữ ... chẳng hạn như

menuentry "My Default Karmic" {
  set root=(hd0,1)
  search --no-floppy --fs-uuid --set cb201140-52f8-4449-9a95-749b27b58ce8
  linux /boot/vmlinuz-2.6.31-11-generic root=UUID=cb201140-52f8-4449-9a95-749b27b58ce8 ro quiet splash
  initrd /boot/initrd.img-2.6.31-11-generic
}

dán chúng vào 40_custom, và sau đó lưu nó.

sudo chmod 755 40_custom

làm cho nó có thể thực thi được, cuối cùng chúng ta cập nhật grub sẽ thay đổi tệp grub.cfg:

sudo update-grub

Bây giờ, HÃY THỬ, nếu bạn cập nhật kernel hoặc HĐH, menu boot của bạn có thể sẽ không cập nhật ... bạn sẽ phải làm điều đó bằng tay. Nhưng thực hiện quy trình này sẽ cho phép bạn tùy chỉnh menu khởi động thêm một chút, chẳng hạn như xóa phiên bản kernel và chỉ cần đặt tên ub Ubuntu ... tức là Ubuntu Lucid 10.04, v.v ...

Hy vọng ai đó thấy điều này hữu ích, vì tôi phải mất một thời gian để tìm ra ... không thấy giải pháp này ở bất cứ đâu ...


3
Câu trả lời này có vẻ như quá mức cần thiết. Tốt hơn hết là loại bỏ hạt nhân cũ.
Scott Severance

Tôi đã đọc rằng các hạt nhân thêm có thể hữu ích trong trường hợp các tình huống phục hồi. Ngoài ra, đây là một cách đơn giản để chỉnh sửa văn bản của mục khởi động. Vì vậy, thay vì nói "Ubuntu, Linux kernel xxxx-yy --text1 -text2 -t3 -t4 --t5 v.v ..." (trong đó các mục --text chỉ biểu thị một số tùy chọn / tham số tôi không hiểu) bạn có thể thay đổi nó thành "Ubuntu xx.yy" mặc dù tôi đã có dấu ngoặc "{" mà tôi không thể loại bỏ.
Joe

1
Tôi giữ kernel trước đó ngay lập tức cho đến khi tôi xác minh kernel mới nhất hoạt động đúng. Nếu nó hoạt động, nó sẽ không ngừng hoạt động. Vì vậy, sau khi tôi xác minh hạt nhân gần đây nhất (sau một tuần hoặc lâu hơn), tôi không có lý do gì để giữ hạt nhân cũ xung quanh. Nếu nó không hoạt động, thì tôi có hạt nhân nổi tiếng mới nhất để quay trở lại. Trên thực tế, tôi hiện đang chạy một kernel cũ do lỗi showstopper trong các kernel hiện tại. Nhưng điều đó không thay đổi chính sách chung của tôi. Bạn chỉ cần một hạt nhân tốt được biết đến.
Scott Severance

0

Cài đặt quản lý gói synaptic và đi xuống tab lọc (Tôi nghĩ rằng các bộ lọc, nếu không cố gắng tất cả 5) và chọn "địa phương". Điều này sẽ cho bạn thấy các gói mồ côi trên hệ thống của bạn, chẳng hạn như các hạt nhân. Sau khi bạn gỡ cài đặt chúng, hãy chạy update-grub. Lệnh đó cập nhật danh sách các tùy chọn khởi động cho grub.

Nếu điều này thất bại, bạn luôn có thể thử apt-get remove linux-image-version-generic.


Trong Synaptic, bạn có thể lọc trên 'Thành phần' -> 'Hạt nhân và mô-đun', bao gồm tất cả các hạt nhân. Và sắp xếp theo cột đầu tiên: 'S' (Trạng thái), để bạn có được tất cả các hạt nhân được cài đặt trên đầu trang. Quả thực update-grublà khuyên.
nguy hiểm89

0

Để có thêm một chút quyền kiểm soát đối với những phiên bản sẽ giữ, hãy chọn rõ ràng những phiên bản bạn muốn xóa. Ví dụ: nếu bạn muốn xóa phiên bản kernel 3.2.0. [49-53], hãy sử dụng một forvòng lặp đơn giản :

for k in 49 51 52 53 ; do aptitude remove --purge linux-image-3.2.0-${k}-generic ; done

Điều chỉnh danh sách các phiên bản kernel cho phù hợp.


0

Thử đi. Chạy nó như root.

Lưu tập lệnh này dưới dạng, nói ./keep-n-kernels.sh

Vượt qua, như là một đối số dòng lệnh, số lượng hạt nhân gần đây nhất mà bạn muốn bảo tồn.

    
#! / bin / bash

# pass n là một đối số dòng lệnh và nó sẽ tìm thấy tất cả các cài đặt
# hạt nhân và chỉ giữ lại n cái gần đây nhất => gỡ cài đặt tất cả những cái cũ hơn

# dpkg -l 'linux- *' | sed '/ ^ ii /! d; /' "$ (uname -r | sed" s /\(.*\)-\([ ^ d; s / ^ [^] * [^] * \ ([^] * \). * / \ 1 /; / [0-9] /! d '
# lệnh này đưa ra danh sách tất cả các gói EXCEPT cho kernel mới nhất.
# nguồn: https://help.ubfox.com/community/Lubfox/Documentation/RemoveOldKernels

n = $ 1

# tìm các phiên bản kernel đã cài đặt:
# dpkg-query -W -f = '$ {Phiên bản} \ n' 'linux-image- *' | grep. | sắp xếp
# cung cấp số phiên bản, một trong mỗi dòng
# dpkg-query -W -f = '$ {Phiên bản} \ n' 'linux-image- *' | grep. | sed 's /\...$// g' | grep -v '\ ... $' | sắp xếp
# chỉ cung cấp những cái xuất hiện trong hình ảnh linux

# hậu tố, ví dụ -generic-pae
# loại kernel bạn khởi động vào
hậu tố = $ (uname -r | sed 's: ^ [0-9] \. [0-9] \. [0-9] \ - [0-9] \ {2 \} :: g')

lệnh = "apt-get purge"

cho phiên bản bằng $ (dpkg-query -W -f = '$ {Phiên bản} \ n' 'linux-image- *' | grep. | sed 's /\...$// g' | grep -v ' \ ... $ '| sắp xếp -u | đầu -n - $ {n})
làm
    lệnh = $ {lệnh} "^ linux-image - $ {phiên bản} $ {hậu tố}"
làm xong

lệnh $

Sử dụng mẫu:

# ./keep-n-kernels.sh 4 # khởi chạy lệnh apt-get để xóa tất cả trừ 4 hạt nhân gần đây nhất

Nếu bạn muốn [VÀ TẠI RỦI RO RIÊNG CỦA BẠN], bạn có thể thêm -y (hoặc cờ lực) vào lệnh apt-get và làm cho nó không tương tác.


Nó loại bỏ tất cả các hạt nhân, nếu bạn chạy ./keep-n-kernels.sh 0. Phát hiện chuỗi hậu tố không hoạt động; Tôi nghĩ hậu tố = $ (uname -r | sed -r 's / ^ [0-9.] * (- [0-9.] +) * //') hoặc hậu tố = $ (uname -r | egrep - -only-khớp - '- [[: alpha:] -] + $') sẽ làm.
jarno

Nhưng tôi nghĩ ý tưởng này là tốt đẹp. Tôi đã làm việc để cải thiện kịch bản và đôi khi tôi sẽ đăng nó ở đây, khi tôi nghĩ nó đã sẵn sàng.
jarno

Xin hãy chia sẻ, @jarno. Vui mừng khi biết ý tưởng có vẻ hữu ích.
Sankalp

Ok, đây là: link
jarno

0

Tôi đang sử dụng máy tính để bàn KDE và tùy chọn dễ nhất tôi tìm thấy là sử dụng ứng dụng kde-config-grub2 như được đề xuất tại đây: https://www.kubuntuforums.net/showthread.php?58075-remove-old-linux-versions (mà tôi đã cài đặt để thiết lập hình nền, tùy chọn khởi động mặc định và tương tự). Bên cạnh hộp thả xuống nơi bạn có thể chọn mục nhập mặc định, có nút "Xóa mục nhập cũ". Nhấp vào nút này sẽ hiển thị cho bạn một danh sách tất cả các hạt nhân đã cài đặt và bạn có thể chọn những cái cần loại bỏ. Khi bạn áp dụng các thay đổi, nó sẽ sử dụng dpkg để thực sự loại bỏ chúng khỏi hệ thống cũng như menu GRUB.


0

Chỉ cần bấm chuông, bạn cũng có thể phát hành

apt-get remove linux-{image,headers}-x.y.z-{1,2,...,n}

là root, và công việc sẽ được thực hiện.


0

Nếu bạn đang sử dụng ansible để điều khiển máy móc, cuốn sách này có thể hữu ích.

---
 - hosts: all
   become: yes
   tasks:
    - name: "Run apt-get autoremove"
      apt: 
        name: linux-image-generic
        autoremove: yes
        state: present 
        update_cache: yes
        cache_valid_time: 3600
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.