sunshine - ubuntu 22.04, moonlight - mac OS26 远程桌面

1. 安装

https://github.com/LizardByte/Sunshine/releases

下载最新版,

wget https://github.com/LizardByte/Sunshine/releases/download/v2026.817.185037/sunshine-ubuntu-22.04-amd64.deb

sudo apt install sunshine-ubuntu-22.04-amd64.deb

以下是 Ubuntu 22.04(远程主机,Sunshine 服务端)+ macOS 26(本地主机,Moonlight 客户端) 的完整安装与配置步骤。核心思路:Ubuntu 侧 Sunshine 不使用 systemd,而是随 GNOME 桌面会话自动启动,彻底避免 Wayland 下托盘崩溃、环境变量缺失等问题。


一、Ubuntu 22.04 侧 — 安装并配置 Sunshine

1. 下载并安装 Sunshine

Sunshine 官方提供 Ubuntu 22.04 的 .deb 包,直接从 GitHub Releases 下载安装:

cd ~
wget https://github.com/LizardByte/Sunshine/releases/latest/download/sunshine-ubuntu-22.04-amd64.deb
sudo apt update
sudo apt install -y ./sunshine-ubuntu-22.04-amd64.deb

安装完成后,Sunshine 会默认注册一个 systemd 用户服务,但我们不启用它,下一步将其停用。


2. 停用 systemd 用户服务

systemd 用户服务在 GNOME Wayland 下启动时缺少图形环境变量,Qt 托盘会崩溃,且与桌面自启动冲突。

systemctl --user stop sunshine
systemctl --user disable sunshine

3. 创建配置文件(禁用 system_tray)

Sunshine Linux 版读取的是 sunshine.conf,配置项叫 system_tray,值是字符串 disabled

mkdir -p ~/.config/sunshine
cat > ~/.config/sunshine/sunshine.conf << 'EOF'
system_tray = disabled
EOF

注意:不是 tray = false,也不是 config.json。这是 GNOME Wayland 下避免托盘崩溃的关键。


4. 创建桌面自启动文件

让 Sunshine 随 GNOME 图形会话一起启动,自动继承 DISPLAYWAYLAND_DISPLAYXDG_SESSION_TYPE 等所有环境变量。

mkdir -p ~/.config/autostart
cat > ~/.config/autostart/sunshine.desktop << 'EOF'
[Desktop Entry]
Name=Sunshine
Comment=Self-hosted game stream host for Moonlight
Exec=/usr/bin/sunshine
Type=Application
Terminal=false
Icon=sunshine
Categories=Game;Network;
X-GNOME-Autostart-enabled=true
EOF
chmod +x ~/.config/autostart/sunshine.desktop

5. 配置防火墙(UFW)

Sunshine 需要开放以下端口才能正常通信:

sudo ufw allow 47984:47990/tcp
sudo ufw allow 48010/tcp
sudo ufw allow 47998:48000/udp
sudo ufw allow 48002/udp
sudo ufw reload

验证:

sudo ufw status | grep -E '4798|4801|4800|4802'

6. 创建 udev 规则(允许 Sunshine 创建虚拟输入设备)

Sunshine 通过 uinput 模拟游戏手柄和键盘鼠标,需要 udev 权限:

echo 'KERNEL=="uinput", SUBSYSTEM=="misc", OPTIONS+="static_node=uinput", TAG+="uaccess"' | \
  sudo tee /etc/udev/rules.d/85-sunshine.rules
sudo udevadm control --reload-rules
sudo udevadm trigger

7. 注销并重新登录 GNOME

完成上述配置后,注销当前用户并重新登录(或重启)。GNOME 登录后 Sunshine 会自动在后台启动。


8. 验证 Sunshine 是否正常运行

ss -tlnp | grep -E '47989|47990'

看到端口监听即成功。浏览器访问 Web UI:

https://localhost:47990

首次访问需要设置管理员用户名和密码。

如果你不在 Ubuntu 机器旁边,可以通过 SSH 端口转发远程配置:

ssh -L 47990:localhost:47990 username@ubuntu_ip

然后在本地浏览器打开 https://localhost:47990 进行初始化设置。


二、macOS 26 侧 — 安装并配置 Moonlight

1. 下载并安装 Moonlight

Moonlight 是 Sunshine 的客户端,macOS 版本支持 Intel 和 Apple Silicon:

安装方式(任选其一):

  • 方式 A:官网下载 DMG

    1. 打开 https://moonlight-stream.org/
    2. 点击 macOS 下载 Moonlight-*.dmg
    3. 双击挂载 DMG,将 Moonlight.app 拖入 应用程序 文件夹
  • 方式 B:App Store
    在 Mac App Store 搜索 “Moonlight Game Streaming” 并安装(注意认准官方开发者)。


2. 首次启动与配对

  1. 打开 Moonlight 应用。
  2. 如果 Ubuntu 主机与 Mac 在同一局域网,Moonlight 应能自动发现 Sunshine 主机;如果没有自动发现,点击 “Add Host Manually”,输入 Ubuntu 的 IP 地址
  3. 点击主机图标,Moonlight 会显示一个 4 位 PIN 码
  4. 在 Ubuntu 侧打开 Sunshine Web UI(https://localhost:47990),进入 “PIN” 页面,输入该 PIN 码并给设备命名。
  5. 配对成功后,Moonlight 会显示 “Pairing successful!”

3. 连接并串流

配对完成后,Moonlight 主界面会列出 Sunshine 主机上的可用应用(默认至少有一个 Desktop)。

  • 点击 Desktop 即可串流整个 Ubuntu 桌面。
  • 首次连接时可根据网络情况调整分辨率、帧率、码率(建议 LAN 环境下使用 1080p@60fps / 50Mbps 或更高)。

三、核心要点总结

正确做法
systemd 用户服务启动 Sunshine改用 ~/.config/autostart/sunshine.desktop 桌面自启动
配置项叫 tray实际叫 system_tray
值写 false实际写 disabled
config.jsonLinux 版读 sunshine.conf
GNOME Wayland 托盘崩溃禁用 system_tray 彻底解决
防火墙未开放端口按上文开放 TCP/UDP 端口
无虚拟输入设备权限创建 /etc/udev/rules.d/85-sunshine.rules

四、可选优化

1. 固定 Ubuntu IP(局域网内)

在路由器中为 Ubuntu 主机设置静态 DHCP 绑定,或配置 Netplan 固定 IP,避免 Moonlight 每次都要重新查找主机。

2. 远程访问(不在同一局域网)

如果需要在公网访问,推荐:

  • Tailscale / WireGuard:在 Ubuntu 和 macOS 上都安装 Tailscale,组成虚拟局域网,Moonlight 中直接输入 Tailscale 分配的 IP。
  • SSH 隧道:仅用于临时管理 Web UI,不适合游戏串流(延迟高)。

3. 编码器调优

在 Sunshine Web UI → Configuration 中检查自动识别的编码器:

  • NVIDIA GPU → NVENC
  • AMD GPU → AMF
  • Intel iGPU → QuickSync (VAAPI)
  • 无独显 → Software fallback(CPU 编码,延迟较高)

至此,两侧配置完成。重新登录 Ubuntu 后 Sunshine 会自动启动,Mac 上打开 Moonlight 即可随时串流。

2. 配置自动登录

不需要在 Ubuntu 上"复刻"一个和 Mac 相同的登录,但有一个关键前提:Ubuntu 主机必须先有一个用户登录到 GNOME 桌面,Sunshine 才能工作。


为什么必须先登录?

Sunshine 在 GNOME Wayland 下需要依赖活跃的图形会话来捕获屏幕。它不能自己创建或唤醒一个图形会话——这和 Windows 版 Sunshine(可以虚拟显示器、锁屏连接)不同。

所以流程必须是:

Ubuntu 开机 → 用户登录 GNOME 桌面 → Sunshine 随桌面自启动 → Moonlight 连接

Moonlight 只管连接,不管替你在 Ubuntu 上登录桌面。


如果你希望完全无人值守

如果你不想每次 Ubuntu 重启后都手动去登录一次,可以配置 GDM 自动登录

sudo nano /etc/gdm3/custom.conf

找到并修改为(将 your_username 换成你的实际用户名):

[daemon]
AutomaticLoginEnable=true
AutomaticLogin=your_username

保存后重启,Ubuntu 开机后会自动进入桌面,Sunshine 随之自动启动,之后 Mac 上的 Moonlight 随时可连。


总结

问题答案
Ubuntu 需要和 Mac 相同的用户名/密码吗?不需要,两边完全独立
Ubuntu 需要先有人登录桌面吗?需要,Sunshine 依赖活跃图形会话
能做到开机后无人值守直接连吗?可以,配置 GDM 自动登录即可

3. 配置分辨率

(实践用了 方案二)

配置输出分辨率涉及两端Moonlight 客户端请求什么分辨率,以及 Sunshine 服务端是否动态调整物理显示器的分辨率来匹配。以下是针对你场景(Ubuntu 22.04 GNOME Wayland + 桌面自启动)的完整配置方法。


方案一:动态分辨率匹配(推荐)

让 Ubuntu 桌面在串流时临时切换分辨率到 Moonlight 客户端请求的分辨率,串流结束后恢复。这是体验最好的方案。

1. 找到你的显示器输出名

在 Ubuntu 上执行:

kscreen-doctor -o

输出示例:

Output: 1 DP-1
    ...
Output: 2 HDMI-1
    ...

记下你的主显示器名称(如 DP-1HDMI-1)。

2. 在 Sunshine Web UI 中配置 Command Preparations

打开 https://localhost:47990ConfigurationApplications → 编辑你要串流的应用(或 Desktop)→ Command Preparations → 点击 Add

字段
Do Commandsh -c "kscreen-doctor output.DP-1.mode.${SUNSHINE_CLIENT_WIDTH}x${SUNSHINE_CLIENT_HEIGHT}@${SUNSHINE_CLIENT_FPS}"
Undo Commandsh -c "kscreen-doctor output.DP-1.mode.1920x1080@60"

DP-1 替换为你实际的显示器名称,1920x1080@60 替换为你平时使用的分辨率和刷新率。

环境变量说明:Sunshine 在串流启动时会自动注入以下变量,可直接在命令中使用:

变量含义
SUNSHINE_CLIENT_WIDTHMoonlight 请求的分辨率宽度
SUNSHINE_CLIENT_HEIGHTMoonlight 请求的分辨率高度
SUNSHINE_CLIENT_FPSMoonlight 请求的帧率

3. 为什么桌面自启动对此方案更有利

如果你之前用 systemd 启动 Sunshine,这些 kscreen-doctor 命令会因为没有 DISPLAY/WAYLAND_DISPLAY 环境变量而失败:

而你的桌面自启动方式(~/.config/autostart/sunshine.desktop自动继承了完整的图形会话环境,所以 kscreen-doctor 可以正常工作。


方案二:Moonlight 客户端直接设置(最简单)

如果你不想折腾服务端分辨率切换,直接在 macOS 上的 Moonlight 中设置:

  1. 打开 Moonlight → 点击右上角 ⚙️ 设置
  2. 设置 分辨率帧率码率
场景分辨率帧率码率
MacBook Air / 一般 WiFi1920×108060 fps20–30 Mbps
MacBook Pro / 有线网络2560×144060 fps40–60 Mbps
4K 显示器 / 优质网络3840×216060 fps80–120 Mbps

Moonlight 会将画面缩放到你设置的尺寸,但Ubuntu 物理显示器分辨率不变。如果客户端分辨率与显示器原生比例不一致,会出现黑边或拉伸。


方案三:指定 Sunshine 捕获特定显示器(多屏场景)

如果你有多个显示器,可以在 ~/.config/sunshine/sunshine.conf 中指定捕获哪一个:

# 先查看 Sunshine 启动日志中的显示器列表
journalctl --user | grep "Detected display"

然后在 sunshine.conf 中添加:

system_tray = disabled
output_name = HDMI-1

HDMI-1 替换为日志中显示的连接器名称。


方案四:虚拟显示器(Headless / 无物理显示器)

如果你的 Ubuntu 主机不接物理显示器,可以配置虚拟显示器。这个比较复杂,取决于你的显卡:

NVIDIA 显卡(推荐)

参考社区方案,通过内核参数强制启用虚拟显示器:

核心步骤:

  1. 生成自定义 EDID(包含你想要的分辨率,如 4K@120Hz)
  2. 配置 GRUB 内核参数强制启用连接器
  3. Sunshine 配置 capture = kms,自动捕获虚拟显示器

通用方案(xrandr + 虚拟输出)

如果你使用 Intel/AMD 显卡,可以尝试:

# 创建虚拟输出(需安装 xserver-xorg-video-dummy 或类似驱动)
xrandr --addmode VIRTUAL1 1920x1080

然后在 Sunshine 中指定 output_name = VIRTUAL1


总结:按场景选择

场景推荐方案
Ubuntu 接了物理显示器,想完美匹配 Mac 分辨率方案一(Command Preparations + kscreen-doctor)
懒得配置,能接受黑边或缩放方案二(只在 Moonlight 客户端设置)
Ubuntu 多显示器,只想串流其中一块方案三output_name 指定)
Ubuntu 不接显示器(headless)方案四(虚拟显示器)

最推荐的是方案一 + 方案二结合:服务端用 Command Preparations 动态切分辨率,客户端 Moonlight 按需设置合适的码率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值