最新方法
2020.9.12 更新
这篇文章里提到的解决方法应该用不上了,因为 video-hybrid-intel-nvidia-450xx-prime
可以直接识别笔记本上的双显示器。
- 如果你以前没看过这篇教程,并且双显示器不能正常工作,建议在系统设置里将驱动更换为
video-hybrid-intel-nvidia-450xx-prime
,在更换完成前不要看这篇文章。 - 如果你以前看过这篇教程,建议将现有的
video-nvidia-???xx
更换为上述驱动,并且记得把这篇教程里更改过的配置文件一一还原。这个新的驱动修复了很多小问题。 - 如果你用的就是
video-hybrid-intel-nvidia-450xx-prime
,并且双显示器无法工作,那么你可以参考这篇文章的内容,也许对你有帮助。
重要的话说三遍:
建议将驱动更换为 video-hybrid-intel-nvidia-450xx-prime
,在更换完成前不要看这篇文章。
建议将驱动更换为 video-hybrid-intel-nvidia-450xx-prime
,在更换完成前不要看这篇文章。
建议将驱动更换为 video-hybrid-intel-nvidia-450xx-prime
,在更换完成前不要看这篇文章。
失败了再回来试一下这篇文章的方法。
背景
解决方法请翻到解决方法一节。
环境:
intel 集成显卡 + Nvidia 独立显卡,目前笔记本主流配置。但 HDMI 接口实际上是与 Nvidia 显卡相连接的,默认驱动无法对 N 卡输出。
症状:
- 无法接外接显示器,接上后无论是系统设置还是
inxi -Fx
都无法识别外置显示器。 - 检查启动日志,发现虽然开机时检测到了显示器,但后面就没有继续显示了。
如果你的是外接显卡坞+显示器,这篇教程不适合你。不过有网友(感谢@sunlitforest
)用另一种方法操作成功了,详情请看这里。
参照ArchWiki上面的说法,让Optimus显卡在linux里面有三种实现方法:
- BIOS里面禁用掉一个显卡。缺点:难以切换显卡。
- 用nouveau的PRIME功能。但是性能没有专有驱动好,睡眠和挂起也会出现问题。
- 用Bumblebee。不过Bumblebee很难支持双显示器。
- 用专有驱动。
- 用nvidia-xrun,让X服务器跑在n卡上。(貌似和1一样,但是1是硬件层面上的禁用。)
解决方法
我找到了Manjaro论坛里面的一个帖子。(作者Jonathon,是Manjaro开发团队的)
刚开始没有成功,后来在朋友的提醒下,发现原来我缺了一些步骤! 我照着这个帖子的步骤原封不动地操作,成功了。所以,接下来一定要按照步骤严格操作。
以下内容均为本人的中文翻译。原帖在此 - How To Set up PRIME with NVIDIA proprietary driver
如何在Optimus的笔记本上开启PRIME:
方法 | 优点 | 缺点 |
---|---|---|
bumblebee(Render offload) | 按需使用独立显卡,Manjaro默认配置 | 有一定的开销,对性能有所影响 |
PRIME | 直接使用独立显卡,性能更强 | 两块显卡都一直供电,需要手动配置 |
optimus-manager | 显卡切换更简单 | 暂不成熟,还在开发中 |
video-hybrid-intel-nvidia-440xx-prime | NVIDIA 官方支持的 render offload. |
Note:最简单的方法就是在主板设置里面禁用集成显卡,如果可以就直接禁用掉。
optimus-manager可以实现两块显卡的半自动切换,但是目前仍然不太成熟。
免责声明:NVIDIA Optimus在Linux下目前一团糟,硬件设置千差万别。所以这个教程可能有不适用之处,建议参考ArchWiki获取更多信息。
1 移除Bumblebee
如果你选择了non-free驱动,mhwd将会自动安装bumblebee。 bumblebee很碍事,所以我们得先干掉它。
sudo mhwd -r pci nonfree 0300
2 安装NVIDIA驱动
sudo mhwd -i pci video-nvidia-440xx
2020年3月25日注:经过本人测试,这两步操作也可以通过系统设置里面的“硬件设定”来完成。video-nvidia-440xx仍然适用于本教程
3 修改MHWD设置
mhwd会自动生成一些设置。这里我们需要重新手动配置,这样PRIME才能生效。
另起炉灶
首先要删掉/etc/X11/xorg.conf.d/90-mhwd.conf
(如果你不放心可以mv嘛。)
然后新建一个文件/etc/X11/xorg.conf.d/optimus.conf
:
Section "Module"
Load "modesetting"
EndSection
Section "Device"
Identifier "nvidia"
Driver "nvidia"
BusID "PCI:1:0:0"
Option "AllowEmptyInitialConfiguration"
EndSection
注意:BusID一栏需要根据自己的电脑配置进行修改。BusID的值是这么查询的:
lspci | grep -E "VGA|3D"
禁用模块
PRIME依赖于nvidia-drm
,但mhwd在默认情况下会禁用它,我们需要手动启用。
此外,为了确保nvidia驱动正常开启,我们还需要禁用其他一些模块。
所以,我们需要对/etc/modprobe.d
动动手脚。
首先,我们得把mhwd自动生成的黑名单删掉。 (译者注:不放心的话,就把后缀名改掉,因为modprobe.d里面所有conf结尾的文件都会被执行) 比如这样:视情况而定,你的配置可能不同
ls /etc/modprobe.d/mhwd*
sudo rm /etc/modprobe.d/mhwd-gpu.conf
sudo rm /etc/modprobe.d/mhwd-nvidia.conf
然后我们要新建一个黑名单,屏蔽一些其他的模块。
新建一个文件,什么名字都可以,conf结尾就行
写入:/etc/modprobe.d/nvidia.conf
blacklist nouveau
blacklist nvidiafb
blacklist rivafb
4 开启 modeset
创建一个新文件,/etc/modprobe.d/nvidia-drm.conf
options nvidia_drm modeset=1
5 设置启动脚本
我们要设置一下桌面环境的输出源。这是最难的部分,可能会花掉很长时间。 如果你现在重启,桌面环境的输出可能会有一些问题。
我们需要写一个启动脚本,让桌面环境加载的时候能够正确选择输出源。
注意,视你的具体环境(DM)执行下列的某一个步骤,不要执行所有步骤。
针对 LightDM (xfce默认)
创建一个文件,/usr/local/bin/optimus.sh
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
然后按照国际惯例(hhh),让它可写可执行:chmod a+rx /usr/local/bin/optimus.sh
现在你还得把它设置为启动脚本。
编辑/etc/lightdm/lightdm.conf
,然后在**[Seat:* ]**这一节设置
display-setup-script=/usr/local/bin/optimus.sh
针对 GDM (Gnome默认)
创建一个文件/usr/local/share/optimus.desktop
[Desktop Entry]
Type=Application
Name=Optimus
Exec=sh -c "xrandr --setprovideroutputsource modesetting NVIDIA-0; xrandr --auto"
NoDisplay=true
X-GNOME-Autostart-Phase=DisplayServer
(Exec处也可以替换成一个脚本,写一个就像LightDM里面一样的脚本)
然后建立连接,让它随着GDM启动。
sudo ln -s /usr/local/share/optimus.desktop /usr/share/gdm/greeter/autostart/optimus.desktop
sudo ln -s /usr/local/share/optimus.desktop /etc/xdg/autostart/optimus.desktop
针对 SDDM (KDE 默认)
创建一个文件:/usr/share/sddm/scripts/Xsetup
#!/bin/sh
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
然后用chmod让它变为可执行的文件。
6 最后的工作
译者注:如果以上的工作都已经完成,我建议你再做一步。 我当时没有做这一步,之后重启发现内核模块加载错误。 所以还是建议,编译一下内核。
sudo mkinitcpio -P linux
最后重启,大功告成。
验证是否成功
如果以上你都设置正确了,当你重启之后,可以敲glxinfo | grep -i vendor
然后看看是不是像下面这样的信息。
$ glxinfo | grep -i vendor
server glx vendor string: NVIDIA Corporation
client glx vendor string: NVIDIA Corporation
OpenGL vendor string: NVIDIA Corporation
如果是,说明你已经设置成功,可以欢呼了! 当然我有双显示器,一看显示器亮了就知道了2333
最后
这个奇怪的问题(点击查看)当时也困扰了我很久 打开任务管理器没有任何占用,为啥还是一卡一卡的? 后来才知道,噢,原来是双显卡的坑。 听说最近19H1来了?反正我不想用Windows了。 自从Windows 7 之后我就没用过没bug的系统!
希望我的这篇博文能帮到各位看官。 :) 新开的评论区(Gitment),有问题可以在下面留言哦。
参考资料
How To Set up PRIME with NVIDIA proprietary driver
GitHub 评论区
本站评论区改为 Valine, 原评论区请移步至此.
上次修改於 2020-09-12