国产化环境配置 VNC 远程桌面:麒麟 V10 实战

这几年搞运维的,没被「国产化」这三个字推着走两步的,应该不多了。

银行、政务、国企,信创替代一轮接一轮。原来在 Windows 上点鼠标就能干完的活,到了银河麒麟、统信 UOS 上,很多人第一反应是:命令行我能应付,可有些活它就是得看图。配个带界面的数据库工具、起个浏览器、或者干脆把桌面甩给同事远程协作,都得有图形界面。

这时候就得给 Linux 服务器开一个远程图形桌面。方案不少,但最稳、最通用的,还是 VNC。

一、先把 VNC 是什么说清楚

一句话:VNC 是一套「远程图形桌面」协议。服务器上装 VNC Server,负责捕获本机桌面画面、接收你的鼠标键盘,通过 5900 这一串端口对外提供访问;你自己的电脑上装个 VNC Viewer(客户端)连进去,就能像坐在这台机器前一样操作它的图形界面。

它是典型的 C/S 架构,分两头:

•VNC Server(服务端):装在你要远程的那台 Linux 机器上。

•VNC Viewer(客户端):装在你自己的 Windows、Mac 或者手机上。

现在主流的服务端是 TigerVNC。CentOS、Ubuntu、银河麒麟这些发行版默认推荐的都是它,性能、兼容性、安全性都均衡,还支持多用户独立桌面。另外还有 TightVNC(轻量、省带宽,适合差网络)、vino / GNOME 内置(只能共享当前已登录的本地桌面,没法给多个用户开独立虚拟桌面,服务器场景基本用不上)。

这里有个关键区别得记牢,后面排错会用到:

•虚拟桌面模式(TigerVNC 服务端):在后台起一个独立的虚拟 X 桌面,服务器本地显示器上什么都看不到,无头服务器(没接显示器的那种)也能用。

•屏幕共享模式(vino / GNOME 自带):共享服务器本机正在显示的那个桌面。

端口规则很简单:基础端口 5900,第 N 个用户桌面占用 5900+N。桌面号 :1 对应 5901,:2 对应 5902,以此类推。防火墙放行端口的时候心里要有数。

安全上先泼盆冷水:原生 VNC 传输默认不加密。公网环境千万别裸奔,要么套一层 SSH 隧道,要么用 TigerVNC 的 TLS 加密。内网图省事可以先放着,但得明白这是个短板。

二、动手:银河麒麟 V10 上开 VNC

下面以 root 用户为主线走一遍。Kylin V10 的软件源里已经带 tigervnc,直接装就行。

> 前提:系统已安装图形桌面环境(UKUI / MATE / GNOME 等)。最小化安装的命令行系统,后面 vncserver 会因为拉不起桌面会话而失败。

先确认下系统版本,别稀里糊涂在错的环境上操作:

nkvers

检查有没有装过:

rpm -q tigervnc tigervnc-server

没装就装,yum 和 dnf 在麒麟上是一回事,用哪个都行:

yum install tigervnc tigervnc-server -y

装完会发现,systemd 下没有一个直接能用的服务,得先把示例配置复制出来。注意源路径,有的版本在 /lib,有的在 /usr/lib,看具体发行版:

cp /lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver@:1.service

文件名里的 :1 就是「桌面号」,对应端口 5901。以后要再开一个用户桌面,复制成 :2 即可。

把配置里的用户改成 root。编辑刚复制出来的文件:

vim /etc/systemd/system/vncserver@:1.service

找到带 的地方,把 /home/ 改成 /root, 改成 root。改完大概长这样:

Unit

Description=Remote desktop service (VNC)

After=syslog.target network.target

Service

Type=forking

WorkingDirectory=/root

User=root

Group=root

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i >/dev/null 2>&1 || :'

ExecStart=/usr/bin/vncserver -autokill %i

ExecStop=/usr/bin/vncserver -kill %i

PIDFile=/root/.vnc/%H%i.pid

Install

WantedBy=multi-user.target

每次新增或修改了 service 文件,都得让 systemd 重新加载配置,这步漏了服务起不来:

systemctl daemon-reload

设个 VNC 连接密码(这是连桌面时用的,跟系统登录密码不是一回事):

vncpasswd

然后放行端口、关掉拦路虎。防火墙和 SELinux 是新手最容易栽的两个地方。

防火墙,二选一:

偷懒做法:直接关

systemctl stop firewalld

systemctl disable firewalld

规范做法:只开放需要的端口

firewall-cmd --add-port=5901/tcp --permanent

firewall-cmd --reload

SELinux 在麒麟上经常是 enforcing。先看看:

getenforce

如果是 Enforcing,临时关掉立刻生效:

setenforce 0

要永久关,改 /etc/selinux/config 把 SELINUX 改成 disabled,重启后生效。生产环境建议用永久方式,别靠临时关撑着。

都搞定,启动:

systemctl start vncserver@:1.service

systemctl enable vncserver@:1.service # 开机自启

systemctl status vncserver@:1.service # 看一眼状态

端口起来了就能去客户端连了。如果你只是想临时起一个会话、不想折腾 service,直接敲 vncserver 也行,它会自动挑下一个空闲的桌面号(比如 :2)。但正经持久用,还是上面的 systemd 服务靠谱。

