拓十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Windows通过RDP远程连接银河麒麟V10桌面配置与排障指南

Windows通过RDP远程连接银河麒麟V10桌面配置与排障指南

一台银河麒麟V10桌面版机器摆在机房里,键盘鼠标都在它跟前,人在另一层楼的Windows笔记本前,想把桌面"搬"过来用。这个需求在国产化替代推进得比较快的单位里非常普遍——服务器侧早就用命令行管熟了,偏偏桌面版这一块,因为要跑WPS、浏览器、即时通讯工具、业务客户端,很多时候必须看到图形界面才能操作。我前后在三四个不同SP版本的麒麟V10桌面上折腾过RDP,踩过的坑从黑屏、认证弹窗刷屏,到剪贴板不通、输入法打不出中文,基本集齐了。这篇就把"Windows远程桌面连麒麟V10桌面"这件事,从方案取舍一直讲到长期运维,中间所有配置都给你可以直接抄的完整内容。

1. 该不该用RDP把麒麟桌面搬到Windows上

很多人一上手就搜"麒麟V10 远程桌面",看到教程第一条是装xrdp,复制粘贴跑完,结果连上去一片黑,然后就开始怀疑人生。问题不在xrdp本身,而在于没先想清楚自己要的到底是哪一种远程——是把当前这块屏幕上显示的东西镜像出去,还是在服务器内部另开一个独立的图形会话。这两种诉求对应的技术路线完全不同,选错了,后面怎么调都别扭。

1.1 先把需求拆成两个问题

第一个问题:远程连上去的时候,麒麟这台机器的本地屏幕还有没有人在用?如果这是一台放在机房、平时没人碰的机器,那你要的是独立会话,RDP是最合适的选择。第二个问题:远程操作需不需要看到本地已经打开的程序窗口?比如本地已经登录了即时通讯工具、挂着一个长时间跑的业务客户端,你想在Windows上接着操作这些窗口——这种叫屏幕共享,RDP天生做不到,得走VNC那一路。

我用一个很直白的类比来区分:xrdp的做法相当于给你在机器内部新开了一间办公室,你进去从零开始打开软件;VNC的做法相当于在原有办公室装了个摄像头加机械臂,你远程操作的是同一张桌子。前者互不干扰、各用各的,后者所见即所得但会跟本地操作抢鼠标键盘。

大部分单位里的场景其实是前者:这台麒麟机器就是一台被远程管辖的办公终端,本地无人使用,那么xrdp是性价比最高的方案。

1.2 xrdp、VNC、麒麟自带远程协助的横向对比

我把这三种路线在麒麟V10桌面上的实际表现整理成一张表,都是我在真实环境里测出来的体感,不是从文档上抄的。

对比项xrdp(RDP协议)VNC(TigerVNC/x11vnc)麒麟自带远程协助类工具
会话模式独立新会话,可多用户并发默认共享:0屏幕,也有独立模式共享当前屏幕,需本地确认
Windows端系统自带mstsc,零安装需装VNC Viewer需要对应客户端或浏览器
传输效率高,有增量刷新和压缩一般,带宽占用偏大视实现而定,通常一般
剪贴板互通支持,需配置支持,文字基本无碍支持
文件传输支持磁盘重定向靠剪贴板或额外工具视工具而定
3D/视频播放弱,无硬件加速弱弱
断线保持可配置保持会话依赖服务端策略通常断开即结束
部署难度中,配置文件要改对中,需要处理桌面冲突低,图形界面点几下

从表里能看出来,只要你的场景允许"另开会话",xrdp在传输效率和Windows端零安装这两点上优势非常明显。Windows自带远程桌面客户端,分辨率自适应、多显示器、剪贴板、磁盘映射都是原生能力,不用额外装任何软件,这在受管控的办公终端上是个很大的加分项。

VNC的优势在于"看到的就是本地那块屏"。我遇到过一种典型情况:麒麟机器上跑着一个只能在本地图形界面里点确认的业务程序,本地必须有人先登录,这种情况就只能用VNC共享屏幕。还有一种是麒麟V10桌面自带的远程协助功能,适合临时帮同事看个问题,点一下同意就行,但它通常需要本地有人配合点确认,做无人值守不合适。

