通过 VNC 为 Linux 扩展第二显示器

手上有一台吃灰挺久了的安卓平板,一直没有怎么使用,更多的是用来调试 Android App 以及偶尔拿它来看看视频或者盖泡面

最近写代码越发觉得笔记本单屏很难受,查文档得在 Chrome 跟 IDE 之间来回切换。而又苦于没有钱买显示器,并且宿舍也没有这么大的地方能够同时放下笔记本跟显示器。就想着能否将这平板利用起来,用它来当电脑的扩展显示器,因为我日常使用比较多的是 ArchLinux ,Windows 基本只用来打游戏,所以就开始研究起如何在 Linux 下将平板作为扩展显示器。然后真就在 Arch Linux Forums 上找到了一篇帖子描述了通过 VNC 为 Linux 扩展第二显示器的方法。不过这个方法中有些步骤在我的电脑上有点问题,需要修改一下才能正常使用。

下面就记录一下如何通过 VNC 为 Linux 扩展第二显示器。

效果图

首先上一张最终效果图:

教程

给 Xorg 添加 VIRTUAL 显示输出设备

打开终端,执行 xrandr 指令,该指令会输出当前系统所有可用的显示输出设备,以及每个显示设备可设置的显示模式,如下图是我在我电脑上执行该指令的输出结果:

如果能在输出中找到以 VIRTUAL 开头的设备(如上图中的 VIRTUAL1 以及 VIRTUAL2),就表明当前系统中已经有 VIRTUAL 输出设备了,可以直接进入下一个步骤。

如果没能找到 VIRTUAL 开头的设备的话,就需要在 /usr/share/X11/xorg.conf.d/ 下创建一个 conf 文件,添加 VIRTUAL 设备。具体方法如下:

1
sudo vi /usr/share/X11/xorg.conf.d/20-intel.conf

然后插入以下配置文本,并保存:

1
2
3
4
5
Section "Device"
Identifier "intelgpu0"
Driver "intel"
Option "VirtualHeads" "2"
EndSection

如下图所示:

保存该文件之后需要 logout ,之后重新登录。再次执行 xrandr ,这时候你应该就能在 xrandr 的输出结果中找到 VIRTUAL 显示输出设备了。

生成显示模式

之后需要为你的平板或者其他作为 Linux 第二显示器设备生成一个显示模式。

例如我手上的这台平板的分辨率是 2048 * 1536,我就需要为它生成一个 2048 * 1536 的显示模式。

如果你手上的设备的分辨率对应的显示模式在之前 xrandr 的输出结果中已经存在的话,则可以跳过这一步,直接进入下一个步骤,不过你需要记住 xrandr 输出的显示模式列表中的第一例就是显示模式的名称。例如你的平板的分辨率为 1920 * 1080,而在 xrandr 的输出结果中发现了名为 1920x1080 的显示模式,那就可以直接进入下一个步骤了,不用再为它手动生成一个显示模式。

下面我就以我平板的分辨率 2048 * 1536 说明如何生成一个显示模式。

首先,我们需要为显示模式生成一个 Modeline,执行以下指令:

1
gtf 2048 1536 60

命令中的 2048 跟 1536 这两个参数用于指定分辨率,而末尾的 60 则用于指定刷新率,因为我们这里并不是连接一个实际的显示器,所以刷新率这个参数可以任意给,这里习惯上给了个 60 作为刷新率。

执行完这条指令之后会得到这样的输出:

1
2
# 2048x1536 @ 60.00 Hz (GTF) hsync: 95.34 kHz; pclk: 266.95 MHz
Modeline "2048x1536_60.00" 266.95 2048 2200 2424 2800 1536 1537 1540 1589 -HSync +Vsync

我们这里需要记录下 Modeline 之后的那部分字符串,即:

1
"2048x1536_60.00"  266.95  2048 2200 2424 2800  1536 1537 1540 1589  -HSync +Vsync

