Linux怎么卸载残留驱动
卸载Linux驱动后需彻底清理残留,具体操作:先卸载已加载的内核模块并更新模块依赖(即执行sudodepmod-a),再删除/usr/lib/xorg/modules/drivers/下的驱动文件及OpenGL库,最后更新initramfs镜像,确保内核模块、用户态库、Xorg显示服务器插件等均无残留,以防重启后驱动自动加载。
搞Linux驱动卸载,最头疼的不是命令记不住,而是你以为删干净了,结果一重启,老驱动又幽灵般冒出来。这个问题在NVIDIA驱动上尤其典型——因为涉及的东西实在太散:内核模块、用户态库、Xorg驱动、GL调度器,甚至initramfs里都可能藏着旧模块。今天这篇就专门拆解每个环节,把清理的每一步掰开揉碎,确保系统彻底忘掉那个驱动曾经存在过。

rmmod 之后模块还在 lsmod 里?先查依赖链
直接rmmod失败,或者卸载后lsmod | grep xxx依然有输出,大概率是模块被其他模块引用着。比如nvidia依赖nvidia-modeset、nvidia-drm,必须按逆序卸载:
- 先卸载子模块,最后卸载主模块:
sudo modprobe -r nvidia-drm nvidia-modeset nvidia-uvm nvidia - 顺序一旦错了,系统会直接拒绝,提示
Module xxx is in use - 遇到这个提示别急着硬来,用
lsmod | grep xxx看看谁在用,或者lsof +D /dev/nvidia*查具体进程——杀死占用进程后再卸载
apt purge 后 /lib/modules/xxx.ko 还在?得手动删内核模块文件
包管理器只管软件包层面的文件,/lib/modules/$(uname -r)/下的.ko文件它是不碰的。这些残留驱动文件会带来一个经典问题:下次modprobe自动加载旧版,跟新版冲突,系统直接给你脸色看。
- 先定位残留:
find /lib/modules/$(uname -r) -name "nvidia*.ko*" 2>/dev/null - 确认无误后安全删除:
sudo find /lib/modules/$(uname -r) -name "nvidia*.ko*" -delete - 别忘了检查关联模块——尤其是Intel/NVIDIA混合场景下的
drm_kms_helper或i915 - 删完必须执行
sudo depmod -a,不然依赖关系缓存还指着旧模块,下次加载照样报错
卸载后 Xorg 还在用旧驱动?清空 /usr/lib/xorg/modules/drivers/
用户态驱动(比如nvidia_drv.so)不会随内核模块卸载而自动消失。X server启动时仍会加载它,结果要么黑屏,要么降级到llvmpipe软件渲染,性能一落千丈。
- 检查残留:
ls /usr/lib/xorg/modules/drivers/ | grep -i nvidia - 有东西的话直接删除:
sudo rm -f /usr/lib/xorg/modules/drivers/nvidia_drv.so - 同时清理GL库路径:
sudo rm -rf /usr/lib/x86_64-linux-gnu/nvidia* - 如果用了
glvnd,还要确认/usr/share/glvnd/egl_vendor.d/下面没有NVIDIA相关的json文件
uninstall.sh 执行完还报 command not found?检查 PATH 和 initramfs
卸载脚本可能删了二进制,但没更新系统环境——尤其用NVIDIA官方.run包安装的情况很常见。
- 先验证
nvidia-smi是否真消失:which nvidia-smi和command -v nvidia-smi都跑一遍 - 如果
which有输出但执行报错,说明PATH没刷新或符号链接断裂,可以用sudo updatedb && locate nvidia-smi全盘搜索确认 - 别忘了initramfs里可能打包了旧模块—Debian/Ubuntu上执行
sudo update-initramfs -u,RHEL/Fedora执行sudo dracut -f - 重启前,建议先
sudo systemctl isolate multi-user.target退出图形环境再操作,避免模块被占用
真正干净的卸载,不是“删完就完”,而是让系统彻底忘记那个驱动存在过——内核镜像、用户态库、Xorg插件、GL调度器、initramfs镜像,缺一不可。尤其是混合安装(apt + .run)的场景,漏掉任意一环,下次启动时它就可能悄悄复活。


































