在18.04上安装NVIDIA驱动程序

大家好。我正在尝试修复我的系统,以便能够安装NVIDIA驱动程序,但是似乎出现了一些问题导致无法进行。我已经尝试手动删除从网上下载的文件,但仍然没有解决。
/var/cache/apt/archives/libnvidia-gl-390_390.48-0ubuntu3_i386.deb
/var/cache/apt/archives/libnvidia-gl-390_390.48-0ubuntu3_amd64.deb

...为了让他们重新下载,但是没有成功。最近有人尝试在18.04上安装这些驱动程序吗?
~$ sudo apt --fix-broken install
[sudo] password for jarl: 
Reading package lists... Done
Building dependency tree       
Reading state information... Done
Correcting dependencies... Done
The following packages were automatically installed and are no longer required:
  lib32gcc1 libc6-i386
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  libnvidia-gl-390 libnvidia-gl-390:i386
The following NEW packages will be installed
  libnvidia-gl-390 libnvidia-gl-390:i386
0 to upgrade, 2 to newly install, 0 to remove and 4 not to upgrade.
3 not fully installed or removed.
Need to get 0 B/29,1 MB of archives.
After this operation, 147 MB of additional disk space will be used.
Do you want to continue? [Y/n] y
(Reading database ... 214344 files and directories currently installed.)
Preparing to unpack .../libnvidia-gl-390_390.48-0ubuntu3_i386.deb ...
diversion of /usr/lib/i386-linux-gnu/libGL.so.1 to /usr/lib/i386-linux-gnu/libGL.so.1.distrib by nvidia-340
dpkg-divert: error: mismatch on package
  when removing 'diversion of /usr/lib/i386-linux-gnu/libGL.so.1 by libnvidia-gl-390'
  found 'diversion of /usr/lib/i386-linux-gnu/libGL.so.1 to /usr/lib/i386-linux-gnu/libGL.so.1.distrib by nvidia-340'
dpkg: error processing archive /var/cache/apt/archives/libnvidia-gl-390_390.48-0ubuntu3_i386.deb (--unpack):
 new libnvidia-gl-390:i386 package pre-installation script subprocess returned error exit status 2
Preparing to unpack .../libnvidia-gl-390_390.48-0ubuntu3_amd64.deb ...
diversion of /usr/lib/x86_64-linux-gnu/libGL.so.1 to /usr/lib/x86_64-linux-gnu/libGL.so.1.distrib by nvidia-340
dpkg-divert: error: mismatch on package
  when removing 'diversion of /usr/lib/x86_64-linux-gnu/libGL.so.1 by libnvidia-gl-390'
  found 'diversion of /usr/lib/x86_64-linux-gnu/libGL.so.1 to /usr/lib/x86_64-linux-gnu/libGL.so.1.distrib by nvidia-340'
dpkg: error processing archive /var/cache/apt/archives/libnvidia-gl-390_390.48-0ubuntu3_amd64.deb (--unpack):
 new libnvidia-gl-390:amd64 package pre-installation script subprocess returned error exit status 2
Errors were encountered while processing:
 /var/cache/apt/archives/libnvidia-gl-390_390.48-0ubuntu3_i386.deb
 /var/cache/apt/archives/libnvidia-gl-390_390.48-0ubuntu3_amd64.deb
E: Sub-process /usr/bin/dpkg returned an error code (1)

尝试使用 sudo apt-get clean 清除整个缓存,然后再试一次。 - Kalle Richter
在执行了sudo apt-get clean之后,我仍然遇到了同样的问题。 - Pim van der Heijden
6个回答

在Ubuntu论坛上找到了这个命令,对我来说非常有效:
运行:
LC_MESSAGES=C dpkg-divert --list '*nvidia-340*' | sed -nre 's/^diversion of (.*) to .*/\1/p' | xargs -rd'\n' -n1 -- sudo dpkg-divert --remove
sudo apt --fix-broken install

第一条命令将从nvidia-340中删除所有被转移的软件包。如果您有其他版本的nvidia“转移”,请更改它;阅读错误代码以了解哪个版本正在转移。
来源:https://ubuntuforums.org/showthread.php?t=2388026&p=13761809#post13761809 感谢stutteringp0et2 :)

2如果您不使用英语中的Ubuntu,那么您可能需要更改awk '{print $3}'中的数字为其他内容,例如我不得不将其更改为awk '{print $2}'。或者您可以将区域设置更改为英语(for FILE in $(LANG=en dpkg-divert --list | grep nvidia-340 | awk '{print $3}'); do dpkg-divert --remove $FILE; done)。 - Petr R.
3你救了我脱离痛苦,我特地注册了一个账号来点赞。 - Primusa
你能解释一下这个命令是如何工作的吗,尤其是LC_MESSAGES和sed -nre? - vikrant
救命稻草,这个需要更多的赞同。 - sparkitny

这是另一个论坛中的完整答案
答案的基本前提是:
  1. 你想删除旧的依赖项
  2. 你想清理混乱
  3. 你想安装新的驱动程序