1.3 xrdp到底做了什么:一个协议翻译器

把xrdp理解成一个翻译官最准确。Windows这头说的是RDP协议,麒麟那边能听懂的是X11图形会话,两边语言不通,xrdp夹在中间做同声传译。它内部其实分成两个进程:xrdp负责监听3389端口、处理RDP协议握手和图形编码,xrdp-sesman是会话管理器,负责在你登录成功后,在服务器上真正把图形会话拉起来。

真正把图形会话拉起来的过程是这样的:sesman收到登录请求,去调用你配置好的启动脚本(就是那个关键的startwm.sh),脚本里再去启动Xorg服务和一个桌面会话进程,桌面进程按你自己的配置去读UKUI之类的会话定义,最终呈现出你看到的麒麟桌面。图形数据再由xrdp编码成RDP协议丢回Windows。

这个链路里任何一环断掉都会表现为"黑屏"或者"秒退",这也是为什么排查的时候必须先看日志、定位到底断在哪一环,而不是瞎改配置。搞明白这条链路,后面所有的坑都会变得非常好理解。

还有一点必须提前说清楚:xrdp开出来的会话,和你本地tty上那个图形会话,是两个完全独立的X显示。也就是说本地已经登录了UKUI,xrdp还是能再开一个自己的会话——听起来很美好,但UKUI这类桌面环境在配置存储、DBus、输入法这些地方会互相打架,这就是后面要专门处理的一个大坑。

2. 动手前的环境盘点:别急着装包

我见过太多人上来就sudo apt install xrdp,装完发现源里根本没有这个包,或者装的是个老版本,然后就开始在网上乱找deb包。动手前花五分钟做环境盘点,能省掉后面两个小时。

2.1 三条命令摸清底细

第一件事是确认你手上这台到底是什么底子。麒麟V10桌面版和服务器版虽然名字相近,包管理器和桌面环境差别不小,网上的教程往往混着写。

# 看系统版本和SP补丁号 cat /etc/.kyinfo nkvers # 看桌面会话定义,找出真正的启动命令 ls /usr/share/xsessions/ cat /usr/share/xsessions/*.desktop # 看包管理器和软件源 which apt yum dnf cat /etc/apt/sources.list 2>/dev/null | head -20

/etc/.kyinfo这个文件是麒麟特有的,里面能看到dist_id和milestone,比uname -a信息全得多。nkvers也是麒麟自带的版本查询命令,输出比通用命令更贴合这个发行版。

/usr/share/xsessions/这个目录特别关键。里面的.desktop文件描述了系统里装了哪几种桌面会话,每个文件里的Exec=那一行,就是启动这个会话的真正命令。这一行后面要原封不动地抄进xrdp的启动脚本里,抄错了就是黑屏。麒麟V10桌面版这里通常能看到ukui.desktop,Exec的值可能是ukui-session或者/usr/bin/startukui,不同SP版本不完全一样,必须以你自己机器上的实际内容为准。

软件源这块要注意,麒麟V10桌面的镜像源分内网源和公网源,很多单位的内网环境只挂了自己的源,如果源里没有xrdp,apt install会直接报"无法定位软件包"。

2.2 内网离线环境怎么把包装进去

内网机器不联外网是常态,这种时候有三个办法,按推荐程度排:

第一个是先用apt list xrdp*和apt-cache search xrdp搜一下本机源里到底有没有。不少单位的麒麟源里其实是有xrdp的,只是版本可能偏老(0.9.x那一档),够用,先装上跑通再说。

第二个是找一台能连外网的同版本麒麟机器,用apt-get download把包和依赖一次性下齐,再拷进内网。注意这里一定要在相同版本、相同架构的机器上下载,麒麟V10有x86_64、aarch64、loongarch等好几种架构,混了就装不上。下载依赖可以用:

apt-get install --download-only xrdp xorgxrdp # 包会落在 /var/cache/apt/archives/

第三个是用麒麟自带的软件商店图形界面搜一搜,有些SP版本商店里收录了远程桌面相关组件,点一下就能装,比命令行省事。装完之后用dpkg -l | grep xrdp确认一下版本,心里有个数。

