![常见的计算机 Linux 发行版](https://linux22.com/image/1494263/%E5%B8%B8%E8%A7%81%E7%9A%84%E8%AE%A1%E7%AE%97%E6%9C%BA%20Linux%20%E5%8F%91%E8%A1%8C%E7%89%88.png)
我想问你如何才能彻底删除一些内核模块?我的意思是真正删除,而不是卸载或阻止加载。我尝试使用rmmod
,但它只是卸载模块,与一样modprobe -r
。所以我获取了所有正在使用的模块的列表modprobe -n -v
并手动删除它们。
rmmod cramfs:
ERROR: Module cramfs does not exist in /proc/modules
因此当我尝试加载模块时,我得到了:
modprobe -v -n cramfs:
FATAL: Could not open '/lib/modules/2.6.32-573.12.1.el6.x86_64/kerne/fs/cramfs/cramfs.ko': No such file or directory
但这意味着,系统仍然获得了一些有关已删除模块的信息,因为它知道文件的路径cramfs.ko
。未加载但可加载模块的示例:
modprobe -v -n jffs2
insmod /lib/modules/2.6.32-573.12.1.el6.x86_64/kernel/lib/zlib_deflat/zlib_deflate.ko
insmod /lib/modules/2.6.32-573.12.1.el6.x86_64/kernel/fs/jffs2/jffs2.ko
rmmod jffs2
ERROR: Module jffs2 does not exist in /proc/modules
有没有什么方法可以正确删除模块?
答案1
这取决于您的发行版/系统。
Linux可加载模块ko 文件位于 中/lib/modules/$(uname -r)/
,并按子文件夹排序。此文件夹中的几个文件有助于处理所有文件,尤其是modules.dep[.bin]
和modules.order[.bin]
。modprobe
阅读这些文件可获取模块及其依赖项的完整路径。
常见的计算机 Linux 发行版
在大多数 Linux 发行版中,模块文件由包管理器的包安装。例如,核心包由名为 的通用包安装kernel-modules
,而在某些发行版中,可以使用特定包安装额外的较少使用的模块(模块被分成几个包)。您可以找到哪些包提供了不需要的模块并将其卸载。
被警告:
- 即使您卸载了特定的额外模块包,其名称和路径仍会列在
module.order
和modules.dep
文件中。这些文件并不构成威胁,您需要它们才能使用modprobe
。仅当您卸载核心模块包时,它们才会被删除。 - 卸载模块可能会破坏您的系统,因为会删除内核的主要功能。您可能希望执行
lsmod
以获取不应删除的模块的最小列表。
您可能想编辑文本文件以删除不需要的模块的引用,但编辑二进制文件对应部分可能很乏味,并且每次更新包时都会恢复这些文件。
嵌入式系统
小型嵌入式系统仍可依赖可加载模块,但可能不提供任何包管理器。您可能需要完全重建嵌入式系统才能对其进行更改,因为某些嵌入式系统使用只读根文件系统。
完全重建您的内核或嵌入式系统
根据您的需要,您可能需要重建内核以便
- 删除不需要的功能的支持
- 尽可能在内核内部构建可加载模块,以减少对可加载模块的使用
- 启用模块签名,这样你的内核就会拒绝修补或外来的模块
- 甚至删除内核对可加载模块的支持,这样就根本无法加载模块
但做到这一点需要一些技巧。
其他内核强化技术
还有一些其他易于使用的机制可以提高内核针对动态加载模块的安全性:
- 写入 1 至sysctl kernel.modules_disabled特殊文件(实际上是 /proc/sys/kernel/modules_disabled)拒绝任何进一步的可加载模块的加载或卸载,冻结它们。
- 做同样的事情内核.kexec_load_disabled拒绝任何人热切换到另一个内核二进制文件(相当新的内核功能,用于在服务器上应用内核升级而无需停机)
答案2
模块在运行时以某种方式加载到 RAM 中(并链接到正在运行的内核)。在此之前,它们(仅)使用磁盘空间(或等效空间)。
你可以节省一点磁盘通过构建自己的内核(该内核已配置模块)来节省空间。内核将是一个非常微小如果您构建一个包含您需要的任何内容(不是模块,而是内置)的内核,那么使用相关功能会快一点。但这会极大地影响灵活性和麻烦。
答案3
如果内核模块没有加载,就相当于不存在,除非它已内置于内核(我将在下面解释),唯一的例外是您通常可以稍后使用命令重新加载它insmod
。
在错误消息中收到路径的原因modprobe
是因为modprobe
硬编码来检查模块的标准位置(参考)。没有配置文件或任何指示modprobe
如何执行此操作的内容。(如果您的模块不在标准路径中,而您想插入它,您可以随时使用insmod
)。
模块在内核启动后由内核之外的某种机制加载。 systemd
可以加载模块,所以 也可以udev
。 您必须找出系统使用的机制,并将模块列入黑名单。
jffs2
强烈建议您在路由器或其他设备(如 Android 手机)上执行此操作。需要有关设备品牌/型号的更多信息,以便在此处为您提供具体建议。
您可能收到有关 /proc/modules 的错误的原因有两个:
在您的示例中
modprobe jffs2
,然后您收到错误rmmod
- 可能是insmod jffs2.ko
没有工作,但没有打印错误消息。检查您的日志(dmesg
等)是否有错误。虚拟文件系统
proc
未挂载。诸如chroot
、SELinux 和内核功能之类的东西可能会阻止您/proc
以 root 身份访问或挂载。检查是否可以ls /proc
,并获得类似于系统上每个 PID 的目录列表。如果您在 中运行此程序,则chroot
必须将 mount 绑定/proc
到chroot
。
可以构建一个模块进入内核。这使它成为内核的一部分。此时它不再是一个模块,因此rmmod
其他东西将无法工作。我不确定如果您尝试使用insmod
内核的一部分模块会发生什么(它可能会给您一个神秘的“文件正在使用”错误,指的是内核资源已在使用中)。
内置对磁盘控制器等的支持是很常见的,并且一些嵌入式平台可能仍然对访问软件所需的设备执行相同的操作。