it-swarm.cn

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

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

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

Ubuntu是否提供了更简单的方法来清理它们或阻止它们显示在引导列表中?

691
ImaginaryRobots

16.04和更新版本的Ubuntu

Sudo apt autoremove

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

11.10和更新版本的Ubuntu

GRUB2及其所有内核的显示

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

GNU GRUB

如果你没有看到你的grub - 那就记得按 Shift 在开机的同时。

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

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

GNU GRUB Previous versions

如何永久删除旧内核

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

有许多方法可以删除旧内核。就个人而言,我不会碰计算机管理员,因为这被承认打破了你的计算机的建议。

突触

另一种选择是SynapticSudo apt install synaptic

搜索linux-image,右键单击内核并选择完全删除,最后单击Apply按钮删除内核。

Synaptic Package Manager

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

Synaptic虽然不会尝试验证你要删除的内容...你可能无意中删除了你的最新内核 - 甚至删除了你的所有内核这个工具让你无法启动Ubuntu!.

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

uname -r

结果类似于:

Terminal <uname -r>

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

建议

我的建议是保留至少两个或最好是三个内核,包括最新内核。建议的原因是,至少有一个/两个其他内核可以启动,如果出于任何原因,您无法启动最新内核或引入回归功能,例如无线功能损坏。

595
fossfreedom

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

uname -r 

不要删除这个内核!

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

dpkg --list 'linux-image-*'

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

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

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

Sudo update-grub2 

重新启动系统。

377
penreturns

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

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是打印的
  • ;是命令separtor,所以/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/")"仅从uname -r中提取版本(例如“3.2.0-44”),不带“-generic”或类似名称


一体化版本删除图像和标题(结合上面的两个版本):

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
279
David Kemp

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
60
bmaupin

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

太多内核?

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

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

  • Ubuntu-Tweak是一款安全且易于使用的GUI应用程序,可用于删除内核(和菜单条目)。

  • 安装ubuntu Tweak

  • Ubuntu-Tweak将在Applications> System Tools下提供。

删除较旧的内核条目

  • 选择左侧的“Package Cleaner”和右侧面板中的“Clean Kernel”。

  • 按右下角的“解锁”按钮,输入您的密码。

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

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

从Grub菜单中删除操作系统

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

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

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

  • / etc/default/grub中的DISABLE_30_OS-PROBER ='true'

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

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

来源

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

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

GRUB不是GRUB2

startupmanagerInstall startupmanager

您可以在系统>>管理>>下找到它 alt text
alt text
您在第二个屏幕截图中看到,您可以选择要显示的内核数量?我通常只将它保持在1,但是当我获得内核升级时,我总是在重新启动之前将其更改为2,因此如果新内核的硬件出现问题,我可以选择较旧的内核。一旦我知道新内核运行良好,我就将其更改为1。

43
karthick87

纯粹的命令行,这将删除除当前和第二最新电流之外的所有电流(通过下面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
39
Kees Cook

更新:purge-old-kernels已弃用 现在。

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

如果您只想清除比当前使用的内核更旧的内核(和相关软件包),那么当系统没有损坏时,您可以使用 此脚本

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

34
jarno

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

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

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

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

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

同时删除或评论该行

"^linux-image.*"; 

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

29
Qwerty

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

Sudo apt-get autoclean

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

Sudo apt-get clean

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

Sudo apt-get autoremove

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

27
Luis Alvarado

要弄清楚安装了哪些内核和头文件

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|headersmodules)" | xargs Sudo apt-get -y purge

以下是在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
25
mikewhatever

10.04 GUI方法

Computer Janitor可以清理旧内核,我相信默认安装在Ubuntu中(但不是Kubuntu)。

GRUB 1,如果你正在使用它,在/boot/grub/menu.lst中有一个选项来指定它应该最多显示多少个内核。 GRUB 2,据我所知,没有。

25
maco

为了删除旧的Linux映像内核,首先在要保留的内核中启动。