提示:xrdp和xorgxrdp是两个包,前者是协议处理,后者是Xorg的服务端驱动。只装前者在新版本上可能起不来,一定要一起装。另外建议顺手把dbus-x11装上,后面会话里很多认证问题都跟DBus有关。

2.3 账户、权限和别把自己锁在门外

改远程配置之前,先保证自己有一条退路。我吃过一次亏:改startwm.sh改错了语法,xrdp连不上,同时因为顺手把防火墙规则也调了,SSH都进不去,最后只能跑到机器跟前去救。

留退路的做法很简单:改配置前先备份原文件,改完确认SSH还能正常登录,再重启xrdp服务。SSH是生命线,任何时候都不要先动SSH的配置或防火墙对22端口的放行策略。

账户方面有两个硬性前提。一是远程登录用的账号必须有登录图形界面的权限,正常创建的普通用户都有,但如果被刻意限制过要检查一下。二是这个账号的密码不能为空,也不能是锁定状态,用passwd -S 用户名看一眼状态字段。麒麟V10对密码复杂度有要求,如果提示密码太简单,可以用sudo passwd 用户名重设一个符合策略的。

关于root密码和单用户模式,这里也顺带提一句。很多教程会让你直接改root密码来做配置,我不建议这么做,日常配置用有sudo权限的普通账号就够了。但如果真的因为误操作进不去图形界面了,单用户模式是最后的救命稻草,进GRUB的时候在启动项上按e编辑内核参数,在linux那一行末尾追加init=/bin/bash,或者直接single,进到shell之后mount -o remount,rw /把根分区改成可写,再改文件。这套流程一定要提前演练一遍,不要等出事了才现学。

3. 安装与配置:让远程会话真正落到UKUI

包装完之后,默认配置是不太可能直接给你一个完美的麒麟桌面的。默认的启动脚本会去找一些通用会话定义,找到了可能是个极简的窗口管理器,找不到就直接黑屏。这一节的内容是整个方案的核心,也是最容易反复踩坑的地方。

3.1 安装与首次启动

安装没什么好说的,两条命令的事:

sudo apt update sudo apt install -y xrdp xorgxrdp dbus-x11

装完之后服务一般会自动起来,确认一下状态和监听端口:

systemctl status xrdp systemctl status xrdp-sesman ss -tlnp | grep 3389

如果服务没起来,systemctl status的输出里通常会直接告诉你原因,最常见的是端口被占用。3389这个端口很有辨识度,如果这台麒麟机器上之前装过别的远程工具,或者跑着Windows虚拟机做过端口映射,就可能冲突。这时候要么把冲突进程停掉,要么把xrdp的端口改掉,改法在3.3节讲。

第一次连接建议先在Windows上用mstsc连一下,即使黑屏也要连,因为只有连接过,/var/log/xrdp.log和/var/log/xrdp-sesman.log里才会留下完整的过程记录,后面排查全靠它。

3.2 startwm.sh:整个方案里最关键的一个文件

先备份,再动手:

sudo cp /etc/xrdp/startwm.sh /etc/xrdp/startwm.sh.bak sudo vi /etc/xrdp/startwm.sh

把文件内容改成下面这样(把会话启动命令换成你在2.1节里查到的那个Exec=值):

#!/bin/sh # xrdp X session 启动脚本 if test -r /etc/profile; then . /etc/profile fi # 清理掉可能与本机会话冲突的运行时会话变量 unset DBUS_SESSION_BUS_ADDRESS unset XDG_RUNTIME_DIR unset XDG_SESSION_TYPE # 显式声明这是X11会话 export XDG_SESSION_TYPE=x11 export XDG_CURRENT_DESKTOP=UKUI # 输入法环境变量,不写这几行远程会话打不出中文 export GTK_IM_MODULE=fcitx export QT_IM_MODULE=fcitx export XMODIFIERS=@im=fcitx # 通过dbus-launch拉起会话,避免认证组件的异常 exec dbus-launch --exit-with-session /usr/bin/ukui-session

这里有几个细节值得解释清楚,因为它们决定了后面会不会黑屏。

