我不知道为什么

我不知道为什么

今天,我注意到该目录/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.

在每个目录中,都留有以下文件(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

对于 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

对于一个已经运行了 2 年且所有内核都已升级的系统,这相当于约 50 个旧目录。对于普通的 Intel/AMD 系统,它大约是 100 MB,对于 Raspberry Pi,它总共超过 300 MB - 随着时间的推移,它会累积到一定程度。

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

我最近从 Ubuntu 20.04 升级到了 22.04(这就是我要进行一些清理工作的原因)。

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

答案1

我不知道为什么

我认为你不会得到一个很好的答案来解释为什么 Ubuntu 会以这种方式做某事。

历史

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

sudo apt autoremove

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

向前进

您无需编写脚本来删除它们。以下命令即可完成此任务:

sudo apt --purge autoremove

注意,你必须先运行此命令软件更新进行清理。

打扫干净

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

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

apt list --installed linux-image*

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

答案2

背景信息

从评论和@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

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

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

linux-purge -b

正在进行的错误报告

此外,由于该问题已在 Ubuntu Discourse 上报告,错误报告已开始处理此问题。任何感兴趣的人都可以关注那里的进展。

答案3

对于像我这样的懒人来说。我创建了文件

cat /etc/apt/apt.conf.d/zz_purge 
APT::Get::Purge "true";
Binary::apt::Purge "true";

APT::Get::AutomaticRemove "true";
APT::Get::Purge-Unused "true";
Binary::apt::APT::Purge-Unused "true";
Binary::apt::APT::AutomaticRemove "true";

无论我使用 apt 还是 apt-get,以及使用 autoremove,我的软件包都会被清除。而且,每当我安装或删除软件包时,不再需要的软件包也会被清除。

相关内容