如何删除旧的内核版本以清理启动菜单?

每次我安装一个新的Linux内核时,它都会留在grub_config中,使引导菜单每次都更长。

我知道我可以手动搜索已安装的软件包并将其删除。

Ubuntu是否提供任何更简单的方法来清理它们或阻止它们显示在启动列表中?

16.04及更新版本的Ubuntu

sudo apt autoremove

此命令删除自动安装以解决依赖关系的软件包,但现在不再依赖这些软件包。 这包括旧版本的 linux-headers-*linux-image-*. (这个过程也很聪明,留下一个备用版本的内核作为后备!)

11.10和更新版本的Ubuntu

GRUB2及其所有内核的显示

最新版本的 Grub2 安装于 Ubuntu系统 自动显示最新的内核并隐藏您可能已安装的旧内核。

GNU GRUB

如果你没有看到你的 n.食物,食物 -然后记得按 Shift 在启动的时候。

正如您所看到的,只显示最新的内核。

如果选择显示的选项(按 Enter)然后所有旧的内核都变得可见并可供启动。

GNU GRUB Previous versions

如何永久删除旧内核

使用最新的可用内核首次启动。

有许多方法可以删除旧的内核。 就个人而言,我不会碰 电脑看门人 因为这是公认的打破你的电脑与它的建议。

突触,突触

另一种选择是 突触,突触 (sudo apt install synaptic)

搜寻 linux-图像,右键单击一个内核并选择完全删除,最后单击 申请 按钮删除内核。

重复搜索,但这次是 linux-头 -您可以删除之前选择的内核映像的相关标头。

突触,突触 虽然不会尝试验证您试图删除的内容。.. 您可能会无意中删除最新的内核-甚至通过此工具删除所有内核,使您无法启动 Ubuntu系统!.

请记住检查您正在使用的内核类型:

uname -r

结果将类似于:

Terminal <uname -r>

记住结果和数字-确保您没有删除相应的图像或标题。

建议书

我的建议是保留至少两个或最好是三个内核,包括最新的。 建议的原因是,您将至少有一个/两个其他内核启动,如果由于什么原因,您无法启动最新的内核或引入一个倒退的功能,如破碎的无线。

首先,重新启动系统以确保它使用的是最新的内核。 然后打开终端并检查您当前的内核:

uname -r 

不要删除这个内核!

接下来,键入下面的命令以查看/列出系统上所有已安装的内核。

dpkg --list 'linux-image-*'

找到所有低于当前内核的内核。 当您知道要删除哪个内核时,请继续下面以将其删除。 运行下面的命令以删除您选择的内核。

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

最后,运行下面的命令来更新grub2

sudo update-grub2 

重新启动系统。

我的单行删除旧内核(这也释放了磁盘空间)

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

解释(记住, | 使用上一个命令的输出作为下一个命令的输入)

  • dpkg --list 列出所有已安装的软件包
  • grep linux-image 查找已安装的linux映像
  • awk '{ print $2 }' 只需输出第2列(即包名称)
  • sort -V 按版本号将项目按顺序排列
  • sed -n '/'`uname -r`'/q;p' 打印当前内核之前的行
  • xargs sudo apt-get -y purge 清除找到的内核

展开 sed 调用:

  • -n 告诉我们 sed 要安静
  • `uname -r` 输出当前已安装的内核版本-我们将其包含在反引号中,以便输出作为命令的一部分包含(您也可以将其视为 $(uname -r)
  • /something/q 说当你匹配'something'时停止(在这种情况下,something is output of uname -r)- / 环绕正则表达式
  • p 是印刷品
  • ; 是命令分隔符,所以 /something/q;p 说当你匹配的东西退出,否则打印

总共, sed -n '/'`uname -r`'/q;p' 打印行,直到它与当前内核名称匹配。

如果你是偏执狂(像我一样),你可以做最后一部分 xargs echo sudo apt-get -y purge 因此,清除旧内核的命令被打印出来,然后您可以在运行它之前检查没有意外包含。


修改版本以删除标题:

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 purgedpkg --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

注: sed 调用进行修改。 "$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")" 只提取版本(例如"3.2.0-44"),而不从 uname -r


All-in-one版本删除图像和标题(结合了上面的两个版本):

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

Ubuntu16.04+:

$ 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

Ubuntu15.10及更低版本:

我发现这是最简单,最快的方法。 它保留了最新的内核以及另外两个内核:

sudo apt-get install bikeshedsudo purge-old-kernels

更改保留的其他内核的数量:

sudo purge-old-kernels --keep 3

从Grub2Entries中删除条目应该通过编辑或删除/etc/grub中的文件来删除。d文件夹。 的/boot/grub/grub。cfg文件是只读的,通常不应该需要编辑。

内核太多了?

  • 如果您不确定当前正在使用的内核,请使用终端类型 uname-r的.

  • 通过APT(突触,&quot;apt-get remove&quot;等)删除内核。)将自动更新grub。cfg并且不需要用户操作。

  • 删除内核(和菜单项)的一个很好的工具是Ubuntu-Tweak,一个安全且易于使用的GUI应用程序。

  • 安装ubuntu tweak

  • Ubuntu-Tweak将在应用程序>系统工具下提供.

删除旧的内核条目

  • 选择左边的"包清洁"和右边的"清洁内核".

  • 按下右下方的"解锁"按钮,输入您的密码。

  • 从显示的列表中选择要删除的内核映像和标头。 未列出正在使用的内核。

  • 按右下角的"清理"按钮删除选定的内核映像和标头。

