手上有一台 Oracle Cloud ARM 实例,系统是 Oracle-Linux-8.6-aarch64-2022.08.08-0,实际内存约 18GB。机器已经用了几年,平时主要通过 SSH 连接,上面还跑过 Jupyter和一些其他服务。
最近想给它增加一个图形桌面。目的不是把 Linux 云服务器变成完整的 Windows VPS,而是需要浏览器、轻量 IDE 或图形化工具时,可以直接从 Mac 连上去。Claude Code、Codex CLI、Python/Jupyter 和长时间脚本仍然留在服务器上运行。
最终已经实现了桌面端连接,也能在远程桌面中使用浏览器。实际使用的连接方式是:
Mac Windows App
-> 127.0.0.1:13389
-> SSH 本地端口转发
-> 服务器 127.0.0.1:3389
-> xrdp
3389 不对公网开放。需要桌面时,先在 Mac 建立 SSH 隧道,再打开 Windows App。这比为动态家庭公网 IP 单独维护一条 RDP 白名单省事。
服务器端的准备顺序
这台机器使用的是 Oracle Linux 8.6 ARM64。正式安装前,先确认系统、架构、内存和根分区空间:
cat /etc/oracle-release
uname -m
free -h
df -h /
然后更新系统:
sudo dnf update
本机长期没有更新,执行时遇到了 tuned 与 tuned-profiles-oci 的依赖冲突。DNF 提示可以使用 --nobest 选择兼容候选,因此实际处理方向改为:
sudo dnf update --nobest
系统更新完成后,安装桌面环境和 xrdp:
sudo dnf -y groupinstall "Server with GUI" --nobest
sudo dnf -y install xrdp xorgxrdp
sudo systemctl enable --now xrdp
sudo firewall-cmd --permanent --add-service=rdp
sudo firewall-cmd --reload
第一条安装 Server with GUI 软件组;这台机器仍然需要 --nobest 避开前面遇到的最佳候选冲突。随后安装 xrdp 和 xorgxrdp,并立即启动 xrdp、设置为开机启动。
最后两条把 rdp 服务加入 firewalld 的永久规则并重新加载。这里放行的是服务器操作系统防火墙,和 OCI 安全列表或 NSG 不是同一层。最终方案没有在 OCI 中增加公网 3389 入站规则,RDP 仍然通过 SSH 隧道访问。
安装完成后,至少要检查服务和监听状态:
sudo systemctl status xrdp --no-pager
sudo systemctl is-enabled xrdp
sudo ss -lntp | grep 3389
这三项分别确认 xrdp 是否运行、是否设置为开机启动,以及 3389 实际监听在哪个地址。检查正常后,再继续准备登录账户和 SSH 隧道。
准备 xrdp 登录账户
服务器平时使用 opc 用户通过 SSH 密钥登录。执行 sudo -i 时不要求密码,但这不代表 opc 已经有可供 xrdp 使用的本机密码。
当时检查账户状态:
sudo passwd -S opc
输出的第二列是 LK:
opc LK ... (Password locked.)
xrdp 登录需要 Linux 用户名和本机密码。设置密码时,第一次又被系统复杂度策略拒绝:
BAD PASSWORD: The password contains less than 1 non-alphanumeric characters
需要设置一个符合当前系统策略的密码,再检查状态:
sudo passwd opc
sudo passwd -u opc
sudo passwd -S opc
这里容易混淆四件事:
- SSH 私钥用于从 Mac 认证到服务器;
- 私钥口令用于解锁 Mac 本地的私钥文件;
- Linux 账户密码供 xrdp/PAM 验证
opc; sudo的免密配置只决定执行 sudo 时是否询问密码。
SSH 可以继续保持 PasswordAuthentication no,不需要为了 xrdp 重新开放 SSH 密码登录。
从 Mac 建立 SSH 隧道
最初考虑过直接在 OCI 和服务器防火墙中开放 3389,并把来源限制为家庭公网 IP。但本地公网 IP 会变化,后续需要不断修改规则。既然服务器已经有 SSH 密钥入口,RDP 直接复用 SSH 通道更简单。
实际操作时还遇到过一次:原 SSH 私钥找不到具体路径。直接运行隧道命令时,服务器返回:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic).
服务器正常只保存公钥,无法从服务器取回原私钥。找不到旧私钥时,应在 Mac 本地重新生成密钥对,再把新公钥追加到服务器。
Mac 上生成 Ed25519 密钥:
ssh-keygen -t ed25519 \
-f ~/.ssh/oci_jupyter_ed25519 \
-C "oci-jupyter"
查看公钥:
cat ~/.ssh/oci_jupyter_ed25519.pub
在当前仍然能够登录的服务器会话中准备目录和文件权限:
sudo install -d -m 700 -o opc -g opc /home/opc/.ssh
sudo vi /home/opc/.ssh/authorized_keys
sudo chown opc:opc /home/opc/.ssh/authorized_keys
sudo chmod 600 /home/opc/.ssh/authorized_keys
把新公钥追加到 authorized_keys,不要覆盖原有公钥。在确认新密钥可用前,也不要关闭当前还能登录的 SSH 窗口。
另开一个 Mac 终端测试:
ssh -i ~/.ssh/oci_jupyter_ed25519 \
-o IdentitiesOnly=yes \
opc@服务器公网IP
确认密钥登录正常后,建立本地端口转发:
ssh -i ~/.ssh/oci_jupyter_ed25519 \
-o IdentitiesOnly=yes \
-N -L 13389:127.0.0.1:3389 \
opc@服务器公网IP
-N 表示不执行远程命令,只建立转发。因此输入私钥口令后,终端会一直运行,看起来像“卡住”,这是正常状态。保持这个终端不要关闭。
-L 13389:127.0.0.1:3389 的含义是:Mac 本地监听 13389,收到连接后通过 SSH 转发,再由服务器连接自己的 127.0.0.1:3389。
使用 Windows App 连接
在 Mac 的 Windows App 中添加一台 PC,地址填写:
127.0.0.1:13389
登录信息填写:
用户名:opc
密码:opc 的 Linux 本机密码
这里不是 SSH 私钥口令。连接成功后就可以进入 Oracle Linux 桌面,浏览器也可以正常打开使用。
如果本地端口无法监听,可以先检查 13389 是否已被其他进程占用:
lsof -nP -iTCP:13389 -sTCP:LISTEN
如果隧道保持运行,但 Windows App 仍然无法连接,则回到服务器检查 xrdp 服务、3389 监听和 opc 账户状态。关闭 SSH 隧道所在的终端后,远程桌面连接也会中断。
这次遇到的几个问题
DNF 更新冲突
系统提示 tuned 与 tuned-profiles-oci 的最佳候选版本冲突。本次没有直接使用 --allowerasing,而是按 DNF 提示改用 --nobest,避免在没有确认事务内容时替换 OCI 相关包。
根分区空间不足
这台机器的 36GB 根分区最初使用率达到 98%,只剩 1.1GB,更新还提示至少需要 969MB。这个问题不具有普遍性,所以不展开完整清理过程。
需要排查时,先看根分区、主要目录、Podman 和已删除但仍被占用的文件:
df -h /
sudo du -xhd1 / | sort -h
sudo podman system df -v
sudo podman ps -a
sudo lsof +L1
本机最终清理到约 9.2GB 空闲。具体发现过 root 回收站里的 ISO、旧 Rocket.Chat 目录、MongoDB 大日志和未使用的容器镜像,但这些都是本机历史遗留,不能直接变成其他服务器的删除清单。
还有一个实际踩坑:服务器重启后,原来运行的 Draw.io 容器没有自动启动,随后执行 podman system prune 时被当成 stopped 容器删除。清理前一定要先看 podman ps -a,不要只看当前运行容器。
firewalld 本身也报错
第一次执行 firewalld 的 RDP 放行命令时,系统 Python 缺少 decorator 模块,firewall-cmd 直接报错。遇到相同情况时,需要先修复 firewalld 对应的系统 RPM/Python 依赖,再重新执行安装段中的 --add-service=rdp 和 --reload。不要用 pip 随意修改 firewalld 使用的系统 Python 环境。
50Mbps 不是 ARM 免费机的统一结论
Oracle Always Free 文档中“互联网最高 50Mbps”的描述对应 AMD VM.Standard.E2.1.Micro,不能直接套到 Ampere A1 ARM 实例上。远程桌面的实际体验仍取决于实例规格、区域、链路和本地网络,本文没有做专门测速。
这套桌面适合做什么
目前主要把它当成云端开发环境的图形入口。浏览器、终端、轻量 IDE、Jupyter 和 CLI AI 工具都可以放在服务器上,Mac 只负责连接。
它不是 GPU 推理主机,也不适合游戏、视频剪辑或高码率远程视频。ARM64 还会遇到软件兼容性差异,有些闭源软件、旧二进制包和只提供 x86_64 的容器镜像不能直接运行。Claude Code、Codex CLI 等工具的响应速度仍取决于 API、网络和账户额度,增加桌面不会让模型本身变快。
现在需要桌面时,我会先启动 SSH 隧道,再打开 Windows App。用完关闭隧道,RDP 连接随之断开。对这台个人服务器来说,这种方式已经够用。
参考资料
- Oracle Cloud Infrastructure Always Free Resources:https://docs.oracle.com/en-us/iaas/Content/FreeTier/freetier_topic-Always_Free_Resources.htm
- OpenSSH
ssh(1):https://man.openbsd.org/ssh