unset DBUS_SESSION_BUS_ADDRESS和unset XDG_RUNTIME_DIR这两行,是解决"本地会话和远程会话互相打架"的关键。麒麟V10用systemd的用户会话管理,本地登录时会设置一个XDG_RUNTIME_DIR指向/run/user/1000,那里放着一堆socket。远程会话如果继承了这个路径,就会去连本地会话的DBus,结果就是各种认证错误和组件异常。清掉之后让xrdp会话自己重新建立一套就正常了。

exec dbus-launch这一层包裹也很重要。UKUI的很多组件需要会话总线才能正常工作,如果脚本只是简单地把桌面进程拉起来,没有总线,桌面可能会卡在启动阶段。

如果你试了之后桌面还是起不来,一个非常实用的兜底方案是装个轻量桌面专门给远程用。这不是妥协,很多单位就是这么干的,因为远程会话本身没有显卡加速,跑重量级桌面体验并不好:

sudo apt install -y xfce4 xfce4-goodies # 然后把startwm.sh最后一行的ukui-session换成 startxfce4

这套组合在远程场景下反而更流畅,剪贴板、输入法、文件管理器的兼容性都更省心。我现在的做法是:本地用UKUI,远程专门用一套轻量会话,两边各司其职,互不干扰。这个取舍值得你认真考虑一下,不要执着于"远程也必须看到一模一样的桌面"。

改完之后chmod +x /etc/xrdp/startwm.sh,再sudo systemctl restart xrdp xrdp-sesman。

3.3 端口、防火墙与开机自启

端口改不休改看情况。如果Windows这台机器和麒麟不是同一台(显然是),3389冲突的情况不多,保持默认最省事。但如果你的网络环境里有其他设备也在用3389,或者出于安全习惯不想用默认端口,就在/etc/xrdp/xrdp.ini的[Globals]段里改:

[Globals] port=3390 security_layer=negotiate crypt_level=high

改端口纯粹是减少被扫描的概率,属于"降低噪音"级别的措施,不能替代真正的安全策略。

防火墙这块,麒麟V10桌面版一般装的是ufw系或者麒麟安全中心自带的防火墙模块。命令行确认:

sudo ufw status verbose

如果防火墙是开启状态,放行对应端口:

sudo ufw allow 3389/tcp sudo ufw reload

如果用的是麒麟安全中心的图形界面,在"网络保护"或者"防火墙"那一栏里加一条自定义规则,协议选TCP,端口填3389,方向选入站。图形界面改的好处是策略持久化更可靠,重启不会丢。

开机自启别忘了:

sudo systemctl enable xrdp sudo systemctl enable xrdp-sesman

xrdp-sesman是独立的服务单元,只enable xrdp是不够的,这是很多人重启后连不上的原因。确认一下systemctl is-enabled xrdp xrdp-sesman两个都返回enabled。

3.4 给远程会话准备一个专用账号

这一条是我强烈建议的做法,能规避掉相当一部分玄学问题。为远程连接单独建一个账号:

sudo useradd -m -s /bin/bash remoteuser sudo passwd remoteuser sudo usermod -aG sudo remoteuser # 需要管理员权限才加

为什么这么做?因为UKUI这一类基于Qt和dconf的桌面,配置文件是跟着用户走的,存放在家目录的.config、.local下面。如果本地登录和远程登录用同一个账号,两份桌面会话同时读写同一批配置文件,轻则主题错乱、面板位置乱跳,重则锁文件冲突导致桌面起不来。分开账号之后,各写各的,物理隔离,问题就消失了。

顺带说一句磁盘路径的事。如果你这台麒麟机器做过数据盘分离(系统盘装系统、数据盘放用户数据),新建的用户家目录默认会落在系统盘上。想让远程账号的家目录也放到数据盘,建用户的时候用-d指定路径:

sudo mkdir -p /data/remoteuser sudo useradd -d /data/remoteuser -m -s /bin/bash remoteuser sudo chown -R remoteuser:remoteuser /data/remoteuser

这个细节容易被忽略,等到远程用户存了几个大文件把系统盘撑满,才发现问题,那时候处理起来就麻烦了。