您还可以使用命令uname -r检查内核版本,这样就不会错误地删除错误的内核版本。

现在转到synaptic包管理器并搜索linux-image并删除旧版本,除了upper命令显示的版本。一般来说,我更喜欢使用最新版本。

现在,当你重新启动时,你会看到一个更干净的grub菜单。

16
anurag-jain

您可以安装 buntu-Tweak 然后转到应用程序 - >系统工具 - > ubuntu Tweak和

enter image description here 单击包清理并清理内核。它不显示当前使用的内核,因此您将始终是安全的。

14
Lincity

就个人而言,我喜欢使用Synaptic。它让我对正在发生的事情感到更加安全。我用过的唯一一个可以删除旧内核的应用程序是 buntu Tweak

如何删除不使用的内核:

  • 打开UbuntuTweak
  • 单击左侧窗格中“应用程序”下的“包清洁程序”
  • 在“清洁视图”的右侧按“清洁内核”
  • 选择所有内核 - 我认为正在使用的内核未列出,但以防万一在终端中运行uname -a
8
Alan Featherston

您可以使用Synaptic卸载旧内核(linux-image-...软件包),这将从启动菜单中删除它们。注意不要删除正在运行的内核(可以使用uname -r检查其版本)。

请记住,如果出现问题,拥有一个或两个旧版本可以帮助您排除故障。

或者,您可以手动编辑/删除条目(gksu gedit /boot/grub/grub.cfg),但是当您更新到较新的内核时,它们将被重新生成。如果您正考虑删除recovery mode选项 - 请不要。如果你打破阻止你开机的东西,他们可以派上用场。


请参阅 本页。

6
evgeny

这是一个纯粹的命令行解决方案。

首先生成除当前运行的内核之外的所有已安装内核版本的列表:

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

或者生成除最后两个之外的所有已安装内核版本的列表:

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

检查列表。确保要保留的内核版本不属于列表。使用命令uname -r查看当前运行的内核的版本。

如果您对结果满意,可以使用apt-get删除包。

首先是干运行(以第一台发电机为例):

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

真正的运行:

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

如果要自动执行该过程,请添加--yes参数:

Sudo apt-get --yes purge $(
  ...)
4
lesmana

这个答案的优点是使用本机Ubuntu Bash而不安装第三方应用程序。不使用aptdpkg的自定义内核用户可以更改此bash脚本以满足其需要。这个答案基于( 如何有选择地一次性清除旧内核 )。

基于Zenity的解决方案

Zenity为终端提供了一个漂亮的GUI界面来处理列表并使用单选按钮选择项目:

rm-kernels 1

