如何卸载内核模块“ nvidia-drm”?


29

我正在尝试在Debian Stretch中安装最新的NVIDIA驱动程序。我是NVIDIA-Linux-x86_64-390.48.run这里下载的,但是当我尝试这样做时

sudo sh ./NVIDIA-Linux-x86_64-390.48.run

根据建议,出现错误消息。

ERROR: An NVIDIA kernel module 'nvidia-drm' appears to already be loaded in your kernel.  This may be because it is in use (for example, by an X server, a CUDA program, or 
         the NVIDIA Persistence Daemon), but this may also happen if your kernel was configured without support for module unloading.  Please be sure to exit any programs    
         that may be using the GPU(s) before attempting to upgrade your driver.  If no GPU-based programs are running, you know that your kernel supports module unloading,   
         and you still receive this message, then an error may have occured that has corrupted an NVIDIA kernel module's usage count, for which the simplest remedy is to     
         reboot your computer.

当我尝试找出谁在使用nvidia-drm(或nvidia_drm)时,什么都看不到。

~$ sudo lsof | grep nvidia-drm
lsof: WARNING: can't stat() fuse.gvfsd-fuse file system /run/user/1000/gvfs
      Output information may be incomplete.
~$ sudo lsof -e /run/user/1000/gvfs | grep nvidia-drm
~$

当我尝试删除它时,它说它正在被使用。

~$ sudo modprobe -r nvidia-drm
modprobe: FATAL: Module nvidia_drm is in use.
~$ 

我已经重新启动并以纯文本模式启动(通过在提供用户名/密码之前按Ctrl + Alt + F2组合键),但是出现了相同的错误。

除此之外,我如何“知道我的内核支持模块卸载”?

我在启动时收到一些与nvidia相关的警告,但是不知道它们是否相关:

Apr 30 00:46:15 debian-9 kernel: nvidia: loading out-of-tree module taints kernel.
Apr 30 00:46:15 debian-9 kernel: nvidia: module license 'NVIDIA' taints kernel.
Apr 30 00:46:15 debian-9 kernel: Disabling lock debugging due to kernel taint
Apr 30 00:46:15 debian-9 kernel: NVRM: loading NVIDIA UNIX x86_64 Kernel Module  375.82  Wed Jul 19 21:16:49 PDT 2017 (using threaded interrupts)

你可以尝试在救援模式下做到吗?
vfbsilva '18

看到这个GitHub上的问题systemctl stop systemd-logind卸载模块之前。
GAD3R '18

@vfbsilva我的救援模式很奇怪,它一直循环播放,一次又一次地识别所有USB设备。我设法按Enter,输入root密码并得到提示,但是由于没有/ dev,因此无法安装磁盘。
罗德里戈'18

@ GAD3R我所拥有的只是systemctl stop systemd-logind.service,但这将关闭屏幕并带我回到图形登录,在此我必须再次执行Ctrl + Alt + F2。
罗德里戈

Answers:


28

我想您想停止显示管理器,而我怀疑这是使用Nvidia驱动程序的。

更改为文本控制台(按Ctrl+ Alt+ F2)并以root用户身份登录后,请使用以下命令禁用图形目标,这将使显示管理器保持运行:

# systemctl isolate multi-user.target

在这一点上,我希望您能够使用modprobe -r(或rmmod直接)卸载Nvidia驱动程序:

# modprobe -r nvidia-drm

在设法替换/升级它并准备再次启动图形环境后,可以使用以下命令:

# systemctl start graphical.target

我设法将其卸载(使用您的答案),然后将新版本安装到没有可用的图形模式的地步。我必须格式化PC并重新安装Debian。现在出现了一组完全不同的错误...所有这些只是为了将“ GPU”视为在Blender中进行渲染的选项,而我仍然没有看到它。专有的司机很烂!
罗德里戈

4
这对我来说没有任何modprobe步骤。
唐·柯比

1
是的,我也不需要modprobe踩。
David Jung