4. 登进去之后的那些毛病:黑屏、认证弹窗、剪贴板、输入法

配置对了,第一次连上去基本能看到桌面了。但接下来等着你的还有一堆小毛病,这一节按"从登录到用起来"的顺序,把常见的几个问题挨个拆开讲。

4.1 黑屏与秒退:按日志顺序倒推

黑屏是最常见的,也是最容易一头雾水的。我的排查顺序是固定的:先看会话管理日志,再看xrdp主日志,最后看用户目录下的Xorg日志。

# 会话管理日志,看登录过程走到哪一步断了 sudo tail -100 /var/log/xrdp-sesman.log # 主服务日志,看协议握手和连接建立 sudo tail -100 /var/log/xrdp.log # 用户家目录下的Xorg日志,看图形会话本身有没有起来 ls -la ~/.xorgxrdp.*.log tail -100 ~/.xorgxrdp.*.log

xrdp-sesman.log里如果看到类似"session started"之后紧接着没有后续,说明会话进程拉起来了但立即退出,这种基本都是startwm.sh里指定的会话命令有问题——要么路径写错,要么命令根本不存在,用which ukui-session确认一下。

如果日志里出现Xorg启动失败、报模块缺失,那就是xorgxrdp没装好或者版本跟xrdp对不上,重装一下这两个包。

还有一种黑屏很迷惑:登录窗口能看到,输完密码就黑。这种情况十有八九是窗口管理器起来了但合成器(compositor)崩了。远程会话没有真正的GPU,硬开3D合成很容易失败。解决办法就是3.2节说的换轻量会话,或者在UKUI的配置里关掉桌面特效。

4.2 polkit认证弹窗刷屏与输密码也没用

这个问题的现象特别典型:连上去之后屏幕中间不断弹出"需要认证"的对话框,内容大意是要创建颜色管理设备、要刷新软件源之类的,你输入密码点确认,弹窗关掉一个又冒出来两个,整个桌面没法用。

根因是polkit策略。这些操作在本地登录时会被自动放行,因为本地是物理登录,polkit认为可信。而xrdp会话在polkit眼里属于远程会话,安全级别更低,于是逐条拦截。桌面组件在那儿反复重试,就形成了刷屏。

解决办法是加一条polkit规则,让指定用户组在这些无害操作上免认证。新建文件/etc/polkit-1/rules.d/49-remote-desktop.rules:

polkit.addRule(function(action, subject) { if (subject.isInGroup("sudo") && (action.id.indexOf("org.freedesktop.color-manager.") === 0 || action.id.indexOf("org.freedesktop.packagekit.") === 0 || action.id.indexOf("org.freedesktop.udisks2.") === 0)) { return polkit.Result.YES; } });

这几类操作分别是颜色管理、软件包管理和磁盘挂载。它们都是本地化的、不会影响系统安全的操作,放行风险可控。注意规则文件里用的是sudo组,如果你的远程账号不在这个组里,改成对应的组名。

改完之后不用重启系统,polkit会自动重载规则目录。再连一次,弹窗应该就消失了。

这里必须提醒一句:不要图省事写一条polkit.Result.YES全放行所有action的规则。那等于把系统的权限校验整个关掉,任何程序都能无密码做特权操作,安全上完全不可接受。规则一定要限定到具体的action前缀上。

4.3 剪贴板、磁盘映射、声音这三件事

这三样是"能不能用得舒服"的分水岭,其中剪贴板和磁盘是刚需,声音属于锦上添花。

剪贴板靠的是xrdp-chansrv这个通道服务。正常情况下它会随会话自动启动,你确认一下xrdp配置文件里没有把通道关掉:

[Globals] allow_channels=true

如果剪贴板只有单向能用,或者复制大段文本卡住,多半是通道服务挂了。用ps -ef | grep chansrv看一下有没有这个进程,没有的话检查~/.xrdp-chansrv.log。另外剪贴板的实现跟桌面环境的剪贴板管理器有交互,UKUI用的是自己的剪贴板管理组件,有时候会被它的历史记录功能干扰,可以临时关掉剪贴板历史功能试试。