由于标题表示您启动的当前内核无法删除,因此未包含在列表中。报告的大小是/boot目录中保存的大小。更多内容保存在磁盘上,因为内核二进制文件也位于其他区域。 2017年7月27日注意:目录/usr/src/*kernel_version*/lib/modules/*kernel_version*现在也包括在内。

使用stat命令发现修改日期。在我的系统上,每次使用此引导内核时,日期为“触摸”如何找出上次引导特定内核版本的时间? =)cron重启脚本。但是,在您的系统上,日期将是内核发布日期,而不是您上次启动它的日期。

apt-get purge让你有机会中止

您将有机会查看将要清除的所有内容,并查看将要恢复的总磁盘空间(有些误导):

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] 

代码

将此代码复制到rm-kernels中名为/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

注意:您需要Sudo权限才能创建文件,因此请使用:

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

要使文件可执行使用:

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

服务器版本

rm-kernels-server是有选择地一次性删除内核的服务器版本。而不是GUI(图形)对话框,使用基于文本的对话框来选择要清除的内核。

  • 在运行脚本之前,您需要使用以下命令安装对话框函数

    Sudo apt install dialog

Dialog是默认的Ubuntu Desktop安装,但不在Ubuntu Server中。

样本屏幕

rm-kernels-server 1

rm-kernels-server 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

注意:在对dialog的调用中,指令--ascii-lines被传递给替换行绘制扩展字符集(ssh不喜欢)和“+ - ---- +“用于绘图框。如果您不喜欢这种外观,则可以使用--no-lines指令完全没有框。


2017年7月28日更新

每个内核的计算大小取自/boot/*kernel_version*,共5个文件,总计约50 MB。公式已更改为包含/usr/src/*kernel_version*/lib/modules/*kernel_version*中的文件。每个内核的计算大小现在约为400 MB。 rm-kernelsrm-kernels-server的上述代码已更新。但是,上面的示例屏幕尚未反映这些变化。

默认情况下,估计linux-headers的文件大小为125 MB,linux-image为220 MB,因为除非文件位于缓存中,否则du会非常缓慢。要使用du获取实际大小,请将任何参数传递给脚本。

现在,标题栏中显示了所有内核大小(不包括当前正在运行的版本,无法删除)的总和。

用于显示每个内核上次访问日期的对话框。在备份或类似操作期间,可以为所有内核大量覆盖此日期。该对话框现在显示修改日期

4
WinEunuuchs2Unix

使用sed永久删除旧内核的接受答案有一些缺陷,如果有人在升级内核后没有重新启动计算机,命令也会删除较新的内核。

这是一个替代解决方案,它将考虑所有情况,仅删除实际的旧内核:

#!/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

如果您有任何比当前版本更新的版本,这将提示您首先重新启动计算机。还要注意,由于一个很好的理由保留了较旧的内核,如果你以某种方式弄乱你当前的内核使你的系统不稳定,那么你应该能够启动任何旧的内核。

2
heemayl

摆脱几乎所有过时的软件包,不再包含在任何软件包列表中的软件包以及过时的内核的简单方法是执行以下操作之一:

dpkg --purge $(aptitude search ?obsolete)

但是,这将错过其他软件包仍然推荐的软件包,-R/ - without-recommended参数不能解决此问题。

在使用'o'切换排序模式后选择将显示所有过时的包,包括aptitude missses,但有些人不喜欢使用它。

2
Chris Cheney

ailurus 具有删除旧内核以及未使用配置的功能。我个人从synaptic手动删除它。您可以从 getdeb 以及 ppa 安装ailurus

1
sagarchalise

您可以使用ukuu - 它是所有GUI - 来更新和删除旧内核。适合我!

只记得保留最后2个安装,显然是'运行'内核。

您还可以将ukuu设置为仅显示主线版本,甚至是RC内核,隐藏点版本。

ukuu

您可以在Synaptic中找到ukuu,或者说明如下:

OMG!Ubuntu ukuu安装说明

1
sprocketoctopus

我在其他答案中给出了两种更安全的方法变体:一种使用突触管理器,另一种使用终端

通过这些变体,您只能删除系统识别为可移除的软件包。您没有删除当前使用的Linux内核的风险 - 因为它在几周前发生在我身上;

使用Synaptic Manager

而不是搜索linux-image over所有已安装的软件包,选择autoremovable软件包(参见图片中的红色椭圆)下面)。现在从这个列表中删除你想要的linux-image

---(enter image description here

使用终端

同样,如果要删除终端上的内核,只需运行autoremovable内核即可

 Sudo apt-get -s autoremove | grep linux-image

然后通过运行删除要从给定列表中删除的内核linux-image-x.x.x-x-generic

 Sudo apt-get purge linux-image-x.x.x-x-generic 
0
loved.by.Jesus

我使用unattended-upgrades所以我真的很喜欢 Qwerty的答案 将它配置为自动卸载旧的内核包。

但是有一个问题:安装新内核后,此过程将卸载当前正在运行的内核的软件包!

这并不能完全打破操作系统。实际上我很少注意到它已经发生,直到我需要热装一个模块(例如通过插入USB设备),然后找不到模块。

作为解决方案,我创建了一个脚本来生成一个虚拟包currently-installed-kernel,它可以有效地固定当前的内核包,直到下次启动。

该脚本名为pin-current-kernel-with-package.sh。这是 最新版本 (可能)和 第一版 (绝对)。

只需将该脚本保存在某处,然后 将其添加到启动过程中 。例如,将其保存在/root/bit/pin-current-kernel-with-package.sh中,然后编辑/etc/rc.local并添加以下行:

bash /root/bin/pin-current-kernel-with-package.sh

现在永远不会卸载正在运行的内核包!

0
joeytwiddle

如果您使用ansible来控制机器,这个剧本可能会有所帮助。

---
 - 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
0
flickerfly

下次删除旧内核时打开终端并使用以下命令:

Sudo apt-get autoremove linux-headers-2.6.38-10-generic

您可以使用Synaptic获取要删除的内核的确切名称。只需打开Synaptic并搜索“linux-headers”,然后选择要删除的内核条目。相关条目最后将标有“-generic”。

要清除整个系统中任何未使用的(遗留的)依赖项,请单独使用此命令:

Sudo apt-get autoremove
0
Chad--24216

我正在使用KDE桌面,我找到的最简单的选项是使用kde-config-grub2应用程序,如下所示: https://www.kubuntuforums.net/showthread.php?58075-remove-old -linux-versions (我已经安装了用于设置背景图像,默认启动选项等)。在您可以选择默认条目的下拉框旁边,有一个“删除旧条目”按钮。单击此按钮会显示所有已安装内核的列表,您可以选择要删除的内核。应用更改时,它将使用dpkg实际从系统中删除它们以及GRUB菜单。

0
Ben

以下字符串命令将清除所有已安装的Linux内核,但当前正在运行的内核(grep -v uname -r)和最新的可用内核(dpkg -l | .... | tail -1)除外:

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -v `dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1` | grep -v `uname -r` | xargs apt-get -y purge

我使用它来保持桌面的引导卷相对干净,但在服务器情况下,您可能希望扩展逻辑并编写一些额外的脚本来维护服务器引导的最后X内核的列表。

像启动脚本那样:

uname -r >> /root/bootedkernels
cat /root/bootedkernels | sort -u | tail -3 > /root/bootedkernels # Keep the last 3 booted kernels

然后使用:

dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | grep -vf /root/bootedkernels | grep -v `dpkg -l | grep -E linux-image-.*-generic | cut -d ' ' -f3 | tail -1` | grep -v `uname -r` | xargs apt-get -y purge
0
Alexander Thompson

试试这个。以root身份运行它。

保存这个脚本,比如./ keep-n-kernels.sh

作为命令行参数传递要保留的最新内核的数量。

    
#!/ bin/bash 
 
#传递n作为命令行参数,它会找到所有已安装的
#内核并且只保留最多n个最近的=>卸载所有旧的
 
 #dpkg -l'linux- *'| sed'/ ^ ii /!d; /'“$(uname -r | sed”s /\(.*\)-\([^ 0-9]\+ \)/\1 /“)”'/ d; s/^ [^] * [^] * \([^] * \)。*/\ 1 /;/[0-9] /!d'
 #this命令列出所有包除了最新内核外。
