Ubuntu22.04服务器配置单用户TigerVNC远程桌面,及源码编译win版vncviewer

写在前面

V2.0 2024.3.3 本教程适用于个人搭建的专为自身学习、科研、工作使用的单用户服务器,即服务器本身不直接连物理显示器,或放置于特定环境下,需要通过网络来远程操控。本教程推荐的方法将在专供个人单用户使用时获得与直连键鼠和物理显示器登录使用时完全相同的操作体验
V2.0 2024.1.7 使用tigervnc viewer作为Windows下的vnc客户端,相较Realvnc viewer,其由于和Server端的Tigervnc同源,故支持1、复制粘贴中文字符;2、通过窗口大小自适应调整vnc分辨率,并使显示清晰;3、支持X.509证书加密通信。而Realvnc复制中文会乱码。故强烈建议放弃Realvnc viewer,按本教程使用tigervnc viewer
V1.0 2024.1.1 使用Realvnc viewer作为客户端,并解决显示不清晰的问题。

安装桌面环境

sudo apt install ubuntu-desktop
  • (替代)对空间占用有严格要求的话,则
sudo apt install ubuntu-desktop-minimal

安装TigerVNC服务端

sudo apt install tigervnc-standalone-server

初始化VNCserver(设置密码)

非sudo运行:

vncpasswd

提示: Would you like to enter a view-only password (y/n)? 选n.

创建用户级xsessionrc文件

注意:这一步可以使vnc正常显示桌面和侧边栏,以及以sudo权限运行图形化程序

cat << EOF > ~/.xsessionrc
export XAUTHORITY=$HOME/.Xauthority
export XDG_CURRENT_DESKTOP=ubuntu:GNOME
export XDG_CONFIG_DIRS=/etc/xdg/xdg-ubuntu:/etc/xdg
EOF

创建用户级vnc配置文件

vi ~/.vnc/config

保存一下内容(注意替换成实际用户名):

session=ubuntu
geometry=1600x900
localhost=no
depth=24
X509Cert=/home/你的用户名/.vnc/vnc-server.pem
X509Key=/home/你的用户名/.vnc/vnc-server-private.pem
SecurityTypes=X509Vnc

最好再参考VNC自动复制选中的文本怎么办?添加相关内容以改善使用体验。
(在我的方案中,不需要配置什么xstartup文件,因为tigervnc自己会选择/etc/X11/Xtigervnc-session作为启动配置。)

创建X.509证书

TigerVNC官方文档:Github: TigerVNC/tigervnc - Secure your connection

openssl req -x509 -newkey rsa -days 3650 -nodes -config /usr/lib/ssl/openssl.cnf \
-keyout vnc-server-private.pem -out vnc-server.pem \
-subj '/CN=你的服务器名称' -addext "subjectAltName=IP:x.x.x.x,IP:y.y.y.y"
  1. 将<你的服务器名称>替换为你想输入的任意字符串;
  2. (适用于局域网)subjectAltName=后面的"IP:x.x.x.x"可以有1个或多个,即你的服务器目前的ipv4地址(可通过ip address show查看),或和你的服务器以后可能改变的所有ip地址,比如10.32.128.x是ip可能的变化范围,就把10.32.128.1一直到10.32.128.255这255个IP地址依次以以上方式填好,用逗号隔开
  3. (适用于互联网有域名情况)subjectAltName=后面可以更改为对应的域名,如subjectAltName=DNS:example.com等。

将以上命令生成的vnc-server-private.pem和vnc-server.pem文件拷贝到~/.vnc目录下。

[方案一] 创建自动登录服务并自启动vncserver(推荐)

这种方法相比传统的创建vncserver服务的方法,对于单人单用户使用时更加方便,因为这样和直接通过物理显示器登录到用户有着相同的权限管理配置,就能够修改一些常规远程连接时不能修改的设置,一些操作如自动更新软件包时也不需要输密码了,获得了直接物理操控主机一样的体验。这是传统创建服务项的方法所没有的优势。

1. 复制系统自带的getty@.service文件

sudo cp /lib/systemd/system/getty@.service /etc/systemd/system/getty-myself@.service

2. 修改此getty-myself@.service文件

sudo vi /etc/systemd/system/getty-myself@.service

i.ExecStart=一行由ExecStart=-/sbin/agetty -o ‘-p – \u’ --noclear %I $TERM 修改为ExecStart=-/sbin/agetty --autologin 你的用户名 --noclear %I $TERM,其中你的用户名为实际用户名。
ii.RestartSec=0一行修改为RestartSec=1min30s ,让意外导致的vncserver终止能够自动重启。
iii. :wq保存
3. 屏蔽系统原getty服务

sudo systemctl mask getty@.service

4.启用getty-myself@tty1.service服务

sudo systemctl enable getty-myself@tty1.service