即使在文本控制台中,我也无法删除nvidia-drm。知道如何强制删除它吗?
艾迪生

@addison请注意,这是不够的,只是一个文本控制台上,你需要停止X11或韦兰或任何使用从内核NVIDIA驱动程序。该systemctl isolate命令的目的是这样做。但是可能是系统中的配置不正确...检查ps -ef并查看是否可以找到可能正在使用驱动程序的东西,然后停止该过程。那应该允许您卸载驱动程序。
filbranden

5

lsof列出用户空间进程正在使用的所有文件。但是它nvidia_drm是一个内核模块,因此lsof不一定要查看它是否真正在使用。(该模块文件不会打开,因为内核已经完全加载它到RAM中,但模块可能是用户空间或其他内核组件提供服务,而正是防止模块的卸载。)

运行lsmod | grep nvidia.drm并查看nvidia_drm模块名称右侧的数字。第一个数字就是模块的大小。第二个是使用次数。为了成功卸下模块,使用次数必须先为0。

如果X11服务器正在运行并正在使用nvidia驱动程序,那么nvidia_drm肯定会使用内核模块。因此,至少需要切换到文本控制台并关闭X11服务器。通常,这可以通过停止使用任何X Display Manager服务来完成(取决于您使用的桌面环境)。

如错误消息所述,如果您正在运行nvidia-persistenced,则还需要停止该操作,然后才能卸载nvidia_drm模块。


Ctrl + Alt + F2之后,lsmod告诉我使用的过程为1 nvidia_drm。所以我做了sudo /etc/init.d/gdm3 stop,这ok阻止了它。但仍在1个进程中lsmod。现在里面侏儒,ps aux | grep nvidia表演[irq/129-nvidia][nvidia]却没有nvidia-persistenced。另外,这里lsmod显示了使用的2个过程nvidia_drm。我被卡住了。
罗德里戈'18

3

我有一个类似的问题。

*原因:使用nvidia.drm软件包


我通过清除所有NVIDIA软件包来修复它。

使用以下两个命令删除所有以前的NVIDIA安装:


$ sudo apt-get purge nvidia*
$ sudo apt-get autoremove

模块应卸下。

重新启动并继续。


谢谢!如果我需要再次格式化它,这可能会派上用场
Rodrigo

2

您在注释中报告说,停止systemd-logind服务会将您带回到图形登录。如果您具有图形登录名,则X正在运行,因此视频驱动程序已加载并正在使用中。这很可能部分解释了为什么使用nvidia-drm模块。

此外,当您说出明显的误解时,

我已经重新启动并以纯文本模式启动(通过在提供用户名/密码之前按Ctrl + Alt + F2组合键),但是出现了相同的错误。

按Ctrl + Alt + F2可以切换到虚拟终端#2,可以将其配置为文本模式登录,但这与“以文本模式启动”相差甚远。如果您在默认虚拟终端上具有图形登录屏幕,则X正在运行,并且切换到其他VT不会改变它。您只是登录到非X会话。

首先要尝试的最简单的操作是实际上关闭X服务器。老式的方法是登录到文本模式会话并执行命令

telinit 3

切换到运行级别3。这也应该与systemd一起使用,但是本机systemd的方法是改为运行

systemctl isolate multi-user.target

当然,这两个都需要特权,因此您需要使用sudo或使自己成为root。

如果那不能移除模块,或者至少不能手动移除模块,那么您的下一个最佳选择就是直接将系统引导至运行级别3(多用户目标),甚至可能进入运行级别1。 (救援目标)。我通常通过在引导时通过引导加载程序将“ 3”(或“ 1”)添加到内核参数列表的末尾来进行此操作。您还可以按照本文中所述更改默认启动目标。