#source:https://help.ubuntu.com/community/Lubuntu/Documentation/RemoveOldKernels

n=$1
 
#找到已安装的内核版本:[。_____。]#dpkg-query -W -f ='$ {Version}\n''linux-image- *'| grep。 | sort -n 
#给出版本号,每行一个
 #dpkg-query -W -f ='$ {Version}\n''linux-image- *'| grep。 | sed's /\... $ // g'| grep -v'\ ... $'| sort -u 
#只给出出现在linux-image 
 
#suffix中的那些,例如-generic-pae 
#你启动的内核类型
后缀= $(uname -r | sed's:^ [0-9] \。[0-9] \。[ 0-9]\ -  [0-9]\{2 \} :: g')
 
 command =“apt-get purge”
 
 for版本在$(dpkg-query -W -f ='$ {Version}\n''linux-image- *'| grep。| sed's /\...$// g'| grep -v'\ ... $'| sort -u | head -n  -  $ {n})
做
 command = $ {command}“^ linux-image  -  $ {version} $ {suffix} “
做
 
 $命令

样品用法:

#./keep-n-kernels.sh 4#启动apt-get命令删除除最近的4个内核之外的所有内核

如果您想要[AND AT您自己承担风险],可以在apt-get命令中添加-y(或强制标志)并使其成为非交互式。

