这几年搞运维的,没被「国产化」这三个字推着走两步的,应该不多了。
银行、政务、国企,信创替代一轮接一轮。原来在 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 这类细节。把它配稳了,国产化的图形桌面需求基本不用再发愁。
要是你那边还有别的发行版,或者遇到更刁钻的报错,评论区甩过来,咱们一起填坑。