Windows磁盘映射(把Windows的C盘D盘挂到麒麟上)靠的是RDP的驱动器重定向通道,挂载点默认在用户家目录下的thinclient_drives目录里:

ls -la ~/thinclient_drives/

这个目录为空或者不存在的常见原因是FUSE没装或者用户没权限。装一下fuse3,确认当前用户在fuse组里。还有一个坑:这个映射默认只对当前会话有效,会话重连后目录名会变,写脚本的时候不要写死路径。

声音这块我要说实话,它是三个里面最不靠谱的。理论上装了对应的模块之后,可以把远程会话的音频转发到Windows端播放,但麒麟V10不同SP版本的音频栈不完全一样(有pulseaudio的也有pipewire的),模块包不一定对得上。我的建议是:如果不是必须,放弃声音重定向,能省掉一堆折腾。真需要的话,先在终端里确认用的是哪套音频服务,再去找对应版本的模块包。

4.4 远程会话里打不出中文

输入法问题看着小,实际最影响效率。现象是:麒麟桌面上输入法图标正常显示,能切换,但打字出来全是英文,或者候选词框跑到屏幕角落。

根因是环境变量。输入法框架要靠GTK_IM_MODULE、QT_IM_MODULE、XMODIFIERS这三个变量告诉应用程序去哪儿找输入法。本地登录时这些变量由系统会话脚本设置好了,远程会话里如果启动脚本没带上,应用程序就不知道有输入法这回事。

这就是为什么3.2节的startwm.sh里要显式写那三行。如果已经写了还是不行,检查两处:

# 在远程会话的终端里验证变量是否生效 echo $GTK_IM_MODULE echo $QT_IM_MODULE echo $XMODIFIERS # 确认输入法进程有没有起来 ps -ef | grep fcitx

变量对、进程没起来,说明输入法没有被自动启动。在startwm.sh里exec那一行的前面加上启动命令:

fcitx -d & sleep 1

候选词框位置错乱是另一个问题,通常是Xinerama或者多屏信息在远程会话里不准确导致的,如果用的是单屏还出现这问题,换轻量会话基本能解决。

5. Windows这一侧:连接参数与那几条眼熟的报错

远程方案是两端的配合,麒麟那头配好了,Windows这头也有讲究。这一节讲客户端参数和几个高频报错。

5.1 mstsc的实用参数与.rdp文件

日常连接直接Win+R输入mstsc回车,填IP就行。但有几个参数值得掌握,尤其是画质和分辨率相关的:

mstsc /v:192.168.1.100:3389 /f # 全屏连接 mstsc /v:192.168.1.100 /multimon # 多显示器拓展 mstsc /v:192.168.1.100 /w:1920 /h:1080 # 指定窗口分辨率

如果你要频繁连同一台机器,建议在mstsc里配好一次,然后"另存为"一个.rdp文件放在桌面,双击直连。这个文件本质是个文本,可以直接编辑,几个值得关注的项:

full address:s:192.168.1.100:3389 screen mode id:i:1 desktopwidth:i:1920 desktopheight:i:1080 session bpp:i:24 compression:i:1 audiomode:i:2 redirectclipboard:i:1 drivestoredirect:s:*

audiomode:i:2表示不在本地播放声音(需要在远程播放就改成0),redirectclipboard:i:1开剪贴板,drivestoredirect:s:*把所有本地盘都映射过去。这几项在图形界面里也能设,但直接编辑文件更快更清晰。

分辨率的经验:不要盲目追求高分辨率。1920x1080在普通千兆内网下是流畅的,但如果网络质量一般,或者你连的是跨机房的链路,降到1600x900甚至1366x768,体验提升非常明显。远程桌面是实时编码传输,分辨率越高,每帧要压的数据量越大。色深也一样,session bpp用24够了,32位色在远程场景下看不出差别,但带宽和CPU开销都要上去一截。

5.2 0x204、凭据反复弹窗、ActiveX控件加载失败

Windows端报错看着吓人,实际上大部分能按图索骥。

0x204这个错误码,我的经验是绝大多数情况下跟麒麟端没关系,而是会话冲突。典型场景是:你之前连过一次,直接关了窗口没注销会话,麒麟那边会话还挂着;再连的时候,客户端和服务端的会话状态对不上,就报这个。解决办法是先看麒麟端的会话列表:

