为什么 Ubuntu 在删除旧内核时不清除旧内核模块文件(在 /lib/modules 中)?

Art*_*ild 11 cleanup kernel

今天,我注意到该目录/lib/modules仍然包含以前安装的内核中的所有目录,因此:

$ ls /lib/modules
5.4.0-29-generic  5.4.0-31-generic  5.4.0-33-generic  5.4.0-37-generic  5.4.0-39-generic
5.4.0-40-generic  5.4.0-42-generic  5.4.0-45-generic  5.4.0-47-generic  5.4.0-48-generic
...  etc.
Run Code Online (Sandbox Code Playgroud)

在每个目录中,都留下以下文件(Intel/AMD系统):

$ ls -l
-rw-r--r--  1 root 143K 2022-04-28 18:36 modules.alias
-rw-r--r--  1 root 154K 2022-04-28 18:36 modules.alias.bin
-rw-r--r--  1 root 8.0K 2022-04-08 10:44 modules.builtin
-rw-r--r--  1 root  25K 2022-04-28 18:36 modules.builtin.alias.bin
-rw-r--r--  1 root  11K 2022-04-28 18:36 modules.builtin.bin
-rw-r--r--  1 root  63K 2022-04-08 10:44 modules.builtin.modinfo
-rw-r--r--  1 root  85K 2022-04-28 18:36 modules.dep
-rw-r--r--  1 root 123K 2022-04-28 18:36 modules.dep.bin
-rw-r--r--  1 root  268 2022-04-28 18:36 modules.devname
-rw-r--r--  1 root 215K 2022-04-08 10:44 modules.order
-rw-r--r--  1 root  489 2022-04-28 18:36 modules.softdep
-rw-r--r--  1 root 279K 2022-04-28 18:36 modules.symbols
-rw-r--r--  1 root 326K 2022-04-28 18:36 modules.symbols.bin
Run Code Online (Sandbox Code Playgroud)

对于 Raspberry Pi(注意尺寸差异):

-rw-r--r--  1 root 859K 2022-04-25 17:31 modules.alias
-rw-r--r--  1 root 893K 2022-04-25 17:31 modules.alias.bin
-rw-r--r--  1 root  11K 2022-04-04 13:33 modules.builtin
-rw-r--r--  1 root  27K 2022-04-25 17:31 modules.builtin.alias.bin
-rw-r--r--  1 root  14K 2022-04-25 17:31 modules.builtin.bin
-rw-r--r--  1 root  84K 2022-04-04 13:33 modules.builtin.modinfo
-rw-r--r--  1 root 399K 2022-04-25 17:31 modules.dep
-rw-r--r--  1 root 548K 2022-04-25 17:31 modules.dep.bin
-rw-r--r--  1 root  250 2022-04-25 17:31 modules.devname
-rw-r--r--  1 root 209K 2022-04-04 13:33 modules.order
-rw-r--r--  1 root  950 2022-04-25 17:31 modules.softdep
-rw-r--r--  1 root 354K 2022-04-25 17:31 modules.symbols
-rw-r--r--  1 root 425K 2022-04-25 17:31 modules.symbols.bin
Run Code Online (Sandbox Code Playgroud)

对于已运行 2 年并且所有内核均已升级的系统来说,这相当于约 50 个旧目录。对于普通的 Intel/AMD 系统,大约为 100 MB,而对于 Raspberry Pi,总共超过 300 MB - 随着时间的推移,它会达到一定的量。

所以我想知道为什么这些旧模块目录和已删除内核的文件没有作为清理过程的一部分删除?

我最近从 Ubuntu 20.04 升级到 22.04(这就是为什么我无论如何都要进行一些清理工作)。

就目前情况而言,我想知道是否应该为这些剩余目录制作自己的清理脚本。不过,我很好奇为什么它不会自动完成。

use*_*186 14

我不知道为什么

我认为你不会得到一个很好的答案来解释为什么 Ubuntu 会这样做。

历史

直到几年前,Ubuntu 还没有清理任何内核和内核头包。现在,软件更新会删除旧的和未使用的内核。我认为它的运行方式类似于:

sudo apt autoremove
Run Code Online (Sandbox Code Playgroud)

不幸的是,它留下了这些模块文件。

向前进

您不必编写脚本来摆脱它们。以下命令将完成这项工作:

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

请注意,您必须在软件更新进行清理之前运行此命令。

打扫干净

至于留下的现有模块,您必须手动删除它们,确保不会删除当前正在使用的任何模块文件夹。

使用此命令查找已安装内核的列表:

apt list --installed linux-image*
Run Code Online (Sandbox Code Playgroud)

如果 Ubuntu 已经删除了旧内核,那么您应该会看到两个或三个条目,包括 linux-image meta package linux-image-generic。记下安装内核的内核版本号,并确保不要删除已/lib/modules/安装内核的子文件夹。希望这可以帮助


Art*_*ild 6

背景信息

从评论和@user68186的回答中,我现在可以得出,为什么apt隐含地遵循了幕后的工作方式。

我的问题中的模块文件显然属于配置文件类别,这意味着它们不会被正常删除apt autoremove,但只有在您提供--purge选项时才会被删除。

然而,特别是对于 Raspberry Pi(以及可能的其他特殊架构),如果系统通过内核更新运行足够长的时间,这些配置文件在某些​​时候可能达到千兆字节。

因此,最好了解该sudo apt autoremove --purge选项,它会删除所有以前的内核配置文件,包括模块配置。

自动化内核管理工具

正如 @DougSmythies 所指出的,有一个名为 的自动化内核管理工具linux-purge。我已经测试过这个,看起来效果很好。

要安装此实用程序,请执行以下操作(如root)。这将安装脚本、联机帮助页和bash自动完成功能。

$ wget https://git.launchpad.net/linux-purge/plain/update-linux-purge
$ chmod +x ./update-linux-purge && ./update-linux-purge
Run Code Online (Sandbox Code Playgroud)

现在,您可以通过命令 来使用该实用程序linux-purge,并且可以通过 来获取其手册页man linux-purge

例如,要清除所有旧内核(内部不存在/boot),请运行:

linux-purge -b
Run Code Online (Sandbox Code Playgroud)

持续的错误报告

此外,由于 Ubuntu Discourse 上报告了该问题,因此已发布错误报告来解决该问题。有兴趣的可以关注那里的进展。