Install VNC in Fedora with KDE Plasma

由于我桌面上已经摆满了Laptop、平板等东西,没空间放一个超大的机械键盘,并且只有一个鼠标,如果想在Laptop和台式机之间来回切换,那相当麻烦且不舒适。但台式机的配置完爆Laptop,当初组装它的目的就是为了当作工作站,拿来跑代码和渲染。为了能用Laptop甚至是平板直接操控台式机,以最大化生产力,就需要搭建VNC。

Environment

Fedora 35
Kernel 5.16.10
TigerVNC-server 1.12.0
KDE Plasma 5.24.2

and Fuck you NVIDIA

Install and configure TigerVNC

TigerVNC是一个轻量、开源的VNC,而realvnc似乎并不是开源的——至少我在官网上没找到Open source以及相应的Doc,Fedora的源也不提供realvnc(archieve里有旧版本的realvnc的source code,不过那都是上古版本了)。考虑到开源洁癖,我们选择TigerVNC来搭建server。

以下内容参考自Fedora官方Doc以及StackOverflow。

Install TigerVNC

$ sudo dnf install tigervnc-server

Configure TigerVNC

~/.vnc/xstartup的内容改为:

#!/bin/sh

unset SESSION_MANAGER
unset DBUS_SESSION_BUS_ADDRESS

/etc/X11/xinit/xinitrc

[ -x /etc/vnc/xstartup  ] && exec /etc/vnc/xstartup 
[ -r $HOME/.Xresources ] && xrdb $HOME/.Xresources
xsetroot -solid grey
vncconfig -iconic & 
startkde &

需要注意的是,/etc/X11/xinit/xinitrc这句是必须的,不然同一个user不能同时在VNC Client和本地登录KDE Session,即要么VNC Client上黑屏,要么台式机Login后黑屏。

一般而言,考虑到安全性的问题,都是建议单独创建一个user来运行VNC,不过我不想再重新配置KDE的Config了.

~/.vnc/config下的内容可以按需uncomment和modify,不是必要的。之后给VNC server创建一个密码:

$ vncpasswd

需要注意的是这个密码是明文储存的,并且访问不需要root权限。创好密码后就能直接运行了:

$ vncserver :1

记得在Firewall里把5901-5903(需要几个VNC Server就开几个)port打开。

补充一些别的command:

$ vncserver -list
$ vncserver -kill :1

Configure VNC with systemd

TigerVNC官方计划在未来的版本中取消用命令行运行vncserver :1的方式,并建议用户使用systemd来运行并自启动vncserver服务。首先我们把.service文件拷到systemd里:

$ sudo cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@.service

修改以下两行(将USER换为你自己的用户名):

ExecStart=/sbin/runuser -l USER -c "/usr/bin/vncserver %i -geometry 1280x1024"

PIDFile=/home/USER/.vnc/%H%i.pid

如果有SELinux项就把它注释掉,不然systemctl start会报Permission denied的错误。(这一点在Fedora的Doc里没提及,有可能是新版本的TigerVNC加入了这一项但Doc没有及时更新)当然如果你想要极致的安全的话可以自行修改这一项。

接下来打开/etc/tigervnc/vncserver.users,在里面添加(将USER换为你自己的用户名):

:1=USER

之后Reload一下:

$ sudo systemctl daemon-reload

然后就能用啦:

$ systemctl start vncserver@:1.service
$ systemctl enable vncserver@:1.service

补充

如果有强迫症或着是完美主义者的话,可以将.service的设置改为如下:

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'
ExecStart=/sbin/runuser -l USER -c "/usr/bin/vncserver %i -geometry 1280x720"
ExecStop=/bin/sh -c '/usr/bin/vncserver -kill %i > /dev/null 2>&1 || :'

这样每次启动或关闭service时,会自动kill掉正在运行的VNC server。