NVIDIA Optimus (简体中文)
NVIDIA Optimus是一种允许 Intel 集成 GPU 和 NVIDIA GPU 建成并通过一台笔记本电脑访问的技术。让 Optimus 显卡工作在 Arch Linux 下需要一些稍微复杂的设置步骤,下文说明了几种可用方法:
- 在 BIOS 里禁用其中之一,如果禁用 NVIDIA 显卡的话也许会提升电池续航能力。但并不适用于所有 BIOS, 也不能切换显卡。
- 使用闭源 NVIDIA 驱动提供的官方 Optimus 支持,这能让 NVIDIA 显卡发挥最大性能但不能切换显卡,同时会比开源驱动有更多 bug.
- 使用开源 nouveau 驱动提供的 PRIME 功能,它能够切换显卡但是和闭源驱动相比性能差劲,并且目前并未实现任何省电功能。
- 使用第三方程序 Bumblebee 来实现类似于 Optimus 的功能,同时支持切换显卡和省电,但需要额外设置。
- 利用nvidia-xrun,一个使用全性能的离散NVIDIA图形功能来单独运行X的使用程序。
这些方法在下文有详细解释。
禁用可交换显卡
如果你只使用某一显卡而不切换的话,检查你系统 BIOS 的选项,那里应该有禁用某一显卡的选项。某些笔记本只支持禁用独立显卡,另一些则相反,但是如果你只想用其中之一的话还是值得一看的。但是若你想同时使用两个显卡,或者无法禁用你不想要的显卡的话,请看以下的方法。
另一种完全关闭独立显卡的方法请查看 Hybrid graphics#Fully Power Down Discrete GPU.
如果您想使用这两张显卡,或者不能禁用您不想要的卡,请参见下面的选项。
使用 nvidia
闭源 NVIDIA 驱动并不像 nouveau 驱动一样支持动态切换 (意味着它只能使用 NVIDIA 设备). 它还有一些已被 NVIDIA 承认但仍未修复的显著问题,然而,它使用独立显卡并 (自2013年10月) 在性能上相比 nouveau 驱动有显著优势。
首先,安装官方源的驱动包 nvidia 和软件包 xorg-xrandr.
然后,你必须创建一个 xorg.conf
. 你需要提供 NVIDIA 显卡的 PCI 地址,可通过以下命令获取:
$ lspci | grep -E "VGA|3D"
PCI 地址是提到 NVIDIA 的输出行的前7个字符,看起来像 01:00.0
. 在 xorg.conf
中,需转换为 #:#:#
格式;例如 01:00.0
应该写成 1:0:0
.
如果安装了1.17.2或者更高版本的X服务([1])
/etc/X11/xorg.conf
Section "Module" Load "modesetting" EndSection Section "Device" Identifier "nvidia" Driver "nvidia" BusID "<BusID for NVIDIA device here>" Option "AllowEmptyInitialConfiguration" EndSection
之后,把以下内容添加到 ~/.xinitrc
开头:
~/.xinitrc
xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --auto
现在重启以加载驱动,X 也应该启动了。
如果你的DPI显示不正确,在上面的~/.xinitrc
配置中指定dpi(实际dpi以你的设备为准),如:
xrandr --dpi 96
如果在启动 X 时黑屏,确保 ~/.xinitrc
的两个 xrandr
命令后没有 &
符号;如果有,可能是窗口管理器在 xrandr
命令执行完成之前启动导致了黑屏。
如果依然黑屏,参考下文#可选配置
可选配置
如果你使用1.17.1以上版本的Xorg服务出现崩溃,修改/etc/X11/xorg.conf
配置如下(Intel设备):
# nano /etc/X11/xorg.conf
Section "Device" Identifier "intel" Driver "modesetting" BusID "PCI:0:2:0" Option "AccelMethod" "sna" #Option "TearFree" "True" #Option "Tiling" "True" #Option "SwapbuffersWait" "True" EndSection
上面文件中的BusID
必须和lspci命令的输出相匹配。搜索带有“VGA兼容控制器”的行,其中包含英特尔的内容。例如:
$ lspci |grep VGA 00:02.0 VGA compatible controller: Intel Corporation Haswell-ULT Integrated Graphics Controller (rev 0b)
如果X服务启动后屏幕上什么也没有出现,检查/var/log/xorg.conf
,确保该文件含有类似此行内容:
/var/log/xorg.conf
[ 16112.937] (EE) Screen 1 deleted because of no matching config section.
如过具有类似上诉内容,更改/etc/X11/xorg.conf
文件的serverlayout段,问题可能会消失:
/etc/X11/xorg.conf
Section "ServerLayout" Identifier "layout" Screen 1 "nvidia" Inactive "intel" EndSection
显示管理器
如果你使用显示管理器 (Display Manager, DM),你需要创建或编辑启动管理器的脚本而不是使用 ~/.xinitrc
.
LightDM
对于 LightDM:
# nano /etc/lightdm/display_setup.sh
xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --auto
赋予脚本可执行权限:
# chmod +x /etc/lightdm/display_setup.sh
编辑 /etc/lightdm/lightdm.conf
的 [Seat:*]
部分以配置 lightdm 运行这个脚本:
# nano /etc/lightdm/lightdm.conf
[Seat:*] display-setup-script=/etc/lightdm/display_setup.sh
重启,你的 DM 应该启动了。
SDDM
对于 SDDM:
# nano /usr/share/sddm/scripts/Xsetup
xrandr --setprovideroutputsource modesetting NVIDIA-0 xrandr --auto
GDM
对于GDM:
/usr/share/gdm/greeter/autostart/optimus.desktop /etc/xdg/autostart/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
确保GDM使用了Xorg模式。
检验 3D
你可通过安装 mesa-demos 并运行以下命令来检验 NVIDIA 是否被使用:
$ glxinfo | grep NVIDIA
更多信息
更多信息参见 NVIDIA 官方页面的这个主题。
疑难问题
垂直同步撕裂
xorg-server需要 1.19 或更高版本,linux内核需要4.5 或更高版本,nvidia需要370.23更高版本。还需要开启DRM kernel mode setting设置项以修复撕裂问题。
官方论坛查看详细信息:forum thread。
Failed to initialize the NVIDIA GPU at PCI:1:0:0 (GPU fallen off the bus / RmInitAdapter failed!)
添加 rcutree.rcu_idle_gp_delay=1
到内核参数。原始话题见[2]。
分辨率和屏幕扫描错误“EDID errors in Xorg.log”
这是由于NVIDIA的驱动程序没有检测显示器的EDID。你需要手动指定路径的EDID文件或以类似的方式提供相同的信息。
增加这些线路和变化部分反映你自己的系统:
/etc/X11/xorg.conf
Section "Device" Option "ConnectedMonitor" "CRT-0" Option "CustomEDID" "CRT-0:/sys/class/drm/card0-LVDS-1/edid" Option "IgnoreEDID" "false" Option "UseEDID" "true" EndSection
如果xorg不会开始尝试更换所有CRT到DFB。显示器连接通过LVDS,card0是标识为英特尔卡。EDID二进制是这个目录。如果硬件配置不同,CustomEDID的值可能有所不同,但这已得到证实。不管怎样,路径都将从/sys/class/drm开始
或者你可以生成你的工具,如读取read-edid,将驱动点指向这个文件。也可以使用modelines,但是务必要修改 "UseEDID" 和 "IgnoreEDID"。
锁定问题(lspci 挂起)
问题:lspci挂起,系统暂停失败,关机时挂起,optirun挂起。多出现在新的笔记本电脑或使用了类似bbswitch GTX的965m时(例如bumblebee)以及nouveau的情况。
当独立显卡接通电源,可能出现这种情况,参见 (kernel bug 156341)。
具体解决方法参见 this issue。
你可以添加acpi_osi="!Windows 2015"
或acpi_osi=! acpi_osi="Windows 2009"
到Kernel parameters中。
笔记本电脑未发现屏幕/NVIDIA Optimus
检查$ lspci | grep VGA
输入内容是否类似:
00:02.0 VGA compatible controller: Intel Corporation Core Processor Integrated Graphics Controller (rev 02) 01:00.0 VGA compatible controller: nVidia Corporation Device 0df4 (rev a1)
NVIDIA驱动自319.12 Beta [3]起已经包含在内核(版本3.9级以上)中。
另一个解决方案是安装Intel驱动进行显示,如果需要运行3D软件,可以使用 Bumblebee (简体中文)来使用NVIDIA显卡。
使用 nouveau
开源 nouveau 驱动 (xf86-video-nouveau) 能靠一种叫 PRIME 的技术动态切换到 Intel 驱动 (xf86-video-intel). 更多信息见 wiki 的 PRIME 页面。
使用 Bumblebee
如果你想使用 Bumblebee, 并实现省电和其他有用特性,见 wiki 的 Bumblebee 页面。
使用 nvidia-xrun
安装nvidia-xrun-gitAUR。github上查看该项目 https://github.com/Witko/nvidia-xrun