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。