使用modprobe增删内核模块后,是否需执行update-initramfs -u以持久化?
你观察得非常仔细——很多基础教程确实只提modprobe和rmmod,但这俩命令其实只是临时加载/卸载内核模块,重启后就会回到初始状态。至于是否必须执行update-initramfs -u,得分两种情况来看:
一、什么时候必须执行update-initramfs -u?
如果你的修改涉及到initramfs镜像中包含的模块(比如像e1000e这类在系统启动早期就需要加载的硬件驱动模块),那确实必须执行这个命令。
原因很简单:Ubuntu的initramfs是一个压缩镜像,里面包含了系统启动初期必需的内核模块、驱动和工具。如果你的模块是在initramfs里的,那么重启时系统会先从这个镜像加载模块,而不是直接读硬盘上的模块文件。这时候你用modprobe临时修改后,不更新initramfs的话,重启后系统还是会从旧的镜像里加载原来的模块,你的修改自然就被还原了。
举个实际的例子:如果你给e1000e模块添加了参数(比如在/etc/modprobe.d/e1000e.conf里设置),或者替换了模块文件,这些改动要想在启动时生效,就必须更新initramfs,让新的配置/模块被打包进镜像里。
二、什么时候不需要执行update-initramfs -u?
如果你的模块是系统启动后期才加载的非核心模块(比如一些第三方外设驱动、虚拟设备模块),那只需要通过modprobe加载,再把模块名添加到/etc/modules-load.d/目录下的配置文件里,或者在/etc/modprobe.d/里做配置,重启后就能生效,不需要更新initramfs。
这类模块不在initramfs的依赖范围内,系统启动后会直接从/lib/modules/$(uname -r)/目录读取最新的模块文件和配置,所以不用动initramfs。
补充:为什么手册页没提模块相关内容?
update-initramfs的核心功能是更新initramfs镜像,而模块只是镜像里的一部分内容。手册页更侧重它的整体操作(比如生成镜像、指定内核版本等),没有专门把模块修改作为单独场景来写,这也是很多人容易忽略它的原因。
总结一下:
- 涉及启动早期加载的核心模块(比如e1000e这类硬件驱动):必须执行
update-initramfs -u才能让修改持久化 - 普通非核心模块:仅需配置
modprobe相关文件即可,无需更新initramfs
内容的提问来源于stack exchange,提问作者Alexey