还要注意,大多数Linux发行版的预编译软件包中都提供了nVidia驱动程序。毕竟,很少有那些软​​件包包含在它们自己的标准存储库中,因为驱动程序毕竟是专有的,但是您肯定可以找到有信誉的有此信誉的第三方存储库。我强烈建议您使用此类软件包,而不要直接运行安装程序,但是要从现在的位置安装,可能需要先手动卸载驱动程序。


我设法卸载了它(使用Filipe的答案),然后将新版本安装到没有可用的图形模式的地步。我必须格式化PC并重新安装Debian。现在出现了一组完全不同的错误...所有这些只是为了将“ GPU”视为在Blender中进行渲染的选项,而我仍然没有看到它。专有的司机很烂!
罗德里戈

@Rodrigo,对不起,您的体验太差了。但是这种问题是为什么我建议使用软件包而不是执行手动安装的一个示例。
约翰·布林格

是的,我更喜欢使用软件包。但是我在某处读到Blender中的GPU选项未启用,可能是因为驱动程序过时了……
Rodrigo

2

CUDA安装

1)下载最新的CUDA工具包

2)通过按Ctl + Alt + F3切换到tty3

3)在继续之前卸载nvidia-drm。

3a)隔离多用户目标

sudo systemctl isolate multi-user.target

3b)请注意,当前正在使用nvidia-drm。

lsmod | grep nvidia.drm

3c)卸载nvidia-drm

sudo modprobe -r nvidia-drm

4d)请注意,nvidia-drm不再使用。

lsmod | grep nvidia.drm

5)转到下载文件夹并运行cuda安装。

sudo sh cuda_10.1.168_418.67_linux.run

6)在安装过程中回答所有提示。

7)安装完成后,请确认CUDA版本已更新。

nvidia-smi

8)再次启动GUI。

sudo systemctl start graphical.target

0

尝试安装Nvidia驱动程序时,Debian Stretch也遇到了相同的问题。在text mod中,我唯一的解决方案是删除驱动程序,然后重新安装gdm和gnome-shell。我知道这是一个笨拙的解决方案,但是我记得我首先尝试修复gnome-shell并仅删除Nvidia驱动程序并重新安装GDM。原来,重新安装整个外壳要容易得多。


猜猜我会等待一个不太笨拙的解决方案,如果有的话。
罗德里戈

0

我也遇到了同样的问题。错误的原因是在安装cuda时我不小心选择了“安装nvidia驱动程序”。

因此,在安装CUDA期间,遇到以下选项:

为Linux-x86_64 384.81安装NVIDIA加速图形驱动程序?(y)es /(n)o /(q)uit:

请选择q,问题将会解决。


那你在说什么 那唯一的解决方案是重新安装?显然,这不是唯一的解决方案。其他答案已经发布。
斯科特,

0

对我有用的是更改系统以从文本开始

systemctl set-default runlevel3.target

然后重新启动并安装nvidia cuda驱动程序,一旦完成,您可能需要更改系统以在图形模式下再次启动

systemctl set-default runlevel5.target

0

停止systemd-logind为我修复它:

sudo systemctl stop systemd-logind

在nvidia-xrun github页面上的github问题中,建议将其作为解决方法:

好消息,systemd-logind是这里的罪魁祸首。当前的解决方法是从“ nvidia-xrun”会话注销后运行以下命令sudo systemctl stop systemd-logind

然后,您将手动删除其他nvidia模块并手动关闭DGPU。这是您从“ nvidia-xrun”会话注销后运行的代码片段。

echo 'Unloading nvidia_drm module' 
execute "sudo rmmod nvidia_drm"

echo 'Unloading nvidia_modeset module' 
execute "sudo rmmod nvidia_modeset"

echo 'Unloading nvidia module' 
execute "sudo rmmod nvidia"

echo 'Turning off nvidia GPU' 
execute "sudo tee /proc/acpi/bbswitch <<<OFF"

echo -n 'Current state of nvidia GPU: ' 
execute "cat /proc/acpi/bbswitch"

Github上的系统问题

Nvidia Linux开发人员门户的参考链接

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.