快轉到主要內容

Sunshine:Linux版Moonlight教學,自架免費雲端串流遊戲服務+遠端桌面

Linux系統 Self-hosting自架 Cloud Gaming Remote Desktop Steam Linux
🗓️ 民國111年 壬寅年
✍ 切換正體/簡體字
目錄

Moonlight Game Streaming(月光)是能讓你用手機筆電串流玩另一台電腦遊戲的開源軟體,同時有遠端桌面的功能。

Moonlight主要依賴GPU傳輸畫面,因此CPU佔用較低。作為開源專案,Moonlight現已支援Nvidia/AMD/Intel顯示卡,但只有Windows版怎麼行呢?於是就有人開發了Linux版的Moonlight,就叫作Sunshine(陽光)。

實際操作請看以下影片

本文將示範在性能較強的Linux桌機安裝Sunshine,並用性能較弱的Linux筆電遊玩桌機上的《戰爭雷霆》,後面再討論如何架設ZeroTier服務以達成在外面也能連線到家中電腦。

1. 安裝Sunshine伺服器
#

Sunshine最初由 loki-47-6F-64開發,現請使用 LizardByte維護的新版本Sunshine。

  1. Sunshine支援X11與Wayland工作階段。Nvidia顯示卡記得要 安裝CUDA套件

  2. 接著安裝Sunshine本體: 官方文件有列出各發行版的安裝檔,你可以直接下載 AppImage安裝:


# 將Sunshine搬移到`~/Applications
mkdir ~/Applications
mv ~/Downloads/sunshine.AppImage ~/Applications

chmod +x sunshine.AppImage
sudo ./sunshine.AppImage --install
sudo reboot
  1. 安裝Sunshine後還要設定Sunshine的服務。

2. 設定Sunshine伺服器服務
#

  1. 將自己加入input群組:
sudo usermod -a -G input $USER
sudo reboot
  1. 編輯Sunshine規則:
sudo vim /etc/udev/rules.d/85-sunshine-input.rules
  1. 加入以下內容:
KERNEL=="uinput", GROUP="input", MODE="0660"
  1. 編輯uinput:
sudo vim /etc/modules-load.d/uinput.conf
  1. 加入以下內容,防止Could not create Sunshine Mouse: Permission denied錯誤:
uinput
  1. UFW開啟防火牆,允許以下幾個通訊埠(port)連入:
sudo ufw allow 47984/tcp
sudo ufw allow 47989/tcp
sudo ufw allow 48010/tcp
sudo ufw allow 47988/udp
sudo ufw allow 47998/udp
sudo ufw allow 47999/udp
sudo ufw allow 48000/udp
sudo ufw allow 48002/udp
sudo ufw allow 48010/udp
sudo ufw reload
  1. 啟用Avahi服務
sudo systemctl enable --now avahi-daemon
  1. 啟動Sunshine系統服務。注意Sunshine是使用者服務,不是系統服務。
systemctl --user start sunshine

# 設定開機登入後自動啟動
systemctl --user enable sunshine

# 查看Sunshine運作情況
systemctl --user status sunshine

# AppImage的service可能會指向tmp目錄導致無法啟動,要自行編輯~/.config/systemd/user/sunshine.service,修正Exec=為sunshine.AppImage的所在路徑
  1. 用瀏覽器開啟https://localhost:47990,設定Sunshine後台的帳號密碼。

  2. 之後頁面會重新載入,登入Sunshine後台。

3. 安裝Moonlight客戶端
#

