
1. 安装https://github.com/LizardByte/Sunshine/releases下载最新版wgethttps://github.com/LizardByte/Sunshine/releases/download/v2026.817.185037/sunshine-ubuntu-22.04-amd64.debsudoaptinstallsunshine-ubuntu-22.04-amd64.deb以下是Ubuntu 22.04远程主机Sunshine 服务端 macOS 26本地主机Moonlight 客户端的完整安装与配置步骤。核心思路Ubuntu 侧 Sunshine 不使用 systemd而是随 GNOME 桌面会话自动启动彻底避免 Wayland 下托盘崩溃、环境变量缺失等问题。一、Ubuntu 22.04 侧 — 安装并配置 Sunshine1. 下载并安装 SunshineSunshine 官方提供 Ubuntu 22.04 的.deb包直接从 GitHub Releases 下载安装cd~wgethttps://github.com/LizardByte/Sunshine/releases/latest/download/sunshine-ubuntu-22.04-amd64.debsudoaptupdatesudoaptinstall-y./sunshine-ubuntu-22.04-amd64.deb安装完成后Sunshine 会默认注册一个 systemd 用户服务但我们不启用它下一步将其停用。2. 停用 systemd 用户服务systemd 用户服务在 GNOME Wayland 下启动时缺少图形环境变量Qt 托盘会崩溃且与桌面自启动冲突。systemctl--userstop sunshine systemctl--userdisable sunshine3. 创建配置文件禁用 system_traySunshine Linux 版读取的是sunshine.conf配置项叫system_tray值是字符串disabled。mkdir-p~/.config/sunshinecat~/.config/sunshine/sunshine.confEOF system_tray disabled EOF注意不是tray false也不是config.json。这是 GNOME Wayland 下避免托盘崩溃的关键。4. 创建桌面自启动文件让 Sunshine 随 GNOME 图形会话一起启动自动继承DISPLAY、WAYLAND_DISPLAY、XDG_SESSION_TYPE等所有环境变量。mkdir-p~/.config/autostartcat~/.config/autostart/sunshine.desktopEOF [Desktop Entry] NameSunshine CommentSelf-hosted game stream host for Moonlight Exec/usr/bin/sunshine TypeApplication Terminalfalse Iconsunshine CategoriesGame;Network; X-GNOME-Autostart-enabledtrue EOFchmodx ~/.config/autostart/sunshine.desktop5. 配置防火墙UFWSunshine 需要开放以下端口才能正常通信sudoufw allow47984:47990/tcpsudoufw allow48010/tcpsudoufw allow47998:48000/udpsudoufw allow48002/udpsudoufw reload验证sudoufw status|grep-E4798|4801|4800|48026. 创建 udev 规则允许 Sunshine 创建虚拟输入设备Sunshine 通过uinput模拟游戏手柄和键盘鼠标需要 udev 权限echoKERNELuinput, SUBSYSTEMmisc, OPTIONSstatic_nodeuinput, TAGuaccess|\sudotee/etc/udev/rules.d/85-sunshine.rulessudoudevadm control --reload-rulessudoudevadm trigger7. 注销并重新登录 GNOME完成上述配置后注销当前用户并重新登录或重启。GNOME 登录后 Sunshine 会自动在后台启动。8. 验证 Sunshine 是否正常运行ss-tlnp|grep-E47989|47990看到端口监听即成功。浏览器访问 Web UIhttps://localhost:47990首次访问需要设置管理员用户名和密码。如果你不在 Ubuntu 机器旁边可以通过 SSH 端口转发远程配置ssh-L47990:localhost:47990 usernameubuntu_ip然后在本地浏览器打开https://localhost:47990进行初始化设置。二、macOS 26 侧 — 安装并配置 Moonlight1. 下载并安装 MoonlightMoonlight 是 Sunshine 的客户端macOS 版本支持 Intel 和 Apple Silicon安装方式任选其一方式 A官网下载 DMG打开 https://moonlight-stream.org/点击macOS下载Moonlight-*.dmg双击挂载 DMG将Moonlight.app拖入应用程序文件夹方式 BApp Store在 Mac App Store 搜索“Moonlight Game Streaming”并安装注意认准官方开发者。2. 首次启动与配对打开Moonlight应用。如果 Ubuntu 主机与 Mac 在同一局域网Moonlight 应能自动发现 Sunshine 主机如果没有自动发现点击“Add Host Manually”输入 Ubuntu 的IP 地址。点击主机图标Moonlight 会显示一个4 位 PIN 码。在 Ubuntu 侧打开 Sunshine Web UIhttps://localhost:47990进入“PIN”页面输入该 PIN 码并给设备命名。配对成功后Moonlight 会显示“Pairing successful!”。3. 连接并串流配对完成后Moonlight 主界面会列出 Sunshine 主机上的可用应用默认至少有一个Desktop。点击Desktop即可串流整个 Ubuntu 桌面。首次连接时可根据网络情况调整分辨率、帧率、码率建议 LAN 环境下使用1080p60fps / 50Mbps或更高。三、核心要点总结坑正确做法systemd 用户服务启动 Sunshine改用~/.config/autostart/sunshine.desktop桌面自启动配置项叫tray实际叫system_tray值写false实际写disabled用config.jsonLinux 版读sunshine.confGNOME 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→ NVENCAMD GPU→ AMFIntel iGPU→ QuickSync (VAAPI)无独显 → Software fallbackCPU 编码延迟较高至此两侧配置完成。重新登录 Ubuntu 后 Sunshine 会自动启动Mac 上打开 Moonlight 即可随时串流。2. 配置自动登录不需要在 Ubuntu 上复刻一个和 Mac 相同的登录但有一个关键前提Ubuntu 主机必须先有一个用户登录到 GNOME 桌面Sunshine 才能工作。为什么必须先登录Sunshine 在GNOME Wayland下需要依赖活跃的图形会话来捕获屏幕。它不能自己创建或唤醒一个图形会话——这和 Windows 版 Sunshine可以虚拟显示器、锁屏连接不同。所以流程必须是Ubuntu 开机 → 用户登录 GNOME 桌面 → Sunshine 随桌面自启动 → Moonlight 连接Moonlight 只管连接不管替你在 Ubuntu 上登录桌面。如果你希望完全无人值守如果你不想每次 Ubuntu 重启后都手动去登录一次可以配置GDM 自动登录sudonano/etc/gdm3/custom.conf找到并修改为将your_username换成你的实际用户名[daemon] AutomaticLoginEnabletrue AutomaticLoginyour_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-1或HDMI-1。2. 在 Sunshine Web UI 中配置 Command Preparations打开https://localhost:47990→Configuration→Applications→ 编辑你要串流的应用或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.1920x108060将DP-1替换为你实际的显示器名称1920x108060替换为你平时使用的分辨率和刷新率。环境变量说明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中设置打开 Moonlight → 点击右上角 ⚙️设置设置分辨率、帧率、码率场景分辨率帧率码率MacBook Air / 一般 WiFi1920×108060 fps20–30 MbpsMacBook Pro / 有线网络2560×144060 fps40–60 Mbps4K 显示器 / 优质网络3840×216060 fps80–120 MbpsMoonlight 会将画面缩放到你设置的尺寸但Ubuntu 物理显示器分辨率不变。如果客户端分辨率与显示器原生比例不一致会出现黑边或拉伸。方案三指定 Sunshine 捕获特定显示器多屏场景如果你有多个显示器可以在~/.config/sunshine/sunshine.conf中指定捕获哪一个# 先查看 Sunshine 启动日志中的显示器列表journalctl--user|grepDetected display然后在sunshine.conf中添加system_tray disabled output_name HDMI-1将HDMI-1替换为日志中显示的连接器名称。方案四虚拟显示器Headless / 无物理显示器如果你的 Ubuntu 主机不接物理显示器可以配置虚拟显示器。这个比较复杂取决于你的显卡NVIDIA 显卡推荐参考社区方案通过内核参数强制启用虚拟显示器核心步骤生成自定义 EDID包含你想要的分辨率如 4K120Hz配置 GRUB 内核参数强制启用连接器Sunshine 配置capture kms自动捕获虚拟显示器通用方案xrandr 虚拟输出如果你使用 Intel/AMD 显卡可以尝试# 创建虚拟输出需安装 xserver-xorg-video-dummy 或类似驱动xrandr--addmodeVIRTUAL1 1920x1080然后在 Sunshine 中指定output_name VIRTUAL1。总结按场景选择场景推荐方案Ubuntu 接了物理显示器想完美匹配 Mac 分辨率方案一Command Preparations kscreen-doctor懒得配置能接受黑边或缩放方案二只在 Moonlight 客户端设置Ubuntu 多显示器只想串流其中一块方案三output_name指定Ubuntu 不接显示器headless方案四虚拟显示器最推荐的是方案一 方案二结合服务端用 Command Preparations 动态切分辨率客户端 Moonlight 按需设置合适的码率。