当前位置: 首页>>技术教程>>正文


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

, ,

问题描述

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

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

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

最佳答案

16.04 和更新版本的 Ubuntu

sudo apt autoremove

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

11.10 和更新版本的 Ubuntu

GRUB2 及其所有内核的显示

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

如果您没有看到您的 grub – 请记住在引导时按 Shift

如您所见,仅显示最新的内核。

如果您选择显示的选项(按 Enter ),那么所有旧内核都将变得可见并且可以从中启动。

如何永久删除旧内核

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

有多种方法可以删除旧内核。就个人而言,我不会接触 Computer Janitor,因为它的建议会破坏您的计算机。

突触

另一种选择是 Synaptic ( sudo apt install synaptic )

搜索 linux-image,右击一个内核并选择完全删除,最后点击应用按钮删除内核。

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

Synaptic 虽然不会尝试验证您要删除的内容…您可能会无意中删除最新的内核 – 甚至通过此工具删除所有内核,让您无法启动 Ubuntu!

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

uname -r

结果类似于:

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

Recommendation

我的建议是至少保留两个或最好三个内核,包括最新的内核。推荐的原因是,如果由于 what-ever 原因,您无法使用最新的内核进行引导或引入退化的功能(例如损坏的无线),您将至少有一个/两个其他内核可以引导。

次佳答案

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

uname -r 

不要删除这个内核!

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

dpkg --list 'linux-image-*'

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

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

最后,运行以下命令更新 grub2

sudo update-grub2 

重新启动系统。

第三种答案

我的 one-liner 删除旧内核(这也释放了磁盘空间)

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 }' 只输出第二列(包名)

  • sort -V 按版本号排列项目

  • sed -n '/'`uname -r`'/q;p' 打印当前内核之前的行

  • xargs sudo apt-get -y purge 清除找到的内核

展开 sed 调用:

  • -n 告诉 sed 安静

  • `uname -r` 输出当前安装的内核版本 – 我们将其包含在反引号中,以便输出作为命令的一部分包含在内(您也可以将其视为 $(uname -r)

  • /something/q 说当你匹配 ‘something’ 时停止(在这种情况下,输出 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 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

注意:sed 调用已修改。 "$(uname -r | sed "s/\\([0-9.-]*\\)-\\([^0-9]\\+\\)/\\1/")" 仅提取版本(例如 “3.2.0-44”),没有 “-generic” 或来自 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

第四种答案

Ubuntu 16.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

Ubuntu 15.10 及以下版本:

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

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

要更改保留的额外内核的数量:

sudo purge-old-kernels --keep 3

第五种答案

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

内核太多?

  • 如果不确定当前使用的内核,请在终端中键入 uname -r。\n

  • 通过 APT(Synaptic、“apt-get remove”等)删除的内核将自动更新 grub.cfg,无需用户操作。\n

  • Ubuntu-Tweak 是一个用于删除内核(和菜单项)的好工具,它是一个安全的 easy-to-use GUI 应用程序。\n

  • 安装 ubuntu tweak\n

  • Ubuntu-Tweak 将在 Applications > 下可用系统工具。\n

删除旧内核条目

  • 在左侧选择 “Package Cleaner”,从右侧面板选择 “Clean Kernel”。\n

  • 按右下角的”Unlock”键,输入密码。\n

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

  • 按右下角的 “Cleanup” 按钮删除选定的内核映像和标头。\n

从 Grub 菜单中删除操作系统

  • 一旦 “update-grub” 以根用户身份运行,其他已从计算机中删除的操作系统也将从菜单中删除。\n

  • 菜单项通过脚本放置在 Grub2 菜单上。如果您不想在菜单中输入其他操作系统,请禁用 /etc/grub.d/30_osprober\n

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

  • /etc/default/grub 中的 DISABLE_30_OS-PROBER=’true’\n

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

  • 运行 update-grub 命令以允许将更改合并到 grub.cfg 中

Source

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

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

对于 GRUB 而不是 GRUB2

startupmanager

您可以在系统>>管理>>下找到它\n\n\n您在第二个屏幕截图中看到您可以选择要显示多少个内核?我通常只是将它保持在 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 $OLD
fi
apt-get -qy autoremove --purge

第七种答案

更新:现在 purge-old-kernelsdeprecated

我制作了一个脚本,即使在棘手的条件下也能清除内核。它称为 linux-purge,您可以找到它 here

如果您只想清除比当前使用的内核旧的内核(和相关包),当系统没有损坏时,您可以使用 this script

还有一个 Ubuntu 文档页面,我参与了有关删除旧内核 here 的内容。

第八种答案

您可以按照 Ubuntu Wiki 上 Automatic Security Updates 文章的使用 “unattended-upgrades” 包部分来执行此操作。

您需要更改 /etc/apt/apt.conf.d/50unattended-upgrades 文件中的以下行;

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

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

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

同时删除或注释该行

"^linux-image.*"; 

在文件 /etc/apt/apt.conf.d/01autoremove 的 “NeverAutoRemove” 部分。

第九种答案

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

sudo apt-get autoclean

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

sudo apt-get clean

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

sudo apt-get autoremove

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

第十种答案

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

dpkg -l | grep linux-image

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

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/13225.html,未经允许,请勿转载。