有了这串字符串之后,我们就可以添加一个新的显示模式了,执行 xrandr --newmode 前面记录下的字符串,就能创建一个新的显示模式了,如下所示:

1
xrandr --newmode "2048x1536_60.00"  266.95  2048 2200 2424 2800  1536 1537 1540 1589  -HSync +Vsync

其中 --newmode 这个参数的值就是我们前面记录下来的那一长串。

2048x1536_60.00 就是我们添加的显示模式的名称。

为 VIRTUAL 显示输出设备添加显示模式

有了 VIRTUAL 显示设备,也有了我们所需的显示模式之后,我们就需要将其两者结合起来,将显示模式添加给显示设备,让 VIRTUAL 显示设备支持我们所需的显示模式。

1
2
xrandr --addmode VIRTUAL1 2048x1536_60.00
# 显示设备 显示模式

该指令的 --addmode 参数需要传入两个值,其中第一个为显示设备名称,这里指定为 VIRTUAL1,第二个为显示模式,这里就指定为前面生成的显示模式 2048x1536_60.00

这时候再执行 xrandr 指令,你就能在 VIRTUAL1 这个显示输出设备底下看到我们刚刚创建的显示模式了:

开启 VIRTUAL 显示输出设备

这时候 VIRTUAL 显示输出设备的状态还是 disconnect,我们接下来就需要开启它,之后就能通过 VNC 将 VIRTUAL 显示输出设备的画面给转发出去了。

这一个步骤也很简单,只需要执行这么一句指令就行了:

1
2
xrandr --output VIRTUAL1 --mode 2048x1536_60.00 --right-of eDP1
# 显示设备 显示模式 你当前的显示设备

解释一下这条指令中的参数:

  • --output:这个参数指定的就是显示设备了,也就是 VIRTUAL1 显示输出设备。
  • --mode:这个参数用于指定显示模式,这里就指定为我们前面所生成的显示模式 2048x1536_60.00。
  • --right-of:这个参数用于指定要开启的显示设备拼接到某个设备的右边。例如我这里指定了 VIRTUAL1 拼接到我笔记本屏幕 eDP1 的右边。这个参数其实是可选的,你也可以选择 --left-of 等等。

通过 VNC 转发 VIRTUAL 显示输出设备的画面

这时候 VIRTUAL 显示设备其实已经启用了,你可以注意到,你的鼠标已经可以移动到你电脑显示器的范围之外了,接下来只需要通过 VNC 将 VIRTUAL 显示输出设备的画面转发出去就行了。

首先,执行 xrandr 指令,得到以下输出结果:

这里需要记住 VIRTUAL1 设备之后所显示的一串表达式(即上图中选中的部分):2048x1536+1920+0

之后执行以下指令即可通过 VNC 将 VIRTUAL 显示输出设备的画面转发出去:

1
x11vnc -clip 2048x1536+1920+0 -forever

其中 -clip 参数的值就是前面使用 xrandr 指令所查看到的 VIRTUAL1 设备之后的那一串表达式。 -forever 参数则是告诉 x11vnc 不要在设备断开连接之后就关闭 VNC。

默认的端口号是 5900。

在平板等其他设备上使用 VNC 连接

这个步骤就不再详细描述了,支持 VNC 协议的软件有很多,大家自行下载之后使用即可,但是需要注意的是有些 VNC 软件不支持显示远程鼠标,建议找个能支持远程鼠标显示的 VNC 软件。

如何关闭

  • 首先通过 Ctrl + C 停止 x11vnc

  • 然后关闭 VIRTUAL1 显示设备的输出:

1
xrandr --output VIRTUAL1 --off
  • (可选)从 VIRTUAL1 显示设备中删除前面添加的显示模式:
1
2
xrandr --delmode VIRTUAL1 2048x1536_60.00
# 显示设备 显示模式
  • (可选)删除前面生成的显示模式:
1
2
xrandr --rmmode 2048x1536_60.00
# 显示模式
Buy me a cup of coffee