单靠 blacklist 几乎一定失败,因其仅拦截显式 modprobe 调用,无法阻止 udev 自动加载、依赖触发或 initramfs 预加载;真正有效的是 blacklist 与 install module_name /bin/false 成对使用,并置于 /etc/modprobe.d/*.conf 中,且必须更新 initramfs。

单靠 blacklist 几乎一定失败——它只拦得住手动 modprobe,拦不住 udev、依赖触发、initramfs 预加载。
为什么 blacklist 单独写没用
内核模块加载不是只靠用户敲命令。现实里:usb-storage 会在插 U 盘时被 udev 自动调用;nf_nat 可能被 nft 规则隐式触发;initramfs 启动阶段早已把模块塞进内存,配置文件根本还没读。
常见错误现象包括:配置改了、update-initramfs -u 也跑了,但插设备后 dmesg 仍打出 usb-storage: loading,lsmod | grep usb-storage 仍有输出。
真正起作用的是组合动作:
-
blacklist module_name(声明屏蔽) -
install module_name /bin/false(拦截所有加载路径) - 配置文件必须放在
/etc/modprobe.d/下且以.conf结尾 - 必须运行
sudo update-initramfs -u(Debian/Ubuntu)或sudo dracut --force(RHEL/Fedora)
怎么确认模块名和是否已编译进内核
别猜,先查准。模块名不是设备名,也不是 .ko 文件全名(比如写 usb-storage.ko 就错)。
执行:
lshw -C network | grep -A 10 "configuration:"
或:
ethtool -i enp0s3 | grep driver
拿到的是驱动名(如 igb、cdc_ether),直接用于配置。
如果:
grep CONFIG_USB_STORAGE /boot/config-$(uname -r)
返回 CONFIG_USB_STORAGE=y,说明是 built-in 模块,/etc/modprobe.d/ 完全无效。此时只能加内核参数:
- 编辑
/etc/default/grub,在GRUB_CMDLINE_LINUX_DEFAULT行末加modprobe.blacklist=usb-storage - 运行
sudo update-grub(Ubuntu/Debian)或sudo grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL) - 重启——注意:built-in 模块无法卸载,该参数仅阻止重复“加载”,功能仍在
验证是否真生效的三个硬检查点
改完别 reboot,先跑这三步:
- 执行
modprobe -n -v usb-storage:输出里必须含install /bin/false,而不是insmod /lib/modules/... - 插上对应设备(如 U 盘),立刻
dmesg | tail -10:不能出现usb-storage、scsi add-single-device等 probe 日志 -
lsmod | grep usb-storage:必须无输出;若已有,先sudo modprobe -r usb-storage再查
容易被忽略的 initramfs 和权限陷阱
最常漏掉的是 initramfs 更新——不更新,系统启动时加载的还是旧镜像里的模块,配置形同虚设。
另一个隐形坑是配置文件权限:modprobe 会静默跳过非 644 或 600 的 .conf 文件。检查:
ls -l /etc/modprobe.d/disable-usb.conf
如果不是 -rw-r--r-- 或 -rw-------,立刻修复:
sudo chmod 644 /etc/modprobe.d/disable-usb.conf
还有,install 行里不能写 /bin/true——它返回 0(成功),某些内核路径会继续走;必须用 /bin/false(返回 1),确保加载链彻底中断。











