Ubuntu 20.04 VNC远程桌面实战:TightVNC+Xfce+systemd深度配置

Ubuntu 20.04 VNC远程桌面实战:TightVNC+Xfce+systemd深度配置 1. 项目概述为什么 Ubuntu 20.04 上的 VNC 配置值得花 30 分钟认真对待VNCVirtual Network Computing不是个新概念但直到今天在 Ubuntu 20.04 这个被大量用作开发服务器、边缘计算节点、ROS 机器人主控、甚至轻量级桌面替代方案的 LTS 版本上它依然是最可靠、最透明、最不依赖图形环境完整性的远程桌面方案。我第一次在客户现场部署一个基于树莓派 4B 的工业 HMI 系统时就踩过坑客户要求“必须能从 Windows 笔记本远程看到完整的 Ubuntu 桌面且不能重启系统”当时试了 xrdp结果一连串 GTK 主题崩溃又试了 NoMachine发现它偷偷拉起自己的会话管理器和客户已有的 systemd --user 服务冲突。最后回归 TightVNC Xfce配合一个 12 行的 systemd service 文件5 分钟搞定稳定运行了 18 个月零中断。这背后不是运气而是对 Ubuntu 20.04 图形栈、systemd 初始化机制、X11 会话生命周期的深度理解。你搜到的那些热词——“ubuntu没声音20.04”、“system has not been booted with systemd as init system”、“vnc viewer下载”、“esxi 安装的黑苹果 用tiger vnc 远程鼠标是一个小点如何解决”——全指向同一个核心矛盾VNC 不是“装上就能用”的黑盒它是 Ubuntu 桌面会话与网络协议之间的一座桥桥的每一块砖都得严丝合缝。本文不讲“复制粘贴 5 行命令”而是带你拆开这座桥看清桥墩怎么打、桥面怎么铺、桥灯怎么接电。你会明白为什么tightvncserver命令行启动后能连但写成 systemd service 就报错为什么vncviewer显示鼠标是个小点其实是 X11 的 cursor theme 路径没加载为什么 SSH 和 VNC 必须绑定使用不是为了“安全”而是为了绕过 Ubuntu 20.04 默认禁用的 TCP 端口直连。这不是一篇 Quickstart而是一份可装进你运维知识库的 VNC 实战手册。2. 整体设计思路与方案选型逻辑为什么是 TightVNC Xfce systemd而不是其他组合2.1 为什么放弃 x11vnc、NoMachine、Remmina 内置 VNC先说结论x11vnc 是“镜像式”VNC它直接抓取当前物理显示器的帧缓冲优点是音视频同步好、能显示登录界面缺点是无法在无头服务器headless server上工作——Ubuntu 20.04 默认安装的 server 版根本没装 X serverx11vnc 启动就报Cant open displayNoMachine 是商业闭源方案免费版功能阉割严重比如不支持多用户并发桌面且其自研协议在企业防火墙策略下常被误判为高危流量Remmina 内置的 VNC 插件只是个客户端它不提供服务端能力。而我们面对的真实场景是什么是客户机房里一台没接显示器的 Dell R730上面跑着 ROS 2 Foxy你需要随时连上去看 rviz 的 3D 场景是实验室里一台装了 Ubuntu 20.04 Server 的 NUC你得在没装 GUI 的情况下临时配个桌面调试 Python 脚本。这些场景只有“虚拟桌面”Virtual Desktop方案能解即 VNC server 自己创建一个独立的 X11 会话不依赖物理显卡和显示器。2.2 TightVNC vs TigerVNC选型背后的性能与兼容性权衡TightVNC 和 TigerVNC 都是开源 VNC server但内核差异巨大。TigerVNC 是 TurboVNC 的分支专为高性能科学可视化优化它默认启用 JPEG 压缩和 ZRLE 编码对大屏、高刷、3D 图形传输极友好但它有个硬伤Ubuntu 20.04 的 APT 仓库里没有官方包你得手动编译或加第三方源这对生产环境是红线。TightVNC 则不同它从 2002 年就存在代码极其稳定Ubuntu 20.04 的universe仓库里有tightvncserver包版本是 1.3.9虽老但够用。更重要的是它的编码逻辑简单默认用 raw 编码适合局域网可手动切到 hextile适合低带宽且所有编码器都是纯 C 实现没有外部依赖。我实测过在千兆局域网下TightVNC 传输一个 1920×1080 的 Xfce 桌面CPU 占用恒定在 3.2%i5-8250U而 TigerVNC 同配置下是 6.8%因为后者要实时做 JPEG 量化表计算。这不是性能优劣而是“确定性”与“灵活性”的取舍——生产环境要的是 100 次连接 100 次成功不是第 101 次突然卡顿。2.3 为什么必须搭配 Xfce而不是 GNOME 或 KDEUbuntu 20.04 桌面版默认是 GNOME但 GNOME 3.36 对 VNC 的支持是灾难性的。原因在于它的 Wayland 显示服务器默认启用而 VNC 协议只认 X11。虽然你可以强制 GNOME 用 Xorg 会话但 GNOME 的gnome-session会疯狂拉起gnome-settings-daemon、gnome-shell、mutter等 12 个进程每个都占 50MB 内存最终 VNC 会话卡成 PPT。KDE 的问题更隐蔽它的kwin_x11窗口管理器会检测到“非物理显示”自动禁用所有动画和特效导致按钮点击无反馈你以为是 VNC 坏了其实是 KDE 的自适应逻辑在作祟。Xfce 则完全不同它从设计之初就是为轻量级桌面打造。xfce4-session启动时只拉起 4 个核心进程xfwm4窗口管理器、xfdesktop桌面图标、xfce4-panel任务栏、Thunar文件管理器总内存占用 120MB。最关键的是Xfce 的xfconf配置系统完全基于 XML 文件你改一个鼠标主题只需xfconf-query -c xsettings -p /Net/CursorThemeName -s Adwaita一行命令而 GNOME 得去改 dconf 数据库稍有不慎就整个会话崩溃。这就是为什么所有稳定 VNC 教程都推 Xfce——它不是最好看的但它是唯一让你把注意力放在业务逻辑上而不是桌面环境调试上的选择。2.4 systemd 服务化不是为了“高大上”而是解决真实运维痛点你可能觉得“我直接在终端敲vncserver :1不就完了” 早期我也这么干直到某天凌晨 3 点客户电话打来“你们的机器人控制台连不上了” 我 SSH 登上去一看ps aux | grep vnc返回空——原来vncserver是挂载在某个 SSH 会话下的子进程那个会话超时断开了VNC 就跟着死了。systemd 的价值在此刻凸显它让 VNC 成为操作系统一级的服务和sshd、cron平起平坐。systemctl start vncserverusername这条命令背后是 systemd 把 VNC 进程的PID 1设为自己的fork()子进程并监控其健康状态。一旦进程异常退出systemd 会在 5 秒内按预设策略重启Restarton-failure。更关键的是systemd 的User和WorkingDirectory参数能精准控制 VNC 以哪个用户身份启动、在哪个目录读取配置。比如WorkingDirectory/home/ubuntu这一行决定了~/.vnc/xstartup文件的解析路径——很多教程失败就是因为.vnc目录权限不对而 systemd 服务能用PermissionsStartOnlytrue配合ExecStartPre命令在启动前自动修复权限。这不是炫技这是把“人肉守护进程”变成“机器自动守护”的分水岭。3. 核心细节解析与实操要点从安装到第一个像素显示的完整链路3.1 安装阶段APT 源、依赖与一个被忽略的关键包安装 TightVNC 和 Xfce 看似简单但有三个极易被跳过的细节第一确认universe源已启用。Ubuntu 20.04 Server 默认只启用了main和restricted而tightvncserver在universe里。执行sudo add-apt-repository universe sudo apt update是必要前置动作。跳过这步apt install tightvncserver会报Unable to locate package网上 70% 的“安装失败”帖子根源在此。第二Xfce 的最小化安装必须带xfce4-goodies。很多人只装xfce4结果发现截图工具xfce4-screenshooter没有剪贴板管理器parcellite缺失连最基本的 CtrlC/V 都失效。xfce4-goodies包含了 23 个增强插件其中xfce4-clipman-plugin是解决“VNC 里复制粘贴失效”的唯一正解——它把 X11 的 PRIMARY 和 CLIPBOARD 两个剪贴板缓存做了桥接否则你在 VNC 里复制的文字根本进不了宿主机的剪贴板。第三必须手动安装xfonts-base。Ubuntu 20.04 的 minimal Xorg 安装不包含基础字体导致 VNC 启动后桌面一片空白只有鼠标箭头能动。错误日志在~/.vnc/*.log里会显示Could not open default font fixed。这个包只有 4.2MB但缺了它整个 VNC 就是聋子的耳朵——摆设。安装命令是sudo apt install xfonts-base注意不是xfonts-75dpi或xfonts-100dpi那些是高 DPI 屏幕用的对 VNC 无效。提示安装完成后务必执行sudo apt autoremove sudo apt clean。Ubuntu 20.04 的 APT 会缓存旧包版本如果之前失败过残留的tightvncserver临时包可能污染依赖树导致后续dpkg --configure -a卡死。3.2 配置阶段.vnc/xstartup文件的每一行都在做什么这是整个 VNC 配置中最容易出错、也最需要理解原理的部分。网上流传的模板常是#!/bin/bash xrdb $HOME/.Xresources startxfce4 这段代码在 Ubuntu 20.04 上会失败原因有三xrdb $HOME/.Xresources这行试图加载 X 资源数据库但 Ubuntu 20.04 默认不生成~/.Xresources文件执行它会报xrdb: Cant open file /home/ubuntu/.Xresources虽然不影响启动但日志里全是红色警告干扰故障排查。startxfce4 启动方式不标准。Xfce 官方文档明确要求用exec startxfce4exec的作用是用startxfce4进程完全替换当前 shell 进程这样当 VNC 会话结束时X server 才能正常退出。如果用shell 进程还活着VNC server 会认为会话未终止端口不释放下次启动就报Address already in use。缺少输入法支持。Ubuntu 20.04 默认用fcitx5但startxfce4不会自动加载它。如果你需要中文输入比如调试 Python 脚本时写中文注释必须在exec前加一行export GTK_IM_MODULEfcitx5 export QT_IM_MODULEfcitx5 export XMODIFIERSimfcitx5。修正后的.vnc/xstartup应该是#!/bin/bash # 设置正确的 DISPLAY 环境变量确保子进程知道连哪个 X server export DISPLAY:1 # 加载 fcitx5 输入法如不需要中文可删除此行 export GTK_IM_MODULEfcitx5 export QT_IM_MODULEfcitx5 export XMODIFIERSimfcitx5 # 启动 Xfce 会话exec 是关键 exec startxfce4保存后必须执行chmod x ~/.vnc/xstartup。Linux 下脚本没有执行权限比 Windows 下双击 exe 失败更隐蔽——它会静默失败日志里只有一行xstartup: line 1: exec: startxfce4: not found而你根本看不到因为startxfce4路径是对的问题出在脚本本身没权限。3.3 权限与安全为什么~/.vnc目录权限必须是 700VNC 的密码存储在~/.vnc/passwd文件里这是一个二进制文件内容是 DES 加密后的密码哈希。Linux 的安全模型规定任何包含敏感凭证的文件其父目录权限不能宽松。如果~/.vnc是 755意味着同组用户和其他用户都能ls列出目录内容虽然他们读不了passwd因为passwd本身是 600但能知道这个文件存在这违反了最小权限原则。更严重的是某些老旧的 VNC client如 RealVNC Viewer 6.x在连接时会尝试读取~/.vnc/config文件获取额外参数如果目录可读它可能因权限混乱而拒绝连接。chmod 700 ~/.vnc这条命令本质是告诉系统“这个目录里的所有东西只属于当前用户其他人连门都别想靠近”。我在客户现场遇到过一次诡异问题VNC 能连上但桌面背景是黑色所有图标都不显示。查日志发现xfdesktop进程启动失败原因是~/.vnc权限是 755xfdesktop认为环境不安全主动退出。把权限改成 700重启服务立刻恢复正常。这不是玄学是 Linux 安全模型的刚性约束。3.4 鼠标光标异常那个“小点”问题的底层真相搜索热词里高频出现“esxi 安装的黑苹果 用tiger vnc 远程鼠标是一个小点如何解决”这个问题在 Ubuntu 20.04 TightVNC 上同样存在。现象是VNC viewer 里鼠标指针变成一个 16×16 像素的白色小方块点击区域错位。根本原因不在 VNC server而在 X11 的 cursor theme 加载机制。X11 默认用xcursor格式光标它需要一个主题包如DMZ-White和一个索引文件cursor.theme。Ubuntu 20.04 的xserver-xorg-core包不自带完整光标主题只提供了core和default两个极简主题。解决方案分两步安装光标主题包sudo apt install dmz-cursor-theme创建 X11 配置文件/usr/share/X11/xorg.conf.d/10-cursor.conf内容为Section InputClass Identifier system-cursors MatchIsPointer on Option CursorTheme DMZ-White Option CursorSize 24 EndSection这里CursorSize 24是关键它把默认 16px 放大到 24px适配现代高分屏。MatchIsPointer on确保只对鼠标设备生效不影响触摸板。做完这两步重启 VNC 服务鼠标立刻变成清晰的箭头。这个操作之所以被忽略是因为它不涉及 VNC 本身而是 X11 的底层配置——这正是资深运维和新手的本质区别前者看日志能定位到Xorg.1.log里Failed to load cursor theme这行后者只会重装 VNC。4. 实操过程与核心环节实现从零开始的完整部署流水线4.1 第一步环境初始化与基础依赖安装打开终端以 root 或 sudo 权限执行以下命令。注意这不是简单的复制粘贴每一行都有其不可跳过的理由# 1. 更新 APT 索引并启用 universe 源Ubuntu 20.04 Server 默认不启用 sudo add-apt-repository universe -y sudo apt update # 2. 安装 TightVNC server 和 Xfce 桌面环境 # 注意这里用 apt install 而不是 snap因为 snap 的 tightvncserver 与 systemd 集成有问题 sudo apt install tightvncserver xfce4 xfce4-goodies xfonts-base -y # 3. 安装 fcitx5 输入法如需中文支持 sudo apt install fcitx5 fcitx5-pinyin -y # 4. 清理 APT 缓存避免后续 dpkg 错误 sudo apt autoremove -y sudo apt clean执行完后验证安装是否成功# 检查 tightvncserver 版本 vncserver -version # 应输出TightVNC version 1.3.9 # 检查 Xfce 组件是否齐全 which startxfce4 xfce4-panel xfwm4 # 应返回三个路径如 /usr/bin/startxfce4注意如果which startxfce4返回空说明xfce4包没装全需重新运行sudo apt install --reinstall xfce4。这是因为apt install在网络波动时可能只下载了部分 deb 包--reinstall强制校验并补全。4.2 第二步首次运行与密码设置首次运行vncserver的目的不是启动服务而是生成初始配置文件。执行vncserver系统会提示You will require a password to access your desktops. Password: Verify: Would you like to enter a view-only password (y/n)? n这里输入的密码就是 VNC viewer 连接时用的密码长度必须为 6-8 位TightVNC 的 DES 加密算法对超过 8 位的密码会截断导致你输 12 位密码实际只用了前 8 位。密码设置后vncserver会自动创建~/.vnc目录并生成passwd文件和一个初始的xstartup模板。此时它还会启动一个临时的 VNC 会话通常是:1你可以用vncserver -kill :1关掉它因为我们接下来要重写xstartup。4.3 第三步定制xstartup并修复权限进入~/.vnc目录备份原始文件cd ~/.vnc mv xstartup xstartup.bak nano xstartup将前面【3.2】节中的修正版内容粘贴进去保存退出。然后执行# 赋予执行权限这是生死线 chmod x xstartup # 修复 ~/.vnc 目录权限这是安全底线 chmod 700 ~/.vnc # 修复 passwd 文件权限防止被其他用户读取 chmod 600 passwd实操心得我曾在一个客户现场因为忘记chmod x xstartup折腾了 2 小时。日志里~/.vnc/*.log只显示xstartup: line 1: exec: startxfce4: not found我以为是startxfce4没装反复重装xfce4。后来用ls -l xstartup发现权限是 644加上x后5 秒内连接成功。记住VNC 配置中90% 的“找不到命令”错误根源都是脚本没执行权限。4.4 第四步创建 systemd 服务文件systemd 服务文件必须放在/etc/systemd/system/下且文件名格式为vncserver.service其中表示这是一个模板服务可以接受用户名作为参数。创建文件sudo nano /etc/systemd/system/vncserver.service填入以下内容注意USER需替换成你的实际用户名如ubuntu[Unit] DescriptionStart TightVNC server at startup Aftersyslog.target network.target [Service] Typeforking UserUSER PAMNamelogin WorkingDirectory/home/USER PIDFile/home/USER/.vnc/%H:%i.pid ExecStartPre/bin/sh -c /usr/bin/vncserver -kill %i /dev/null 21 || : ExecStart/usr/bin/vncserver %i -geometry 1920x1080 -depth 24 -localhost no -fg ExecStop/usr/bin/vncserver -kill %i Restarton-failure RestartSec5 [Install] WantedBymulti-user.target关键参数解释Typeforking因为vncserver启动后会 fork 出子进程并退出父进程systemd 必须知道这是“forking”类型否则会误判为服务启动失败。PIDFile...指定 PID 文件路径%H是主机名%i是实例名如:1这样多个用户可以共存。ExecStartPre...在启动前先杀掉可能存在的旧进程避免端口冲突。ExecStart...中的-localhost no是关键它允许 VNC 监听所有网络接口0.0.0.0而不是仅 localhost。如果不加VNC 只响应本地回环连接SSH 隧道外的 viewer 根本连不上。Restarton-failure仅在进程非 0 退出时重启避免无限循环。保存后重载 systemd 配置sudo systemctl daemon-reload4.5 第五步启用并启动服务现在以你的用户身份启用服务# 替换 USER 为你的用户名 sudo systemctl enable vncserver:1.service sudo systemctl start vncserver:1.service检查状态sudo systemctl status vncserver:1.service正常输出应包含active (running)和Started Start TightVNC server at startup。如果看到failed用sudo journalctl -u vncserver:1.service -n 50 -f实时查看日志90% 的问题都能在这里定位。4.6 第六步SSH 隧道配置与 VNC Viewer 连接VNC 协议本身不加密直接暴露 5901 端口是重大安全风险。正确做法是用 SSH 隧道封装。在你的本地 Windows/macOS 机器上用 SSH 工具如 PuTTY、Terminal执行# macOS/Linux ssh -L 5901:127.0.0.1:5901 -C -N -l USER SERVER_IP # Windows PuTTYConnection → SSH → Tunnels → Source port: 5901, Destination: 127.0.0.1:5901, Click Add-L 5901:127.0.0.1:5901表示把本地 5901 端口的流量通过 SSH 隧道转发到服务器的 127.0.0.1:5901。这样VNC viewer 连接localhost:5901实际走的是加密 SSH 通道。然后在 VNC Viewer推荐 RealVNC Viewer 或 TigerVNC Viewer中输入localhost:5901输入之前设置的密码即可看到 Xfce 桌面。常见误区有人把Destination设成SERVER_IP:5901这是错的。SSH 隧道的Destination必须是服务器内部的地址而 VNC server 监听的是127.0.0.1:5901由-localhost no允许外部访问但监听地址仍是 127.0.0.1所以Destination必须是127.0.0.1:5901。5. 常见问题与排查技巧实录来自 127 个真实部署现场的故障速查表5.1 连接被拒绝端口、防火墙与监听地址的三重校验现象VNC Viewer 显示Connection refused或Unable to connect to host。排查流程按顺序执行确认 VNC 服务是否在运行sudo systemctl status vncserver:1.service # 必须是 active (running)确认 VNC 进程是否在监听 5901 端口sudo ss -tuln | grep :5901 # 正常输出tcp LISTEN 0 128 *:5901 *:* users:((Xtigervnc,pid1234,fd3)) # 如果输出为空说明 VNC 没启动或启动失败确认防火墙是否放行 Ubuntu 20.04 默认用ufw执行sudo ufw status verbose # 查看是否有 allow 5901/tcp 规则 # 如果没有且你确定要用公网直连不推荐执行 # sudo ufw allow 5901 # 但更安全的做法是只允许 SSH 端口22所有 VNC 流量走 SSH 隧道终极验证在服务器本地测试# 在服务器上安装 vncviewer临时 sudo apt install tigervnc-viewer # 连接本地 5901 vncviewer 127.0.0.1:5901 # 如果本地能连证明 VNC 服务正常问题出在网络或客户端5.2 黑屏或灰色桌面X11 会话与窗口管理器的启动链断裂现象VNC Viewer 连接成功但桌面是纯黑或灰色鼠标能动但没有面板、没有图标。根因分析xstartup脚本中exec startxfce4没执行或startxfce4启动失败。常见原因有~/.vnc/xstartup权限不是 700 或 755必须可执行startxfce4命令路径错误用which startxfce4确认~/.vnc目录权限不是 700X server 拒绝启动快速修复# 1. 检查 xstartup 权限 ls -l ~/.vnc/xstartup # 应为 -rwxr-xr-x 或 -rwx------ # 2. 手动执行 xstartup看报错 cd ~/.vnc ./xstartup # 3. 检查 ~/.vnc/*.log 最后 20 行 tail -20 ~/.vnc/*.log # 如果看到 Failed to execute child process说明 startxfce4 找不到 # 如果看到 Cannot open display说明 DISPLAY 环境变量没设5.3 复制粘贴失效X11 剪贴板的双缓存机制现象在 VNC 里复制文字粘贴不到宿主机反之亦然。原理X11 有两个剪贴板PRIMARY鼠标选中即复制和CLIPBOARDCtrlC/CtrlV。VNC server 默认只同步PRIMARY而现代应用Chrome、VS Code用CLIPBOARD。解决方案安装xfce4-clipman-plugin并启用# 安装插件 sudo apt install xfce4-clipman-plugin # 启用插件需在 VNC 桌面里操作 # 右键任务栏 → Panel → Add New Items → Clipboard → Add # 然后右键 Clipboard 图标 → Preferences → 勾选 Synchronize PRIMARY and CLIPBOARD实操心得这个插件必须在 VNC 桌面里右键启用不能用命令行。因为它的配置写在~/.config/xfce4/panel/clipboard-*.rc里是 GUI 配置。我曾用xfconf-query命令强行修改结果插件图标不显示只能删掉整个~/.config/xfce4/panel/重来。5.4 音频缺失“ubuntu没声音20.04”的 VNC 关联解法现象VNC 桌面里播放视频没声音pavucontrol显示 “Dummy Output”。真相Ubuntu 20.04 的 PulseAudio 默认不允许多用户共享音频设备。VNC 会话是独立用户会话它无法访问宿主机的 PulseAudio socket。安全解法不推荐直接暴露 PulseAudio# 1. 在 VNC 会话里创建 PulseAudio 配置 mkdir -p ~/.config/pulse echo autospawn no ~/.config/pulse/client.conf # 2. 启动 PulseAudio 时指定 TCP 端口仅限内网 pulseaudio --start --log-targetsyslog --exit-idle-time-1 --disable-shmtrue --tcp-port4713 # 3. 在宿主机上用 pavucontrol 选择 Network Sound Device但更务实的方案是接受 VNC 无音频的事实用 SSH mplayer 播放音频。例如# 在 VNC 里打开终端执行 mplayer -ao pulse your_audio.mp3mplayer会直接调用宿主机的 PulseAudio无需网络穿透。这是工程师思维不强求一个工具解决所有问题而是用最短路径达成目标。5.5 多用户并发为不同用户配置独立 VNC 实例需求服务器上有user1和user2都想用自己的 VNC 桌面。实现方法利用 systemd 的模板服务机制为每个用户创建独立实例# 为 user1 启用 :1 端口 sudo systemctl enable vncserver:1.service sudo systemctl start vncserver:1.service # 为 user2 启用 :2 端口注意端口号不同 sudo systemctl enable vncserver:2.service sudo systemctl start vncserver:2.service对应地user2的~/.vnc/xstartup文件里ExecStart行要改为exec startxfce4不用改端口端口由:2指定。连接时user1用localhost:5901user2用localhost:5902。systemd 会自动为每个实例生成独立的 PID 文件和日志互不干扰。注意每个实例占用一个端口5901、5902…端口数不能超过 65535但实际建议不超过 10 个避免资源耗尽。6. 进阶技巧与生产环境加固让 VNC 从能用走向稳用6.1 自动化部署脚本3 分钟完成 10 台服务器配置手工配置 10 台服务器太慢我写了一个幂等性脚本存为setup-vnc.sh#!/bin/bash # Usage: bash setup-vnc.sh USERNAME USERNAME$1 if [ -z $USERNAME ]; then echo Usage: bash setup-vnc.sh username exit 1 fi # 1. 安装依赖 sudo add-apt-repository universe -y sudo apt update sudo apt install tightvncserver xfce4 xfce4-goodies xfonts-base dmz-cursor-theme -y # 2. 创建用户 VNC 目录 sudo -u $USERNAME mkdir -p /home/$USERNAME/.vnc sudo -u $USERNAME chmod 700 /home/$USERNAME/.vnc # 3. 写入 xstartup cat EOF | sudo -u $USERNAME tee /home/$USERNAME/.vnc/xstartup #!/bin/bash export DISPLAY:1 export GTK_IM_MODULEfcitx5 export QT_IM_MODULEfcitx5 export XMODIFIERSimfcitx5 exec start