5. 修改$HOME/.profile文件

vi $HOME/.profile

添加并保存如下内容:

# ***** auto vncserver *****
if [ -z "$DISPLAY" ] && [ $(tty) == /dev/tty1 ]; then
    /usr/bin/vncserver -fg :1
    exit
fi
# ***** auto vncserver *****

重启服务器,等待几分钟后即可远程连接vnc,注意以上设置导致端口号为:1。

[方案二] 创建VNCserver自启动服务 (不推荐)

原方法已不推荐使用,故归档到附录中。

更改默认启动模式

对于本文配置的VNCserver,其与物理显示器的同用户登录后的图形界面是有冲突的,两者仅能同时存在其一。对于服务器来说,一般不需连接物理显示器,所以推荐如下设置以释放可能的GPU资源占用。

sudo systemctl set-default multi-user.target

注意:这将使主机开机后,接连的物理显示器进入命令行模式,而不是图形界面。

Windows端配置TigerVNC viewer

  • https://sourceforge.net/projects/tigervnc/中点击下载Released /stable/1.13.1/vncviewer64-1.13.1.exe,并将其存放到合适的位置。 推荐使用自己编译的vncviewer,不仅解决了正式版中一个令人恼火的bug,还有中文版的界面,详见Windows上的Tigervncviewer需要复制两次才能将剪贴板复制到服务器,怎么办?
  • 将Ubuntu服务器~/.vnc目录中的vnc-server.pempasswd拷贝到Windows下的C:\Users\<你的用户名>\AppData\Roaming\vnc目录中。
  • 在桌面创建vncviewer64-1.13.1.exe的快捷方式,并做如下配置:
    1. [使vnc显示画面清晰] 右键快捷方式,选择属性,点击兼容性选项卡,点击更改高DPI设置,勾选替代高DPI缩放行为(也可在更改所有用户的设置中更改),选择应用程序,确定保存设置。
    2. [使vnc无需密码自动连接] 右键快捷方式,点击快捷方式选项卡,在目标一栏中追加-PasswordFile="C:\Users\<你的用户名>\AppData\Roaming\vnc\passwd"启动参数,确定保存。
  • 启动vncviewer64,输入<IP地址/域名>:<端口号>,如192.168.1.1:1,点击Options…,在Security选项卡中,将Path to X509 CA certificate的值更改为C:\Users\<你的用户名>\AppData\Roaming\vnc\vnc-server.pem,确认,点击Connect连接vnc服务器。

Q&A

(必看) VNC自动复制选中的文本怎么办?

要取消此功能,有两种方法:

  • [方案一](临时)在右侧dock栏中的vncconfig图标,取消选中下图中的两项;
    在这里插入图片描述
  • [方案二](永久)编辑tigervnc启动配置文件:
vi ~/.vnc/config

增加如下2行:

SendPrimary=0
SetPrimary=0

保存,重启VNCserver服务。

[For Ubuntu Server] GNOME桌面有线网络显示Wired Unmanaged怎么办?

GNOME桌面有线网络显示Wired Unmanaged,有些图形应用无网络连接,可以如下方式解决。
[!注意:此方法会断网且可能更新IP地址,建议物理连接主机操作!]

  1. [建议] 将/etc/netplan/下所有yaml文件,增加后缀.bak
  2. 新建配置文件:
sudo vim /etc/netplan/01-netcfg.yaml

写入以下内容并保存:

network:
  version: 2
  renderer: NetworkManager
  1. 禁用systemd-networkd服务
sudo systemctl disable systemd-networkd.service
  1. [可做可不做?] 彻底屏蔽systemd-networkd服务
sudo systemctl mask systemd-networkd.service
  1. [可选] 禁用networkd-dispatcher服务
sudo systemctl disable networkd-dispatcher.service

(必看)[最新源码编译vncviewer] Windows上的Tigervncviewer需要复制两次才能将剪贴板复制到服务器,怎么办?

参考:https://github.com/TigerVNC/tigervnc/issues/1586

在Win11上使用官方版本的vncviewer64 1.13.1时,有时我们会遇到很苦恼的事情,就是如果之前往vnc里复制过文本,之后再在win下复制文本,想将其通过vncviewer复制到服务器上时,往往上一次复制的结果会覆盖掉当前的剪贴板,导致我们不得不再一次在win下复制,到vnc内粘贴,极大地影响了工作效率。
而tigervnc官方已修复此bug,只是尚未发布新的预编译正式版vncviewer,故需要我们自行编译使用。
自行编译版本自带中文界面

以下连接是我已经编译好了的vncviewer安装包,已在本人电脑(win11 22H2)中正常使用快2月(2024.3.3),尚未发现有bug存在,如需要可放心下载使用。
链接: https://pan.baidu.com/s/1BK0CaAY0zWk19FXWkjuvxA?pwd=zd8v 提取码: zd8v

