0%

Nvidia双显卡笔记本双屏配置

说明

对于Ubuntu 20.10已经可以开箱即用,不过对于Debian10,Arch等系统还是需要专门进行配置才行。

方案一 使用开源驱动nouveau

此方案在此时最新的Arch上可行(我的是1050Ti),如果不想折腾直接安装nouveau软件包即可。
但是在我的Debian10上并不能直接使用,在此系统上如果没有在内核启动参数添加nouveau.modeset=0的话会直接卡到无法操作,所以PASS。

方案二 使用Nvidia官方驱动,采用Nvidia单显卡渲染

步骤如下。

安装nvidia驱动

这一步根据系统不同安装不同的软件包即可,一般情况下,安装nvidia软件包的时候会自动blasklist nouveau,如果是上古版本可能需要手动blasklist。

xorg.conf配置

可以在xorg.conf中进行具体配置,也可以在xorg.conf.d中添加一个nvidia配置用于自动配置,第二种方式不需要xorg.conf文件。

方法一 直接配置xorg.conf文件

为Nvidia显卡配置驱动nvidia,为Intel核显配置驱动modesetting,具体工作原理参见debian和nvidia文档。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40

Section "ServerLayout"
Identifier "Layout0"
Screen 0 "nvidia"
Inactive "intel"
EndSection

Section "Device"
Identifier "nvidia"
Driver "nvidia"
# By default, the NVIDIA X driver will bail out if there
# are no displays available. In order to ensure that the
# X server can start with no heads connected directly to
# the dGPU, you must add
# 'Option "AllowEmptyInitialConfiguration"' to the
# "Screen" section of xorg.conf.
Option "AllowEmptyInitialConfiguration"
VendorName "NVIDIA Corporation"
EndSection

Section "Device"
Identifier "intel"
# By default, your xorg.conf will be set up such that only
# the NVIDIA driver will be loaded. In order to ensure
# that the iGPU’s heads are available for configuration,
# the 'modesetting' driver must be specified.
Driver "modesetting"
VendorName "Intel Graphics"
EndSection

Section "Screen"
Identifier "nvidia"
Device "nvidia"
EndSection

Section "Screen"
Identifier "intel"
Device "intel"
EndSection

其实有一个官方工具nvidia-xconfig可以自动生成配置,但是它生成的配置只会在外接显示器上显示,所以需要自己配置双屏,不过可以借助此工具生成一个配置框架再修改。

方法二 添加文件/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf指导系统进行自动配置

这个方法来自Arch的文档,和方法一的核心配置大致相同,只是方法一是直接指定了Device,Screen,ServerLayout等,这里只是添加OutputClass,指导X Server自动配置。

添加文件/etc/X11/xorg.conf.d/10-nvidia-drm-outputclass.conf,内容如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Section "OutputClass"
Identifier "intel"
MatchDriver "i915"
Driver "modesetting"
EndSection

Section "OutputClass"
Identifier "nvidia"
MatchDriver "nvidia-drm"
Driver "nvidia"
Option "AllowEmptyInitialConfiguration"
Option "PrimaryGPU" "yes"
ModulePath "/usr/lib/nvidia/xorg"
ModulePath "/usr/lib/xorg/modules"
EndSection

使用xrandr配置双屏

配置完上面的之后可能需要重启X服务,最简单的方法大概就是直接重启机器了。

配置内容如下:

1
2
3
4
xrandr --setprovideroutputsource modesetting NVIDIA-0
xrandr --auto
# 如果显示DPI不正常的话添加下面的DPI配置
# xrandr --dpi 96

其中最关键的是第一条命令。可以把这几条命令写入 ~/.xinitrc 或者 ~/xsession,根据自己的具体情况吧,也可能需要配置你的Display Manager(如果有的话)。

核心步骤已经说的差不多了,到这里为止应该已经可以在xrandr中看到内置显示器和外置显示器都处于connected状态了,已经可以根据自己的需要进行输出了。

顺便附上自己的 .xinitrc,这来自一台没有使用Display Manager的Arch系统,在 .xinitrc 的最后启动了i3桌面管理器。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#!/bin/sh

#######################################################
# original /etc/X11/xinit/xinitrc #
#######################################################

userresources=$HOME/.Xresources
usermodmap=$HOME/.Xmodmap
sysresources=/etc/X11/xinit/.Xresources
sysmodmap=/etc/X11/xinit/.Xmodmap

# merge in defaults and keymaps
if [ -f $sysresources ]; then
xrdb -merge $sysresources
fi

if [ -f $sysmodmap ]; then
xmodmap $sysmodmap
fi

if [ -f "$userresources" ]; then
xrdb -merge "$userresources"
fi

if [ -f "$usermodmap" ]; then
xmodmap "$usermodmap"
fi

# start some nice programs
if [ -d /etc/X11/xinit/xinitrc.d ] ; then
for f in /etc/X11/xinit/xinitrc.d/?*.sh ; do
[ -x "$f" ] && . "$f"
done
unset f
fi


#######################################################
# lpy's xinitrc #
#######################################################

# Dual Display
# The X server must be told to configure iGPU displays using PRIME.
# This can be done using the ‘xrandr’ command line tool,
# via ‘xrandr –setprovideroutputsource modesetting NVIDIA-0’.
# If this fails, you can verify the available graphics devices
# using ‘xrandr –listproviders’.
xrandr --setprovideroutputsource modesetting NVIDIA-0
# Once PRIME is configured as described above, the iGPU’s heads may
# be configured as if they were the dGPU’s with any RandR-aware tool,
# be it ‘xrandr’ or a distro-provided graphical tool. The easiest way
# to get something to display is ‘xrandr –auto’, but more complicated
# configuration is possible as well.
xrandr --auto
# If your display dpi is not correct add the following line
# xrandr --dpi 96


# Disable DPMS turning off the screen
xset -dpms
xset s off

# Disable bell
xset -b

# Enable zapping (C-A-<Bksp> kills X)
setxkbmap -option terminate:ctrl_alt_bksp

# Enforce correct locales from the beginning:
# LC_ALL is unset since it overwrites everything
# LANG=de_DE.UTF-8 is used, except for:
# LC_MESSAGES=C never translates program output
# LC_TIME=en_DK leads to yyyy-mm-dd hh:mm date/time output
unset LC_ALL
export LANG=zh_CN.UTF-8
export LC_MESSAGES=C
export LC_TIME=en_US.UTF-8

# Use XToolkit in java applications
export AWT_TOOLKIT=XToolkit

# Set background color
xsetroot -solid "#333333"

# Enable core dumps in case something goes wrong
ulimit -c unlimited

# input method
export GTK_IM_MODULE=ibus
export QT_IM_MODULE=ibus
export XMODIFIERS=@im=ibus

# i3-sensible-terminal
export TERMINAL=termite

# Start i3 and log to ~/.i3/logfile
mkdir -p ~/.i3/log
echo "Starting at $(date)" >> ~/.i3/log/"$(date +%Y%m%d)".log
exec /usr/bin/i3 -V -d all >> ~/.i3/log/"$(date +%Y%m%d)".log

参考资料

Debian Wiki - NVIDIA Optimus
Nvidia Forums - Prime and Prime synchronization
Arch Wiki - NVIDIA Optimus