搞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)的场景下,漏掉任意一环,下次启动时旧驱动就可能悄悄复活。