自行编译步骤

1. 安装msys2
2. 打开MSYS UCRT64,安装如下包:

 pacman -S mingw-w64-ucrt-x86_64-cmake \
  mingw-w64-ucrt-x86_64-gcc \
  mingw-w64-ucrt-x86_64-make \
  mingw-w64-ucrt-x86_64-fltk \
  mingw-w64-ucrt-x86_64-gnutls \
  mingw-w64-ucrt-x86_64-pixman

3. 安装innosetup
https://jrsoftware.org/isdl.php#stable下载
4. 在MSYS UCRT64设置环境变量

export PATH="/c/Program Files (x86)/Inno Setup 6":$PATH

5. 切换到一个临时目录下,运行:

git clone https://github.com/TigerVNC/tigervnc.git
cd tigervnc

6. 修改3个文件:

6.1. “tigervnc\cmake\StaticBuild.cmake”的第68行:

set(GNUTLS_LIBRARIES "-Wl,-Bstatic -lgnutls")

改成

set(GNUTLS_LIBRARIES "-Wl,-Bstatic -lgnutls -lbrotlidec -lbrotlienc -lbrotlicommon -lzstd")

6.2. “tigervnc\release\tigervnc.iss.in”的[Files]下增加如下内容:

Source: "C:\msys64\ucrt64\bin\libffi-8.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace;
Source: "C:\msys64\ucrt64\bin\libp11-kit-0.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace;
Source: "C:\msys64\ucrt64\bin\libunistring-5.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace;
Source: "C:\msys64\ucrt64\bin\libintl-8.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace;
Source: "C:\msys64\ucrt64\bin\libiconv-2.dll"; DestDir: "{app}"; Flags: ignoreversion restartreplace;

6.3. 因为vncviewer不需要管理员权限,所以我们将“tigervnc\release\tigervnc.iss.in”的[Setup]下

DefaultDirName={pf}\TigerVNC

修改为

DefaultDirName={userappdata}\TigerVNC
PrivilegesRequired=lowest

这将安装到用户级目录下

7. MSYS UCRT64中运行

mkdir build
cd build
cmake -G "MinGW Makefiles" -DBUILD_STATIC=ON ../
mingw32-make.exe
mingw32-make.exe installer

8. 安装程序编译完毕,位置如.\tigervnc\build\release\tigervnc64-1.13.80.exe。

如何安装GNOME扩展?

https://askubuntu.com/questions/1404497/how-to-install-gnome-shell-extensions-in-ubuntu-22-04-lts

附录

RealVNC vncviewer画面显示不清晰的解决方法

以RealVNC viewer为例,建立好一个连接后,右键此连接,Properties->Options,将Picture quality设置为High,并将Scaling设置为100%,OK.
在这里插入图片描述

[方案二] 创建VNCserver自启动服务(归档,不推荐)

创建服务项

 sudo vi /etc/systemd/system/vncserver@.service

复制粘贴如下内容:

[Unit]
Description=Start TigerVNC server at startup
After=syslog.target network.target

[Service]
Type=simple
WorkingDirectory=/home/你的用户名

ExecStartPre=-/bin/su - 你的用户名 -c "/usr/bin/vncserver -kill :%i > /dev/null 2>&1"
ExecStart=/bin/su - 你的用户名 -c "/usr/bin/vncserver -fg :%i"
ExecStop=/bin/su - 你的用户名 -c "/usr/bin/vncserver -kill :%i"

[Install]
WantedBy=multi-user.target

记得将<你的用户名>替换成自己的用户名,-geometry 后面的分辨率可自由设置(对于tigervnc viewer,无论这里设置为多少,viewer都会根据窗口大小自适应调整分辨率,故无需设置)。
其中PAMName=login是关键 ,只有正确做如上设置,才能在vncviewer内正常打开snap安装的软件!网上其他的Type=forking+PIDFile=XX.pid的方法都是用不了的。

输入:wq保存文件

刷新并启用服务

sudo systemctl daemon-reload
sudo systemctl enable vncserver@1.service

提示:@后的数字即VNCserver的端口,推荐:1起步。

sudo systemctl start vncserver@1

无法显示密码输入界面导致需要授权的应用无法运行怎么办?(已无需配置,归档)

  • [方案一](一次性)使用systemctl重启vncserver服务。
  • [方案二](永久)(增加误操作风险!)彻底取消polkit输密码认证。

创建配置文件:

sudo vi /etc/polkit-1/localauthority/50-local.d/99-nopassword.pkla

写入以下内容并保存:

[No Password for Opening Applications]
Identity=unix-group:sudo
Action=*
ResultAny=yes

参考文献

不要直接用里面的内容,存在问题,本文中已解决。

GIthub: indyfromoz/VNC_Server_On_Ubuntu_22.04LTS.md

  • 12
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值