0
Sankalp

安装synaptic包管理器并转到过滤器选项卡(我认为过滤器,如果没有尝试全部5)并选择“本地”。这将显示系统上的孤立软件包,例如内核。卸载它们后,运行update-grub。该命令更新了grub的启动选项列表。

如果失败,您可以随时尝试apt-get remove linux-image-version-generic

0
Relish

我有一个脚本,不需要非常花哨的字符串解析。

删除除当前标题和图像以外的标题和图像以释放空间

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)+
0
Paulo Santos

删除通过常规系统更新自动安装的内核,打开终端并运行:

Sudo apt autoremove --purge

要了解当前的内核版本,请运行uname -r,并且还可以运行uname --help来阅读有关所有uname命令的更多信息

您还可以运行df -h来显示文件系统驱动程序,类似地,您可以运行df --help以获取更多信息。

要启用自动删除旧内核:使用gksu编辑配置文件

gksudo gedit /etc/apt/apt.conf.d/50unattended-upgrades

文件打开时,取消注释以下行并将值更改为true

//无人值守升级::删除 - 未使用 - 依赖关系“false”;

如果你需要安装gksu,你可以运行Sudo apt install gksu

要清除旧包,我们可以使用Sudo apt-get clean

欲了解更多信息,请访问 http://ubuntuhandbook.org/index.php/2016/05/remove-old-kernels-ubuntu-16-04/

0
Abdallah Okasha

只是为了报名,你也可以发出

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

作为根,工作将完成。

0
Severo Raz

根据David Kemp先前的回答,以下脚本将清除除最后2版本之外的所有标题和图像。

#!/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 -y purge
0
Mark

这是我所做的大致轮廓,小心,因为我不是linux的专家,确保你知道你在做什么,并备份你正在修改的任何文件。

gedit /boot/grub/grub.cfg

然后找到你想要保留的条目,我们将突出显示并复制它们

cd /etc/grub.d
ls

你会看到一个像10_linux和30_os-prober这样的文件列表

Sudo chmod -x 10_linux

这将停止表单自动将所有linux条目添加到grub启动菜单中。

gksudo gedit 40_custom

打开自定义启动菜单文件,然后返回到grub.cfg(仍应在gedit中打开),并复制您要保留的条目...例如

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
}

将它们粘贴到40_custom中,然后保存。

Sudo chmod 755 40_custom

使它可执行,然后最后我们更新grub将更改grub.cfg文件:

Sudo update-grub

现在,请注意,如果您更新内核或操作系统,您的启动菜单可能不会更新......您必须手动执行此操作。但是执行此过程将让您自定义引导菜单,例如删除内核版本,只需将ubuntu名称...即Ubuntu Lucid 10.04等...

希望有人觉得这很有帮助,因为我花了一段时间才弄清楚...没有在任何地方看到这个解决方案......

0
Joe

而是使用apt(人类的cli前端),而不是apt-get来清除旧内核映像:

$ Sudo apt autoremove --purge
...
The following packages will be REMOVED:
  linux-headers-4.4.0-51* linux-headers-4.4.0-51-generic* linux-image-4.4.0-51-generic* linux-image-extra-4.4.0-51-generic*
0
k0pernikus

要更好地控制要保留的版本,请明确选择要删除的版本。例如,如果要删除内核版本3.2.0。[49-53],请使用简单的for循环:

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

调整内核版本列表以适应。

0
NeilNjae