blacklist单独写无效,因其仅拦截显式modprobe调用,无法阻止udev自动加载、依赖触发或initramfs预加载;真正生效需同时配置blacklist module_name和install module_name /bin/false,并更新initramfs。

为什么 blacklist 单独写进 /etc/modprobe.d/ 没用
直接在 /etc/modprobe.d/disable-legacy-fs.conf 里写 blacklist cramfs 或 blacklist romfs,几乎一定失效。因为 blacklist 只拦截显式调用 modprobe cramfs 的行为,而内核在挂载特殊镜像、解析 initramfs、甚至某些调试接口触发时,会绕过 modprobe,直接走 request_module() 加载模块。更关键的是,很多陈旧文件系统(如 cramfs、romfs、freevxfs)已被打包进 initramfs,配置还没读,模块早已加载。
真正生效的禁用组合:install + initramfs 更新
必须同时满足三项,缺一不可:
- 配置文件放在
/etc/modprobe.d/下、以.conf结尾,例如/etc/modprobe.d/disable-cramfs.conf - 内容包含两行:
blacklist cramfs和install cramfs /bin/false(注意不是/bin/true,/bin/false才能确保返回非零退出码,让内核放弃加载) - 执行
sudo update-initramfs -u(Debian/Ubuntu)或sudo dracut --force(RHEL/Fedora),否则重启后仍从旧 initramfs 加载
验证命令:modprobe -n -v cramfs 输出中必须含 install /bin/false,而非 insmod /lib/modules/...。
模块是 built-in 时只能靠内核参数屏蔽
如果 grep CONFIG_CRAMFS /boot/config-$(uname -r) 返回 CONFIG_CRAMFS=y,说明它已编译进内核,/etc/modprobe.d/ 配置完全无效。此时唯一办法是加启动参数:
Zynq‑7000 / Zynq UltraScale+ 硬件调试技能。适用于 Xilinx Zynq(Cortex‑A9/A53 + FPGA)Linux 环境,调试 I2C、I2S、UART、GPIO 等外设。包括设备树配置、内核驱动、用户空间调试工具、交叉编译和常见问题排查,支持 PetaLinux 开发。
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT中追加modprobe.blacklist=cramfs,romfs,freevxfs - 运行
sudo update-grub(Debian/Ubuntu)或sudo grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL) - 重启后,
cat /proc/cmdline应能看到该参数;lsmod | grep cramfs无输出
注意:built-in 模块无法卸载,该参数仅阻止其在 initramfs 后被“重复加载”,实际功能仍存在——但至少不会被用户态或 udev 触发意外使用。
别忘了检查并清理已加载的残留模块
即使配置生效,之前已加载的模块仍驻留内存,需手动清除:
- 先查依赖:
lsmod | grep -E "(cramfs|romfs|freevxfs)";若显示被loop或overlay引用,得先停相关服务(如systemctl stop docker) - 逆序卸载:
sudo modprobe -r cramfs(通常无依赖,可直卸);若失败,用sudo rmmod cramfs强制卸载(仅当确认无设备正用该格式) - 确认清空:
dmesg | tail -10不应再出现cramfs: loading module类日志;lsmod | grep cramfs必须为空
真正干净的禁用,不是“配完就完”,而是让模块既不能自动加载,也不能继续驻留——尤其当系统曾运行过嵌入式镜像或旧版容器时,这些驱动可能早被悄悄拉进内存了。










