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

Ima*_*ots 735 cleanup grub2 kernel

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

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

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

fos*_*dom 626

16.04 及更新版本的 Ubuntu

sudo apt autoremove
Run Code Online (Sandbox Code Playgroud)

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

11.10 及更新版本的 Ubuntu

GRUB2 及其所有内核的显示

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

GNU GRUB

如果你没有看到你的grub - 然后记得Shift在启动时按下。

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

如果您选择显示的选项(按Enter),则所有旧内核都将变为可见并可用于引导。

GNU GRUB 以前的版本

如何永久删除旧内核

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

有多种方法可以删除旧内核。就我个人而言,我不会碰Computer Janitor,因为这被认为会用它的建议破坏你的计算机。

突触的

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

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

突触包管理器

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

尽管Synaptic不会尝试验证您要删除的内容……您可能会无意中删除最新的内核 - 甚至通过此工具删除所有内核,从而导致Ubuntu无法启动!

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

uname -r
Run Code Online (Sandbox Code Playgroud)

结果将类似于:

终端 <uname -r>

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

推荐

我的建议是保留至少两个或最好三个内核,包括最新的。推荐的原因是您将至少有一个/两个其他内核可以启动,如果由于某种原因您无法使用最新的内核启动或引入了退化的功能,例如无线中断。

  • 删除大约 20 个旧版本的 `linux-image` 和 `linux-headers` 在我的机器上释放了 4.5GB 的空间。 (38认同)
  • 这种方法效果很好,但是删除每个内核会过度重新生成 grub.cfg,这需要时间。有没有办法禁用批量删除,然后重新生成一次? (16认同)
  • 我第二个来自@spacediver 的问题——当你有 38 个不需要的内核时,这是一个非常缓慢的过程,因为当每个内核都被卸载时,它会在生成新的 grub.cfg 时遍历所有剩余的内核。这就是我们所说的 N^2 操作 - 它处理内核大约 (38^2 / 2) = 722 次,并且非常慢。当然 Ubuntu 可以想出更好的东西...... (16认同)
  • `apt-get` 行末尾的 `-y` 开关是必要的,否则 apt-get 只会要求确认,并且由于输入是管道,它只会中止。所以它应该以:`| xargs sudo apt-get purge -y` (4认同)
  • 使用突触删除旧的“linux-image*”包,也适用于 10.04。(我提到它是因为标题表明它可能仅适用于 11.10 及更高版本) (3认同)
  • `autoremove` 无法让我删除旧的 linux 映像。 (3认同)

pen*_*rns 405

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

uname -r 
Run Code Online (Sandbox Code Playgroud)

不要移除这个内核!

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

dpkg --list 'linux-image-*'
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get purge linux-image-x.x.x-x-generic 
Run Code Online (Sandbox Code Playgroud)

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

sudo update-grub2 
Run Code Online (Sandbox Code Playgroud)

重新启动系统。

  • 可以使用 bash 的 **brace 扩展**,例如 `sudo apt-get purge linux-image-3.2.0-3{0..5}-generic`(删除 30,31,..,35) (94认同)
  • 在 10.04 和 12.04 中执行此操作时,我发现 update-grub 在清除过程中自动运行。 (35认同)
  • 之后无需重新启动系统。事实上,您应该在执行这些步骤之前_before_重新启动系统,以确保您使用的是您可能刚刚下载和安装的最新内核版本(您在此之前进行了 apt-get update &amp;&amp; apt-get upgrade ,对吧??) (13认同)
  • 您可能还想卸载 UEFI 系统中可能安装的 `linux-signed-image` 软件包:`sudo apt-get purge linux-signed-image-3.11.0-{12,14,24}-generic`将删除 12、14 和 24 (4认同)

小智 296

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

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

说明(记住,|使用上一条命令的输出作为下一条命令的输入)

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

