前言
最近在配置Arch的各种小功能,想把所有win的体验移植过来,前段时间win经常蓝屏也不知道为啥,好像是显示驱动有问题但是我回退了也是蓝屏,有时间再研究吧。现在已经开始arch日用了,感觉还不错,在win上有一个好用的软件SpaceDesk可以实现平板作为电脑的副屏,arch上肯定是不行的,不过我发现Sunshine + Moonlight串流是一个非常好的办法不过就是他并不支持有线连接,如果网络环境不好的话可能有延迟,ai说了个邪修办法,是平板有线和电脑共享网络,有时间我试试有没有更好用。安装过程发现坑有点多,尤其是配置虚拟显示器那里,于是想着记录下写一篇博客,好久没更新了,失踪人口回归…
配置防火墙
当我们安装好Sunshine会发现平板连接不到,显示:无法连接至指定电脑。请确保所需端口没有被防火墙阻止。可以先执行下下面的命令开放端口
# 1. 开放 TCP 端口 (用于握手和控制)
sudo firewall-cmd --permanent --zone=public --add-port=47984/tcp
sudo firewall-cmd --permanent --zone=public --add-port=47989/tcp
sudo firewall-cmd --permanent --zone=public --add-port=48010/tcp
# 2. 开放 UDP 端口 (用于音视频推流)
sudo firewall-cmd --permanent --zone=public --add-port=48010/udp
sudo firewall-cmd --permanent --zone=public --add-port=47998-48000/udp
# 3. 重载防火墙使配置生效
sudo firewall-cmd --reload
现在应该可以正常连接了,可能显示还有问题,下面解决,也可以使用下面的命令看一下规则是否配置成功了
sudo firewall-cmd --list-all

创建虚拟显示器
下面就是最麻烦的一个就是创建虚拟显示器,我这里提供一个非常简单的办法
常见分辨率虚拟显示器的配置
查看接口状态
我们需要找到显卡上一个未连接 (disconnected) 的接口来作为虚拟显示器的输出接口,运行下面的命令可以进行查看
for p in /sys/class/drm/*/status; do
con=${p%/status}
echo -n "${con#*/card?-}: "
cat $p
done
随便找一个后面是disconnect的接口
配置
使用下面的命令打开grub文件
sudo nano /etc/default/grub
找到GRUB_CMDLINE_LINUX_DEFAULT=这个参数,一般就在最前面,在他的引号的里面的最后面添加一个参数video=DP-1:1920×1080@60e其中DP-1是你的空闲端口,1920×1080是分辨率,60是刷新率,最后的e是强制的意思,这个只对常见分辨率刷新率的有效果,如果要是特殊的,系统里面没有配置的话就会显示一个类似的安全配置,这个后面再说,这比如我图片里面的那样,因为我图片这样的比较特别没有完全成功,解决办法后面再说

按 Ctrl+O 保存,Enter 确认,Ctrl+X 退出
然后运行下面命令重新生成配置
sudo grub-mkconfig -o /boot/grub/grub.cfg
reboot重启电脑
现在虚拟显示器就已经配置成功了,平板上的moonlight客户端应该就可以正常显示了,enjoy
发生意外错误的“救砖”办法
在配置的时候我有一次尝试使用dp-3,发生了显示错位如下图…完全进不了系统,这时候可以在grub选择系统的那个界面在选择到Arch linux的选项上面按下键盘e,这个时候删除你的配置就可以恢复了,有的接口显示会有问题,具体原因我也不清楚
壁纸和低栏错位
因为kde是可以每一个显示器单独配置壁纸和低栏的,就会出现不同的显示器有不同的配置文件,我是笔记本还有一个外界屏幕,然后配置虚拟显示器之后,外接显示器之前的配置到虚拟显示器里面了,其实解决的办法也很简单,在设置里面调节一下这几个显示器的优先级就可以,把之前的外界显示器的优先级调到第二就行了

常见分辨率虚拟显示器的配置
由于我需要的分辨率和刷新率比较多特殊,2480×1860的38hz,所以需要手动制作下EDID文件
# 下载所需的工具
git clone https://github.com/akatrevorjay/edid-generator.git
cd edid-generator
# 创建一个文件,也可以使用现成里面有的进行修改
nano 2480x1860.S
这里给出我使用的配置文件,每一个人的可能都不一样,可以让ai生成计算一下,我这个就是
/* * 2480x1860 @ 38Hz EDID 配置文件
* 基于 cvt 2480 1860 38 计算所得
*/
#define VERSION 1
#define REVISION 3
/* 核心时序参数 */
#define CLOCK 236500 /* 像素时钟 236.50 MHz */
#define XPIX 2480 /* 宽度 */
#define YPIX 1860 /* 高度 */
#define XY_RATIO XY_RATIO_4_3 /* 宽高比 4:3 (关键!否则平板画面会拉伸) */
/* 下面是根据 CVT 算法算出来的“黑边”和同步信号数据 */
#define XBLANK 848
#define YBLANK 49
#define XOFFSET 168
#define XPULSE 256
#define YOFFSET 3
#define YPULSE 10
#define DPI 96 /* 默认 DPI */
#define VFREQ 38 /* 你的目标刷新率 */
#define TIMING_NAME "Linux Custom"
/* 信号极性 (标准 CVT 通常是 -hsync +vsync,这里用默认即可) */
#define HSYNC_POL 1
#define VSYNC_POL 1
/* 引用生成逻辑 */
#include "edid.S"
使用make命令编译生成
然后应该就可以看到生成的几个文件,其中最重要的就是.bin文件,也是我们唯一需要的
# 创建文件夹
sudo mkdir -p /usr/lib/firmware/edid
# 复制文件到内核
sudo cp 2480x1860.bin /usr/lib/firmware/edid/custom_2480.bin
# 更新 initramfs (把文件打包进启动镜像)
sudo mkinitcpio -P
然后编辑下grub文件,还是在GRUB_CMDLINE_LINUX_DEFAULT=参数后面添加drm.edid_firmware=DP-1:edid/custom_2480.bin video=DP-1:e
sudo nano /etc/default/grub
修改完成后执行下面的代码,重新配置grub
sudo grub-mkconfig -o /boot/grub/grub.cfg
reboot重启电脑,现在你的配置应该就没有问题了,可以去设置里面查看

配置自动启动和禁用虚拟显示器
因为我们可能不是所有时候都需要串流,不使用的时候显卡还在渲染那个显示器可能需要占用一些资源,所以我想实现一个开启串流自动开启虚拟显示器,推出串流就自动禁用
我sunlight有一个非常优雅的解决办法,在网页端的应用程序一栏,点击你使用的后面点击编辑,在下面有一个打开时执行命令和退出应用时要执行的命令,在那里面填写对应的命令,命令可以先在终端上测试一下是不是可以正常使用,其中DP-1是刚刚使用的虚拟显示器对应的接口
# 开启虚拟显示器
kscreen-doctor output.DP-1.enable
# 关闭虚拟显示器
kscreen-doctor output.DP-1.disable

好了现在的配置应该就完美了!
致谢
感谢w568w写的博文为我提供了一个思路
感谢gemini