三、多用户:给同事也开一个独立桌面

服务器不是你一个人的。想给某个普通用户单独开桌面,思路一样,只是换用户名。

先建个用户:

useradd smbuser

把示例配置复制成「用户名专属」的服务文件:

cp /usr/lib/systemd/system/vncserver@.service /etc/systemd/system/vncserver-smbuser@.service

编辑这个文件,把 User、Group、WorkingDirectory、PIDFile 里的占位换成 smbuser 的真实路径:

Service

Type=forking

WorkingDirectory=/home/smbuser

User=smbuser

Group=smbuser

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

ExecStartPre=/bin/sh -c '/usr/bin/vncserver -kill %i >/dev/null 2>&1|| :'

ExecStart=/usr/bin/vncserver -autokill %i

ExecStop=/usr/bin/vncserver -kill %i

Restart=on-success

RestartSec=15

Install

WantedBy=multi-user.target

加载配置:

systemctl daemon-reload

密码得用这个用户自己设。切过去再设,别用 root 设,否则文件属主不对会连不上:

su - smbuser

vncpasswd

启动、设自启:

systemctl start vncserver-smbuser@:1.service

systemctl enable vncserver-smbuser@:1.service

每个用户桌面独立端口、独立密码,互不影响。这就实现了「一台服务器,多人同时远程图形操作」。

四、排错:那些文档不会告诉你的坑

前面顺的时候谁都会,真出问题才知道差别。下面几个是我和身边人实打实踩过的。

1. 连上了,输密码却说不对

这个在麒麟上特别容易遇到,尤其是 UKUI 桌面环境。根因往往是 /etc/security 目录权限被改坏了,PAM 认证过不去。

按这个顺序修:

chmod 755 /etc/security

chmod -R go-w /etc/security/

chmod 644 /etc/security/*.conf

chmod 600 /etc/security/opasswd

要是还不行,多半是 UKUI 锁屏程序和 VNC 认证打架了。先把异常锁屏进程干掉,再关掉锁屏:

pkill -f ukui-screensaver

gsettings set org.ukui.screensaver lock-enabled false

不需要锁屏的服务器,关了反而省心。

2. 端口看着起来了,客户端死活连不上

先别怀疑 VNC,多半是网络层面的事:

•防火墙是不是真放行了对应端口(5901 这种),用 firewall-cmd --list-ports 看一眼;

•如果走的是虚拟机或云,安全组、端口转发有没有开;

•SELinux 是不是又偷偷回到 Enforcing 了。

3. 启动报错「Job for vncserver failed」

十有八九是 service 文件里用户名、路径写错,或者 daemon-reload 没执行。回去检查 /etc/systemd/system 下那几个文件,改完一定记得 systemctl daemon-reload。

4. 连上了但灰屏/空白

说明 VNC 会话起来了,但 xstartup 没拉起桌面环境。编辑对应用户的 ~/.vnc/xstartup,确保它启动你的桌面会话:

vim ~/.vnc/xstartup

比如 UKUI:

exec ukui-session &

MATE:

exec mate-session &

改完杀掉当前 VNC 进程,重新启动:

vncserver -kill :1

vncserver :1

五、客户端怎么连

Windows 上装个 VNC Viewer 就行,RealVNC 官方的、TightVNC 的都行。打开之后,地址栏填:

•默认 5900(桌面号 :0)就直接写 IP;

•桌面号 :1 就写 IP:5901,或者 IP:1(不同客户端写法略有差异,认准端口号最稳)。

输密码,进桌面。


写到这儿,一套从安装、多用户到排错的 VNC 方案就齐了。麒麟、统信底层都是 Linux,套路一模一样,区别只在软件源路径、SELinux 这类细节。把它配稳了,国产化的图形桌面需求基本不用再发愁。

要是你那边还有别的发行版,或者遇到更刁钻的报错,评论区甩过来,咱们一起填坑。

相关推荐
xiaoye-duck1 小时前
《Linux系统编程》Linux 系统多线程(八): C++ 高并发线程池全链路深度解析与从零手撕实现
linux·c++·线程池
爱码少年2 小时前
一条Shell命令实现文件目录服务器间快速转移
服务器·shell
giaming0232 小时前
告别Docker Desktop!一款轻量级原生开发环境管理工具:FlyEnv
运维·docker·容器
laboratory agent开发2 小时前
智能体多工具串联执行中途失败,部分写入的数据如何回滚
运维·服务器·数据库
智塑未来2 小时前
金融 AIOps 选型指南:银行证券智能运维平台怎么选
运维·人工智能·金融
寒水馨2 小时前
Linux下载、安装protobuf-v35.1(附安装包protoc-35.1-linux-x86_64.zip)
linux·运维·服务器·google·序列化·protobuf·protoc
王琦03183 小时前
Linux的文件管理
linux·运维·服务器
xlq223223 小时前
高并发服务器day13
运维·服务器
Android系统攻城狮3 小时前
Linux PipeWire深度解析之pw_stream_new调用流程与实战(四十二)
linux·运维·服务器·音频进阶·pipewire音频进阶