将平板、手机作为电脑第二屏幕(Linux系统下)
背景
把手机、平板作为电脑第二屏幕是上个学期偶然想到的,那时我一边看网上的教程一边码代码。由于看的是视频教程,缩小了就看不清上面的字,放大了又会挡住打字区域。这时就想如果有个第二屏幕就很方便了,买个屏幕又不太方便,想到自己还有个平板天天吃灰,这不是就是现成的屏幕嘛。
在网上搜了搜发现真的有解决方案,windows和mac上有很多软件可以用,但我平时主要用的是Ubuntu系统,所以这里就讲一下在Ubuntu系统下要怎么做吧。
先决条件
网上目前能找到的解决方案都是基于Intel集显中的
Virtualheads
功能,所以如果你是用的 AMD 的 cpu 那肯定就用不了这个功能了,另外如果是有独显的电脑若要开启这个功能,需要把驱动切换为使用集显或干脆不装独显驱动,网上有使用 Intel 集显进行图形显示、NVIDIA 独显进行数据计算的教程,因为我没有这方面的需求就没有折腾。
下面是man手册中关于Intel集显的一些设置说明
Option “Virtualheads” " integer "
This option controls specifies the number of fake outputs to create in addition to the normal outputs detected on your hardware. These outputs cannot be assigned to the regular displays attached to the GPU, but do otherwise act as any other xrandr output and share a portion of the regular framebuffer. One use case for these extra heads is for extending your desktop onto a discrete GPU using the Bumblebee project. However, the recommendation here is to use PRIME instead to create a single Xserver that can addresses and coordinate between multiple GPUs.
Default: 0
大概意思就是可以创建虚拟的显示输出头(类似于电脑显卡上的那个接显示器的输出头),然后通过
xrandr
进行显示输出。
为了让显卡创建
Virtualheads
需要在
X11
的配置目录中添加相应的驱动配置。
注意!!! 如果当前使用的是独显必须先切换到集显再进行配置,否则重启后无法进入图形界面!!!
sudo vim /usr/share/X11/xorg.conf.d/20-intel.conf
把下列内容填入文件中
Section "Device"
Identifier "intelgpu0"
Driver "intel"
Option "VirtualHeads" "1"
EndSection
其中
Option
中的
VirtualHeads
的值为
1
即创建一个虚拟输出头,也可以创建多个输出头,如把1改为4即可创建4个虚拟头。每个输出头可以对应一个屏幕,如果有一堆平板或手机也可以通过这个组建一个屏幕阵列。。。(画面会很卡)
配置好后需要重启电脑。如果开启了独显要么该功能无法用,要么驱动错误无法加载驱动进不去图形界面,需要进入恢复模式删除配置文件。所以务必关闭独显!!
重启后可以打开终端输入命令
xrandr
查看有没有开启成功。
若成功在输出内容的底部可以看到如图VIRTUAL开头的行:
该命令显示了我电脑当前的显示状态,
Screen 0
是当前正在显示的屏幕的分辨率参数,
eDP1
是笔记本内置显示屏当前的分辨率参数,下面的一堆数字是该显示屏所支持的分辨率及刷新率,最底下的三行分别是 HDMI 接口输出及虚拟输出,如果没有连接则会显示
disconnect
。
开启扩展屏幕及虚拟显示器
使用
cvt
命令可以获取所需分辨率的相应配置信息
例如我想让平板分辨率为
960x600
,可以输入以下命令:
cvt 960 600
其输出为:
# 960x600 59.63 Hz (CVT 0.58MA) hsync: 37.21 kHz; pclk: 45.25 MHz
Modeline "960x600_60.00" 45.25 960 992 1088 1216 600 603 609 624 -hsync +vsync
其中第二行 Modeline 后面的内容是我们接下来需要的。
将其替代下面命令中的
newmode
后面的内容
# 产生一个新的分辨率模式
xrandr --newmode "960x600_60.00" 45.25 960 992 1088 1216 600 603 609 624 -hsync +vsync
接下来启动该显示器
# 向虚拟显示器添加分辨率模式
xrandr --addmode VIRTUAL1 "960x600_60.00"
# 设置虚拟显示器与内置显示器的相对位置,这里我把虚拟显示器放在左下角
# 该命令可能需要重复输入两次才能生效
xrandr --output VIRTUAL1 --mode 960x600_60.00 --pos 0x480 --rotate normal --output eDP1 --primary --mode 1920x1080 --pos 960x0 --rotate normal
下面是启用扩展屏幕及虚拟显示接口后的
xrandr
输出结果:
可以看到现在
Screen 0
的分辨率为 2880 x 1080,
eP1
分辨率不变但其后的偏移量 + 0 + 0 变为 + 960 + 0 (即从
Screen 0
宽为960高为0以后的部分进行切割分配给
eP1
),注意到
VIRTUAL1
由
disconnected
变为
connected
其分辨率为 960 x 600,其后的 + 0 + 480 为偏移量(即从
Screen 0
宽为0高为480以后的部分进行切割分配给
VIRTUAL1
)这样就实现了多个显示器共享同一个屏幕的功能。
此时打开设置->设备->显示器(系统为 Ubuntu 19.10、其他系统也有类似的设置)可以看到新添加的虚拟显示器。
X11VNC
有了虚拟显示器接下来我们要把虚拟显示器显示的内容映射到平板上了,实现虚拟屏幕的核心是VNC (Virtual Network Console)虚拟网络控制台技术,是一类远程控制技术,绝大多数Linux云主机上提供的图形界面的远程访问都使用了这个技术,简单来说vnc相当于不断发送屏幕截图。本文中我们使用
x11vnc
实现将 X11 的输出内容通过vnc进行发送。
安装
x11vnc
:
sudo apt install x11vnc
设置访问密码:
x11vnc -storepasswd
通过下面的命令就可以把虚拟显示器的内容通过网络进行发送了:
x11vnc -rfbport 5900 -clip xinerama0 -wait 1 -defer 1 -nowf -sb 0
-rfbport
:指定了连接所用的端口,默认为
5900
也可以自行设置。
-clip
:该命令设置x11vnc映射屏幕的范围,可以使用
-clip WxH+X+Y
来手动设置映射范围,也可以使用
-clip xinerama0
来自动映射显示器,其中
xinerama0
为屏幕设置中从左往右数第一个显示器,以此类推
xinerama1
为第二个,如果你的主屏幕在左边虚拟屏幕在右边,那如果设置为
xinerama0
就会将主屏幕的显示内容复制到虚拟屏幕上,也就是两个屏幕的内容一样了,这时就应该设置为
xinerama1
。
-wait
:是两次屏幕抓取的时间间隔,默认为 20 ms 效果比较卡顿,设置为 1 的话会尽可能降低抓取时间减少延迟。
-defer
:向vnc客户端发送更新的间隔,默认也为 20 ms,设置为 1 可以尽可能提高发送频率(但对网速的要求就高了)。
-nowf
:在移动窗口到虚拟屏幕时显示内容,否则会显示为一个框。
-sb
:设置休眠时间,默认为 60s 也就是如果屏幕 60s 内没有活动的话就停止数据传送,这样会导致有时鼠标从主屏移动到虚拟屏幕时会卡顿,设置为 0 后就不会休眠了。
还有其他很多选项,可以通过
man x11vnc
进行查看。
之后在手机平板上就可以通过vnc客户端通过电脑的ip地址及端口连接了。
在安卓设备上我推荐用 bVNC,在苹果设备上可以在商店里找找vnc的客户端(我没有苹果设备)。
bVNC 可以在应用商店里找,找不到的话可以下我网盘上的:https://share.weiyun.com/5fKmIiB
使用USB连接Android设备
虽然可以通过局域网连接,但有时没有局域网或网络不稳定时我们可以通过USB连接,该方法需要手机开启开发者模式允许USB调试。
安装
adb
相关工具
sudo apt install adb android-tools-adb android-tools-fastboot
通过adb的反向代理功能使手机通过USB连接。
adb reverse tcp:5900 tcp:5900
之后在安卓平板或手机上可以通过
127.0.0.1:5900
来访问。
平板、手机上使用 bVNC 来接收屏幕数据
打开 bVNC 软件后按下图填入连接信息点击 Connect 就可以连接了。
将平板变成电脑第二屏(Linux下)
用arandr来设置显示器间相对位置
另外推荐一个设置显示器分辨率及多个显示器相对位置的软件:arandr
sudo apt install arandr
使用这个软件可以很方便地设置显示器的摆放位置,并且可以生成配置脚本以备使用。
比如默认情况下虚拟显示器在内置显示器的右边,如果我想把它调到左边就可以拖过去,之后点击工具栏中的对号设置就可以生效了。
如果希望把配置保存下来可以点击布局->另存为,这样就可以把当前的配置以shell脚本的形式保存下来,下次想恢复到该配置模式只需要运行脚本即可。
生成的脚本的内容如下:
#!/bin/sh
xrandr --output VIRTUAL2 --off --output HDMI1 --off --output VIRTUAL1 --mode 960x600_60.00 --pos 0x480 --rotate normal --output eDP1 --primary --mode 1920x1080 --pos 960x0 --rotate normal
可以看到就是调用了xrandr来设置显示器相对位置。
网友开源软件
看到需要这么多步骤,是不是想放弃了呢。有网友已经把以上这些过程组合在一起写了一个很好用的软件:
GitHub地址:VirtScreen
除了显卡驱动部分必须按照 「先决条件」 手动设置外,其他部分都可以用这个软件来解决。
运行后会在系统托盘出现一个电脑形状的图标,点击后会弹出一个菜单:
点击 Open VirtScreen 后会弹出该程序的主界面:
其中
Width
和
Height
就是你所希望的虚拟屏幕的分辨率,
Portrait Mode
就是竖屏模式,
HiDPI
就是把当前的分辨率长宽乘2。
Advanced
按钮一般不需要点,如果你启用多个虚拟显示器可以在这里选择你要输出的虚拟显示器。
之后点击
ENABLE VIRTUAL SCREEN
按钮就启动了虚拟屏幕。
启用后软件的图标会变成这样:
点击
VNC
会切换到
VNC
设置页:
首先我们要点击
Advanced
把
-wait 1 -defer 1 -nowf -sb 0
填进去:
这样显示的画面就会流畅很多。
参考资料
https://github.com/brunodles/linux-second-screen/blob/master/tutorial.md
https://github.com/ChipTechno/Android-as-second-monitor-for-linux/blob/master/README.md
https://github.com/kbumsik/VirtScreen
https://github.com/mrenrich84/vnc_virtual_display_linker/blob/master/README.md
欢迎关注我的公众号 江达小记