sudo /usr/sbin/xrdp-sesadmin -u remoteuser # 或者直接看进程 ps -ef | grep -i xrdp

把残留的会话进程清掉,再重新连。长期方案是在sesman.ini里配置断线保持策略,这个下一节讲。

凭据反复弹窗,输对了密码还是弹,这是典型的xrdp会话建立后立即失败又重试的表现。回到4.1节看日志。也有一种情况是Windows端保存了旧密码,凭据管理器里存着过期信息,去"控制面板 - 凭据管理器 - Windows凭据"里把对应的条目删掉再连。

"无法加载远程桌面服务ActiveX控件,请确保rdclientax.dll在路径中"这个报错是Windows本机的问题,跟麒麟完全无关。原因是远程桌面客户端的控件注册信息损坏或者被杀毒软件清理掉了。修复方法是注册系统目录下的对应dll:

# 以管理员身份运行命令提示符 regsvr32 /s %SystemRoot%\System32\mstscax.dll

如果注册报错,说明文件本身损坏了,用系统文件检查器修复:

sfc /scannow

顺便说,这类控件相关的问题在精简版系统、被第三方优化工具清理过的系统上更容易出现。办公终端的系统最好不要做过度优化,省下来的那点资源还不够折腾的。

5.3 "授权模式尚未配置,11天后停止工作"到底在说什么

这条提示我特意拎出来讲,因为很多人看到"11天后停止工作"会吓一跳,以为自己的远程方案要到期了。

这条提示来自Windows Server的远程桌面服务授权机制,是Windows那边在说"我这边的RDS授权还没配,宽限期还剩11天"。它的触发条件是:你连接的目标是Windows Server系统本身,而不是通过客户端连到别处。也就是说,如果你在Windows上准备连麒麟,压根不会看到这条提示;如果你看到了,说明你在某个环节连错了目标,比如误连到了本地的另一台Windows Server,或者看的日志是别的机器的。

搞清楚这一点很重要,能避免你在错误的方向上排查半天。麒麟端的xrdp是完全开源免费的,没有任何授权这个概念,不存在到期一说。

5.4 把3389收进SSH隧道里

如果你对安全性要求高,一个简单有效的做法是把RDP端口关在防火墙后面,只通过SSH隧道访问。前提是麒麟机器上开着SSH服务。

Windows端用ssh命令做本地端口转发:

ssh -L 13389:127.0.0.1:3389 remoteuser@192.168.1.100 -N

这条命令的意思是:在Windows本地的13389端口和麒麟机器的3389端口之间搭一条加密通道。隧道起来之后,mstsc连127.0.0.1:13389,实际上就到了麒麟的3389。

配合上防火墙只放行22端口、封掉3389,安全性提升是实打实的:RDP的握手和认证全在加密通道里走,外部扫描也扫不到远程桌面服务。

代价是每次连接前要先起隧道,稍微麻烦一点,可以写成批处理脚本一键搞定。另外如果你的内网有堡垒机或者跳板机规范,那就按单位的规定走,别自己搭旁路。

6. 长期使用的调优与运维经验

跑通只是起点,用起来舒服才是目的。这一节分享一些长期使用中攒下来的经验。

6.1 让画面不再像幻灯片

远程桌面天生不适合跑动画。几个立竿见影的调整:

关掉桌面特效。UKUI的桌面特效在远程会话里是纯负担,每帧都要编码传输,看起来就是一顿一顿的。在设置里把窗口动画、透明效果、桌面切换动画都关掉。

色深降到16位或者24位。在.rdp文件里把session bpp调低,肉眼几乎看不出差别,但传输量明显下降。

关掉不需要的重定向。声音重定向、磁盘重定向、打印机重定向,每个都是一路额外的通道,用不上的就关掉。.rdp文件里把对应项设成0就行。

检查网络的MTU和延迟。如果画面卡顿是间歇性的,特别是打字延迟明显,先测一下到麒麟机器的网络延迟和丢包。xrdp的会话建立和维持对环境比较敏感,链路抖动的环境下体验会很差。