展开sed调用:

  • -nsed要安静
  • `uname -r` 输出当前安装的内核版本 - 我们将其包含在反引号中,以便将输出作为命令的一部分包含在内(您也可能将其视为 $(uname -r)
  • /something/q当您匹配“某物”时说停止(在这种情况下,某物是 的输出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
Run Code Online (Sandbox Code Playgroud)

注意:sed调用被修改。"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"仅提取版本 (例如 "3.2.0-44") ,不提取 "-generic" 或类似的uname -r


删除图像和标题的多合一版本(结合了上述两个版本):

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
Run Code Online (Sandbox Code Playgroud)

  • 这是一个经过调整的一体化版本:`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)`另见我的[答案](http://askubuntu.com/a/571360/21005)。 (20认同)
  • 不,不要这样做!“那个oneliner看起来有点危险,但220个投票者肯定不会错!” 我想了想,盲目地复制粘贴。重新启动,直接进入 GRUB。该命令擦除了我所有的内核,包括我正在使用的内核。也许我正在运行一个实时内核,甚至不记得了。目前正在我家四处寻找 U 盘来安装 Ubuntu Live CD :( (7认同)
  • 由于未满足的依赖关系,我需要将它与 `dkpg -P` 一起使用。这是完整版本:`dpkg --list | grep 'linux-headers' | awk '{ 打印 $2 }' | 排序 -V | sed -n '/'"$(uname -r | sed "s/\([0-9.-]*\)-\([^0-9]\+\)/\1/")"' /q;p' | xargs sudo dpkg -P` (5认同)
  • 请注意,将当前内核版本匹配为这样的正则表达式有点危险:点匹配任何字符而 3.1.2-23 匹配 3.1.2-2(或者其他方式)。另见我的[答案](http://askubuntu.com/a/571360/21005)。 (2认同)

bma*_*pin 62

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
Run Code Online (Sandbox Code Playgroud)

Ubuntu 15.10 及以下:

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

sudo apt-get install bikeshed
sudo purge-old-kernels
Run Code Online (Sandbox Code Playgroud)

要更改保留的附加内核数:

sudo purge-old-kernels --keep 3
Run Code Online (Sandbox Code Playgroud)

  • 在 16.04 中,byobu 包提供了 purge-old-kernels(提示:`apt-file search purge-old-kernels`)。同意`apt-get -y`,我会删除它。 (2认同)

kar*_*k87 44

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

内核太多?

  • 如果您不确定当前使用的内核,请在终端中输入uname -r

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

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

  • 安装 ubuntu 调整

  • Ubuntu-Tweak 将在应用程序 > 系统工具下可用。

删除较旧的内核条目

  • 选择左侧的“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

启动管理器 安装启动管理器

您可以在系统>>管理>>下找到它 替代文字
替代文字
您在第二个屏幕截图中看到,您可以选择要显示多少个内核?我通常只是将它保持在 1,但是当我进行内核升级时,我总是在重新启动之前将其更改为 2,这样如果新内核的硬件有问题,我就可以选择旧内核。一旦我知道新内核运行良好,我就把它改回 1。

  • 实际上,startupmanager 在 Ubuntu 10.04 上给了我一个这样的窗口,而不是它只给了一个带有两个选项卡的窗口 -&gt; 引导选项和高级......并且在高级它可以选择限制内核的数量。所以请更新 Ubuntu 10.04 的答案。(这就是为什么我不赞成这个......) (2认同)

Kee*_*ook 41

纯粹的命令行,这将删除除当前和第二大当前之外的所有内容(通过下面 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
Run Code Online (Sandbox Code Playgroud)

  • @DmitryPaskal 一如既往,不要只是在不理解它们的情况下复制粘贴它们。在我的机器上,这个单行也匹配不应删除的`linux-libc-dev:amd64`。 (10认同)
  • 来自 [那里] 的单线(http://tuxtweaks.com/2010/10/remove-old-kernels-in-ubuntu-with-one-command/):```dpkg -l linux-* | awk '/^ii/{ 打印 $2}' | grep -v -e `uname -r | cut -f1,2 -d"-"` | grep -e [0-9] | xargs sudo apt-get -y purge``` (9认同)

jar*_*rno 38

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

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

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

还有一个 Ubuntu 文档页面,我在此处贡献了有关删除旧内核的内容。


小智 30

您可以按照使用“无人参与升级”包款自动安全更新在Ubuntu维基文章来执行此。

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

//Unattended-Upgrade::Remove-Unused-Dependencies "false";
Run Code Online (Sandbox Code Playgroud)

Unattended-Upgrade::Remove-Unused-Dependencies "true";
Run Code Online (Sandbox Code Playgroud)

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

同时删除或注释该行

"^linux-image.*"; 
Run Code Online (Sandbox Code Playgroud)

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

  • 我这样做了,但它仍然收集了 3 个以上的旧内核,消耗了 100 MB 的内存。因此,我将 `apt-get autoremove` 添加到我实际进行升级的日常 cron 工作中,因为它并不总是通过内置的更新管理器。 (2认同)

Lui*_*ado 28

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

sudo apt-get autoclean
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get clean
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get autoremove
Run Code Online (Sandbox Code Playgroud)

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

  • 是的,这对我来说效果很好,可以正确清理所有旧内核,并且不依赖疯狂的单行脚本!推荐,希望我能不止一次投票! (5认同)
  • 我可以确认`sudo apt-get autoremove` 确实删除了 14.04 中的旧(不止一个版本)内核。您可能必须在升级内核之前和之后运行它。当我在升级之前运行时,它只删除了旧内核的通用版本。然后,在升级我的内核后,它也删除了旧内核的低延迟版本。 (2认同)

mik*_*ver 27

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

dpkg -l | grep linux-image

dpkg -l | grep linux-headers
Run Code Online (Sandbox Code Playgroud)

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

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

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
Run Code Online (Sandbox Code Playgroud)

(用于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
Run Code Online (Sandbox Code Playgroud)


mac*_*aco 26

10.04 图形用户界面方法

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

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

  • **不应使用 Computer Janitor ** - 它有问题,现在已作为默认应用程序在 natty/oneiric/precise 中删除。 (4认同)
  • 相反,按照另一个答案(它自己的 ppa)中的描述安装“Ubuntu Tweak”,它有自己的“计算机管理员”(不要与旧版 ubuntu 中暂时可用的“计算机管理员”混淆) (2认同)

anu*_*ain 17

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

您还可以使用命令检查内核版本uname -r,以免误删除错误的内核版本。

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

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


Lin*_*ity 15

您可以安装ubuntu-tweak,然后转到应用程序 -> 系统工具 -> ubuntu 调整和

在此处输入图片说明单击包清洁器和清洁内核。它不显示当前使用的内核,因此您将始终安全。


Ala*_*ton 9

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

如何删除您不使用的内核:

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


evg*_*eny 7

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

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

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


请参阅此页面。


les*_*ana 5

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

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

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

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

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

检查清单。确保您要保留的内核版本不在列表中。使用命令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)))
Run Code Online (Sandbox Code Playgroud)

然后是真正的运行:

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)))
Run Code Online (Sandbox Code Playgroud)

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

sudo apt-get --yes purge $(
  ...)
Run Code Online (Sandbox Code Playgroud)


Win*_*nix 5

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

基于 Zenity 的解决方案

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

rm-内核 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] 
Run Code Online (Sandbox Code Playgroud)

编码

将此代码复制到名为的可执行文件rm-kernels/usr/local/bin

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] 
Run Code Online (Sandbox Code Playgroud)

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

#!/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
Run Code Online (Sandbox Code Playgroud)

要使文件可执行,请使用:

gksu gedit /usr/local/bin/rm-kernels
Run Code Online (Sandbox Code Playgroud)

服务器版本

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

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

    sudo apt install dialog

对话框位于默认的 Ubuntu 桌面安装中,但不在 Ubuntu Server 中。

示例画面

rm-内核-服务器 1

rm-kernels-server bash 代码

sudo chmod +x /usr/local/bin/rm-kernels
Run Code Online (Sandbox Code Playgroud)

注意:在对dialog指令的调用中,--ascii-lines通过ssh“+-----+”替换绘制框的画线扩展字符集(不喜欢)。如果您不喜欢这种外观,您可以完全使用--no-linesno box 指令。


2017 年 7 月 28 日更新

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

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

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

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


归档时间:

查看次数:

1145368 次

最近记录:

5 年,7 月 前