从Grub菜单中删除操作系统

  • 已从计算机中删除的其他操作系统也将从菜单中删除,一旦"update-grub"以root身份运行。

  • 菜单项由脚本放置在Grub2菜单上。 如果您不希望在菜单中输入其他操作系统,请禁用/etc/grub。d/30_osprober

  • 运行此命令可停止脚本运行
    sudo chmod -x /etc/grub.d/30_os-prober

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

从Grub菜单中删除Memtest86+
sudo chmod -x /etc/grub.d/20_memtest86+

  • 运行update-grub命令以允许将更改合并到grub中。[医]cfg

资料来源

注:内核更新后,一个新的条目被添加到GRUB菜单中.如果你愿意,你可以删除旧的。但是,大多数有经验的用户会建议您保留至少一个备用条目,以防升级出现问题,并且您需要启动较旧的内核版本以进行故障排除。

删除内核条目的替代方法(在10.04之前)

对于GRUB而不是GRUB2

初创企业

你可以在系统下找到它>>管理>>



您在第二个屏幕截图中看到,您可以选择要显示多少个内核? 我通常只是保持在1上,但是当我得到内核升级时,我总是在重新启动之前将其更改为2,所以如果新内核与我的硬件有问题,我可以选择较旧的内核。 一旦我知道新内核运行良好,我将其更改回1。

纯粹的命令行,这将删除所有,但当前和第二大电流(通过下面的head命令中的"-2"):

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 $OLDfiapt-get -qy autoremove --purge

更新资料: purge-old-kernels已弃用 如今。

我制作了一个脚本来清除内核,即使在棘手的条件下也是如此。 它被称为 linux-purge 你可以找到它 这里.

如果您只想清除比当前使用的内核旧的内核(以及相关的软件包),当系统没有损坏时,您可以使用 这个脚本.

还有一个Ubuntu文档页面,我为删除旧内核做出了贡献 这里.

您可以按照 使用"无人值守-升级"包部分自动安全更新 Ubuntu Wiki上的文章来执行此操作。

您需要更改以下行 /etc/apt/apt.conf。d/50附加-升级 档案;

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

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

自动删除旧包,包括内核。

同时删除或注释该行

"^linux-image.*"; 

在文件的"NeverAutoRemove"部分 /etc/apt/apt.conf。d/01自动爱。

最快/更简单的方法(至少从12.04开始适用)可能已经附带Ubuntu是 apt-get. 如果您希望删除所有未使用的旧内核版本(除了您未使用的前一个版本),请执行以下操作。 这是为了确保如果当前内核版本以某种方式失败,您有办法回到以前的状态)。 执行以下操作:

sudo apt-get autoclean

这将消除您可能拥有的任何旧文件(包括内核版本)。 请注意,如果您有许多旧版本,则需要一段时间,因为它必须确保删除内核版本没有问题。 对我来说,删除最后12个内核版本大约需要2分钟。 您还可以执行以下操作:

sudo apt-get clean

这将消除所有下载并存储在apt缓存文件夹中的内容。 最后你有:

sudo apt-get autoremove

它将检查任何未使用的包,并在必要时删除它们。 对于那些安装任何应用程序不再需要的库和依赖包来说,这非常棒。

要弄清楚安装了哪些内核和标头,请使用

dpkg -l | grep linux-imagedpkg -l | grep linux-headers

然后,您可以逐个或一起删除它们,只需确保保留最新的。

还有一些方便的命令和脚本来自动删除。

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

以下声明删除所有未使用的内核和标头:

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

(使用 apt-get -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 purgeReading package lists... DoneBuilding dependency tree       Reading state information... DoneThe 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-genericFound initrd image: /boot/initrd.img-4.15.0-36-genericFound linux image: /boot/vmlinuz-4.15.0-34-genericFound initrd image: /boot/initrd.img-4.15.0-34-genericAdding boot menu entry for EFI firmware configurationdoneRemoving 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-genericI: /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-genericFound initrd image: /boot/initrd.img-4.15.0-36-genericAdding boot menu entry for EFI firmware configurationdoneRemoving 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 removedPurging 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 -r4.15.0-36-generic

'sudo apt-get autoremove’应该在Ubuntu14.04+上做这个技巧

有一个名为purge-old-kernels的ubuntu命令来完成这项工作。 看我的答案了解更多信息。

我一直回到这一页。… @hobs的评论仅在您的内核自动安装时有效-但是您按照"apt-mark"建议进行"sudo apt-get autoremove–purge"答案https://help.ubuntu.com/community/RemoveOldKernels

旧内核的积累是一个错误,正在修复中:https://bugs.launchpad.net/bugs/1357093 … 当修复程序发布时,默认情况下,较旧的内核将自动更新。

@hobs这个命令在Ubuntu Studio14.04中没有为我做这个技巧,如果内核没有自动安装,而是通过软件更新程序安装。

除了删除旧的内核,如果你想摆脱菜单中的"恢复"项,请在"/etc/default/grub"中取消注释这一行:#GRUB_DISABLE_LINUX_RECOVERY=“true”

在最近的版本中,Ubuntu在Grub的子菜单中隐藏了内核,所以它并不那么突兀。 但是,删除额外的内核以节省空间可能是个好主意,特别是如果您有一个单独的小/引导分区。

我找不到任何答案,这将有助于从以前的版本升级Ubuntu到较新的版本后删除内核,即使有关它的特定问题已被标记为这个[here]的重复(http://askubuntu.com/q/153185/21005)。另请参阅相关的[错误报告](https://bugs.launchpad.net/ubuntu/+source/bikeshed/+bug/1586303)

我已经做了一个脚本来完成这项工作。 我会在我的赏金目标达到后发布它:Bountysource