还有一个容易被忽略的点:麒麟的壁纸如果是高清大图,每次重绘都要传一张大图,换成纯色或者简单图案的壁纸,远程体验会好一些。

6.2 多用户并发与断线保持

xrdp默认支持多用户并发,每个用户一个独立会话,互不干扰。控制并发数的参数在/etc/xrdp/sesman.ini里:

[Sessions] MaxSessions=50 KillDisconnected=false DisconnectedTimeLimit=0 IdleTimeLimit=0

KillDisconnected=false配合DisconnectedTimeLimit=0的意思是:客户端断开后不杀会话,也不设超时。这样你从Windows上关掉窗口,麒麟那边的程序和窗口都还开着,下次连回来还是原来的样子。这对那些需要挂长任务(比如跑一个长时间的脚本、开着一个不能断的业务客户端)的场景非常有用。

代价是要注意资源占用。会话挂着不释放,内存和CPU都会被占着。如果只是偶尔用,建议还是设一个合理的DisconnectedTimeLimit,比如3600秒,一小时后自动回收。

改完sesman.ini要重启xrdp-sesman服务才生效。

6.3 安全上的几个习惯

我把远程相关的安全习惯归纳成几条,都是低成本高收益的。

  • 远程账号用独立账号,不用管理员账号,密码按单位的复杂度要求设置,定期换。
  • 能改默认端口就改,不是为了"安全",而是为了减少自动化扫描带来的日志噪音。
  • 防火墙做源地址限制,只允许办公网段访问远程桌面端口,其他一律拒绝。
  • 关闭不必要的通道,用不到的功能就等于没打开的入口。
  • 定期看/var/log/xrdp.log,异常登录尝试会留下记录,看到大量来自不认识的IP的连接尝试,就考虑上更严格的访问控制。
  • 系统补丁和xrdp版本保持更新,安全更新该打就打。

这些都是常规操作,没什么高深技巧,但坚持做和不做,差别很大。

6.4 我踩过的几个具体坑

说几个印象深刻的,都是网上教程不会写的。

坑一:改配置忘了备份,把本地桌面也搞挂。有一次我在startwm.sh里加了一行不太对的export,结果不只是远程连不上,本地重启后桌面也起不来了——因为那个脚本被别的会话也引用了。教训是:改/etc下面的文件,永远先cp一份带日期的备份,.bak后面加上年月日。

坑二:本地和远程同时用同一个账号,配置互相覆盖。现象是本地好不容易把面板调好,远程登一次回来发现面板位置全变了。这就是dconf配置文件的并发写入问题。用了专用账号之后彻底消失。

坑三:以为改完就生效,忘了重启服务。xrdp.ini和sesman.ini改完必须重启对应服务,重启错了也没用——xrdp.ini归xrdp服务管,sesman.ini归xrdp-sesman管。两个都重启最保险。

坑四:防火墙放行了但状态没刷新。用ufw的话,allow之后记得reload或者确认规则真的在status里出现了。有次我加完规则就去连,怎么都连不上,后来发现规则在,但防火墙没重载。

坑五:跨版本照抄教程。麒麟V10的SP1、SP2、SP3在桌面会话的启动命令上是有差异的,从网上抄的Exec行放到自己机器上可能就是错的。永远以自己机器上/usr/share/xsessions/里的实际内容为准,这一步花不了两分钟,能省掉一晚上的排查。

坑六:忘了Windows那边也占3389。如果你打算在麒麟机器上同时跑点什么需要监听端口的东西,或者做过端口转发,3389可能被占。上ss -tlnp看一眼,端口冲突的问题排查起来其实很快,但想不到就会绕很久。

我个人在这套方案上跑了小半年,现在的状态是:一台放在机房的麒麟V10桌面机,配了独立的远程账号和轻量会话,Windows这边双击一个.rdp文件就能进去干活,剪贴板、文件互传都正常,声音重定向我直接放弃了。真要说有什么心得,就是别追求"远程和本地一模一样",把两边的定位分开来设计,问题会少一大半。另外,动手前把SSH通道和配置备份这两件事做好,剩下的都是可以慢慢磨的细节。

返回列表