Moonlight的客戶端(Client)支援Linux/Windows/MacOS/Android/iOS,請到 官網下載。

  1. 開啟Monnlight連線客戶端,確認桌機和筆電都連線到同一個Wifi,筆電的Moonlight客戶端應該就會掃描到電腦了。點選電腦圖示,會出現一組配對碼。

  2. 桌機Sunshine後台點選Pair,輸入配對碼。

  3. 點選電腦圖示再點選"Desktop",筆電端就可以存取電腦桌面了。

  4. 選擇Desktop的界面能使用設定檔(~/.config/sunshine/sunshine.conf)或是Sunshine後台加入要快速啟動的程式。

  5. 如果延遲嚴重試著在Moonlight客戶端調低畫質和FPS。

  6. 遠端桌電的聲音也會一併傳輸過來,聽不到的話試著調整遠端主機的PulseAudio輸出模式。

4. Moonlight啟動Steam遊戲
#

Moonlight客戶端支援用遊戲手把、鍵盤、觸控螢幕遠端操控遊戲;手機版Moonlight APP由下往上三指滑動開啟鍵盤。由於手把要看遊戲有無支援,甚至還要搞按鍵映射,因此這邊是用筆電的鍵盤滑鼠作遠端操控。

  1. Moonlight客戶端能夠直接啟動Steam的Big Picture Mode,不過若Steam是用Snap或Flatpak安裝的就得手動開啟。

  2. 進入Big Picture Mode後,直接開啟遊戲吧。

  3. 實際用Moonlight遠端遊戲打了幾場空戰,偏靜態的畫面還算清楚。

  4. 不過畫面一複雜就可能變馬賽克了(下圖畫面是真的很模糊)。即使是區域網路都有這種問題,從外面連線回來這種真遠端就更不用說了,後面會探討一些解決方式。

5. 透過內網穿透遠端存取Sunshine
#

虛擬區域網路軟體是用於內網穿透的工具,使其不受Wifi網路的限制,讓二部不同網路的裝置連線到一個虛擬區域網路。

此處使用ZeroTier,請參考 ZeroTier使用教學,原理差不多,將二台裝置都連上ZeroTier網路,並開啟9993通訊埠給ZeroTier做P2P。

Moonlight客戶端連線會找不到ZeroTier網路上的電腦,請直接按右上角以ZeroTier分配的區域IP新增電腦:

6. 解決Moonlight連線延遲
#

非區域網路連線下,Moonlight(Sunshine)的伺服端上傳網速需求為40Mbps(每秒5MB)以上,ping值小於50ms,才能流暢串流720p30FPS的遊戲;要玩1080p60FPS遊戲則是需要160Mbps的上傳速度。

Moonlight客戶端的位元速率(Bitrate)最好設定為低於遠端電腦的上傳速度,串流才不會卡卡。

藉ZeroTier從外網連線到桌機上的Sunshine服務一定會有延遲,下面是我嘗試過的解決方法。

  1. 將系統NetworkManager的DNS伺服器設定為8.8.8.8
  2. zerotier-cli peers查看二個節點間是否有P2P成功,若成功會顯示為LEAF
  3. 從本機ping遠端主機的IP看延遲,100ms以內延遲才夠低。
  4. Speedtest測試一下網速。
  5. 重開數據機與路由器。

參考資料
#

相關文章

如何自架開源雲手機,用手機Scrcpy APP連線控制
Linux系統 Self-hosting自架 Cloud Gaming Android-x86 Scrcpy Docker
如何自架Whoogle搜尋引擎,防範隱私被Google搜尋窺探
Linux系統 Self-hosting自架 Search Engine Google Search
Android-x86 QEMU虛擬機安裝教學,在Linux上執行手機APP,支援GPU加速的VM
Linux系統 虛擬機與容器技術 Android-x86 Linux QEMU VirGL Scrcpy

留言板

此處提供二種留言板。點選按鈕,選擇您覺得方便的留言板。要討論程式碼請用Giscus,匿名討論請用Disqus。

這是Giscus留言板,需要Github帳號才能留言。支援markdown語法,若要上傳圖片請貼Imgur連結。您的留言會在Github Discussions向所有人公開。

這是Disqus留言板,您可能會看到Disqus強制投放的廣告。有時留言可能會被系統判定需審核,導致延遲顯示,請見諒。