我假设你安装了340驱动程序的垃圾东西 - 这就是我的问题。
  1. 删除旧的依赖项

    LC_MESSAGES=C dpkg-divert --list '*nvidia-340*' | sed -nre 's/^diversion of (.*) to .*/\1/p' | xargs -rd'\n' -n1 -- sudo dpkg-divert --remove
    
  2. 清理问题 - 依赖于您已安装的问题,请找出它,如果不能正常工作,请进行调整 ;)

    sudo dpkg --force-all -P nvidia-390 nvidia-compute-utils-390 nvidia-dkms-390 nvidia-prime nvidia-settings nvidia-opencl-icd-340 nvidia-opencl-icd-384 nvidia-kernel-source-390 nvidia-kernel-common-390 libnvidia-cfg1-390 libnvidia-common-390 libnvidia-compute-390 libnvidia-decode-390 libnvidia-encode-390  libnvidia-fbc1-390 libnvidia-ifr1-390
    sudo apt purge --autoremove '*nvidia*'
    sudo apt-get update
    sudo apt-get upgrade
    
  3. 安装新的推荐驱动程序

    ubuntu-drivers devices
    nvidia-settings
    
我的建议是:
不要为了检查是否安装而在这些糟糕的驱动程序中玩弄设置 :)

3请不要无缘无故建议使用 dpkg --force-all!在出错时遇到中断操作是为了保护软件包管理系统的完整性,不应该轻率地被抑制!-1 - David Foerster
这个方法有效。我必须评论一下:我发现当使用4K显示器时会出现问题,然后你就会遇到启动问题。我是如何发现的:重新插上旧的显示器,它就能轻松启动了。 - Vic Nicethemer
我先执行了#1,然后使用了sudo apt install -fsudo apt upgrade命令。成功了。 - ICE
为什么这个答案几乎和Lucas Serafim的答案一样? - Pim van der Heijden
更换了使用nvidia 340的显卡后,我尝试从附加驱动程序中启用nvidia 390驱动。但由于这个问题的错误,它失败了。对我来说,通过您的第一个命令+ sudo apt --fix-broken install可以解决问题,因为您的第二个命令出现了错误:以下软件包存在未满足的依赖关系: libnvidia-gl-390:i386 : 依赖于 libnvidia-common-390:i386。我不需要重新安装390驱动程序。 - marius-ciclistu

我通过移除nvidia-340的转向来解决了这个问题。希望我不需要使用nvidia-340。以下是一个例子:
dpkg-divert --package nvidia-340 --remove /usr/lib/i386-linux-gnu/libGL.so.1

你可以在有冲突的时候继续删除。

非常感谢!起初看起来好像不起作用,但是只要我们继续尝试并且排除问题,最终问题会得到解决。再次感谢。 - Gaurav Gandhi
非常感谢!如果不知道我可以修改nvidia-340垃圾的dpkg-divert列表,我就无法解决这个问题。你真棒! - Mikis

首先运行以下命令:

解决方案 #for FILE in $(dpkg-divert --list | grep nvidia-340 | awk '{print $3}'); do dpkg-divert --remove $FILE; done

然后从ppa安装它。

sudo add-apt-repository ppa:graphics-drivers/ppa 
sudo apt update 
sudo apt install nvidia-390

这对我在Ubuntu 18.04 LTS上有效。

nvidia-driver-390在默认的Ubuntu 18.04软件仓库中已经包含了,那么添加PPA有什么意义呢? - karel
@karel 如果那个人和我一样的话,我知道当我花了几个小时甚至几天来解决一个问题,然后找到一个有效的答案后,我不会继续还原问题并尝试从解决方案中删除一行,看它是否仍然有效。就像他说的“这对我有用”。我希望你能提供更多关于快速解决这类问题的信息,因为我现在正在遇到这个问题,并且对我遇到的各种问题没有得到任何回应。唯一的回应是告诉我不要以两种不同的方式发布相同的问题。 - brewmanz
@brewmanz 我可以将那些问题标记为重复问题,因为我已经看到了关于 dpkg-divert 错误信息大约一百次,但你认为我们忽视你。我忽视你是因为你多次发布了同样的问题,然后抱怨说你被同样的评审人员忽视了,而这些评审人员却让你逃脱了。每当我看到一个高质量的问题被评审人员误解或未得到赞同时,我也同样感到沮丧。 - karel

我会运行apt auto-clean,看看它是否是我认为的问题,一个混乱的软件包。
sudo apt auto-clean
sudo apt update
sudo apt upgrade
sudo apt install nvidia-driver-390 libvulkan1

编辑:回答你的另一个问题,前几天我安装了18.04,390版本运行良好,但升级到396版本有点“有趣”。这个方法解决了我的问题。

非常感谢。这就是我目前的进展:(我想我可能要进行一次干净的重新安装) :〜$ sudo apt upgrade 正在读取软件包列表... 完成 正在构建依赖关系树
正在读取状态信息... 完成 您可能想运行 'apt --fix-broken install' 来纠正这些问题。 以下软件包存在无法满足的依赖关系。 libnvidia-ifr1-390 : 依赖于 libnvidia-gl-390,但未安装 libnvidia-ifr1-390:i386 : 依赖于 libnvidia-gl-390:i386,但未安装 nvidia-driver-390 : 依赖于 libnvidia-gl-390 (= 390.48-0ubuntu3),但未安装 ....
- Jarl Arntzen
推荐:libnvidia-gl-390:i386 (= 390.48-0ubuntu3) E: 未满足的依赖关系。尝试使用“apt --fix-broken install”没有任何软件包(或指定解决方案)。 - Jarl Arntzen

根据: https://forums.developer.nvidia.com/t/problem-with-apt-and-nvidia-440-on-ubuntu-20-04/115281/4 对我来说,这个方法可以“修复”损坏的deb文件(如果你通过命令行运行更新,例如使用aptitude,你可以获取损坏的deb文件名)。
sudo dpkg -i --force-overwrite /var/cache/apt/archives/libnvidia-extra-455_455.45.01-0ubuntu1_amd64.deb

之后,您可以继续修复其他损坏的安装程序,或者只需正常升级即可。