当前位置: 首页 > news >正文

Ubuntu25.04通过Docker编译Sunshine记录

0x00 缘起

Sunshine 是 Moonlight 的自托管游戏串流服务端,搭配Moonlight可以在局域网内搭建无感远程主机。但是,在Ubuntu25.04中使用GitHub所提供的Sunshine安装包安装时,出现了错误“Error while loading shared libraries: libminiupnpc.so.17: cannot open shared object file: No such file or directory”。

对此,Github中常用的解决方案为以下两种:

        1. 舍弃Sunshine的unpnp功能,通过符号链接使用旧版本的so库启动Sunshine,这是一种临时的解决方案,流程如下:

$ cd /usr/lib/x86_64-linux-gnu
$ sudo ln -s libminiupnpc.so.18 libminiupnpc.so.17

        2. 从源代码构建Sunshine,在目标主机上编译安装,从根源上解决这个问题。

对于绝大数应用场景,使用方案1能够有效解决,但本文记录另一种解决方案,通过源代码编译安装Sunshine。

为了避免在编译Sunshine时所引入的工具库对住系统产生影响,本文通过在Ubuntu25.04 Docker容器中对Sunshine进行编译,着既能够隔离相关操作对主系统的影响,又能够最大限度的保障编译环境与安装环境一致。

在编译安装Sunshine的过程中,出现了大大小小的错误,可能某些错误通过修改Makefile文件禁用某些功能就可规避,但是本文不会禁用任何功能,将对Sunshine源代码进行完整编译。本文最终将提供,编译完成打包的Sunshine安装包,以及能够编译Sunshine的Docker镜像,供各位共同研究探讨。

0x01 系统环境

CPU:Intel® Core™ i7-9750H × 12

RAM:32.0 GiB

GPU:NVIDIA GeForce GTX 1650

OS:Linux Lenovo 6.14.0-23-generic #23-Ubuntu SMP PREEMPT_DYNAMIC Fri Jun 13 23:02:20 UTC 2025 x86_64 x86_64 x86_64 GNU/Linux

NVIDIA Driver Version:570.133.07

CUDA Version: 12.8 

NVCC:Cuda compilation tools, release 12.2, V12.2.140

NVIDIA Container Runtime version: 1.17.8

Docker Version:28.4.0

0x02 构建过程

构建过程将记录Sunshine的编译过程,其中主要工作是在容器中安装编译Sunshine所需要的库,记录相关库安装的过程和一些错误,以及Sunshine CMake文件的相关配置修改。

1. 拉取并启动Ubuntu25.04容器

在已经安装好Dokcer以及上述相关环境的主机终端中,执行以下代码,拉取并启动一个能够调用GPU的Ubuntu 25.04容器。

sudo docker run --gpus all -it --name sunshine-build \-v /workspace/Sunshine:/workspace/Sunshine \ubuntu:25.04

注意,拉取不成功可以使用国内Docker源为拉取加速,其中“--gpus all”参数要求系统必须正确安装“NVIDIA Container Runtime version”,该参数能够使得容器能够使用CUDA。

2. 更新系统并安装基础工具

在容器内更新系统并安装基础工具,执行一下代码。

apt update && apt upgrade -y
apt install -y software-properties-common
add-apt-repository -y restricted universe multiverse
apt update

值得注意的是,请注意更换Ubuntu软件源,确保正常更新与安装。

3. 安装编译依赖

在容器内安装编译依赖,执行一下代码。

apt install -y git cmake g++ pkg-config \libavcodec-dev libavformat-dev libavutil-dev libswscale-dev \libpulse-dev libopus-dev libxtst-dev libx11-dev libxrandr-dev \mesa-common-dev libssl-dev libnuma-dev libvpx-dev libdrm-dev \nvidia-cuda-toolkit

安装完成后,使用“nvcc --version ”检查CUDA工具的安装情况,确保该工具正确安装。然后,运行以下代码设置 CUDA 环境变量。

echo 'export CUDA_HOME=/usr' >> ~/.bashrc
echo 'export PATH=$PATH:/usr/bin' >> ~/.bashrc
source ~/.bashrc

4. 克隆Sunshine源代码到工作目录

cd /workspace
git clone https://github.com/LizardByte/Sunshine.git
cd Sunshine

在拉取源代码时,注意网络的连通性,可以使用以下代码,设置临时代理,请确保代理工具的网络可用性。

# 在容器内设置临时环境变量(根据您的代理配置修改)
export http_proxy="http://<代理IP>:<端口>"
export https_proxy="http://<代理IP>:<端口>"

5. 编译安装Boost

下载boost_1_87_0.tar.gz,并拷贝到容器内容进行编译安装。假设,在容器当前目录下存在boost_1_87_0.tar.gz,则执行以下代码,进行解压、编译安装。

# 解压 Boost
tar xf boost_1_87_0.tar.gz
cd boost_1_87_0# 安装依赖(Boost 构建需要)
apt update && apt install -y build-essential# 编译并安装
./bootstrap.sh
./b2 --prefix=/usr/local install# 验证安装
ls /usr/local/include/boost/version.hpp

6. 初始化并安装Sunshine 依赖的子模块

在容器内执行以下代码,初始化并安装Sunshine 依赖的子模块。

cd /workspace/Sunshine
git submodule update --init --recursive

7. 安装 libcurl 开发包

apt update
apt install -y \libcurl4-openssl-dev \libssl-dev \libpulse-dev \libopus-dev \libxtst-dev \libx11-dev \libxrandr-dev

8. 安装 libminiupnpc开发包

apt update && apt install -y libminiupnpc-dev

9. 安装libcap-dev

sudo apt install -y libcap-dev

10. 系统托盘图标和通知库

apt purge libappindicator3-dev
apt install -y libayatana-appindicator3-dev libnotify-devsudo apt install -y \libayatana-appindicator3-dev \libnotify-dev \libcap-dev \libminiupnpc-dev \libcurl4-openssl-dev \libssl-dev

11. 安装 Node.js 和 NPM 

# 1. 安装 Node.js 和 npm
sudo apt update
sudo apt install -y nodejs npm# 2. 验证安装
node --version
npm --version

安装完成Node与NPM考虑更换软件源为国内镜像。

12. 安装 Doxygen 和 Graphviz

apt install -y graphviz# 卸载旧版本doxygen
apt purge -y doxygen
rm -rf /usr/bin/doxygen# 安装编译依赖
apt update
apt install -y build-essential cmake flex bison git# 下载最新源代码
cd /tmp
git clone https://github.com/doxygen/doxygen.git
cd doxygen# 创建构建目录
mkdir build
cd build# 配置编译
cmake -G "Unix Makefiles" ..
make -j$(nproc)
make install# 将新安装的 doxygen 链接到系统 PATH
ln -s /usr/local/bin/doxygen /usr/bin/doxygen# 验证链接
ls -l /usr/bin/doxygen# 检查版本
doxygen --version
# 应该显示 1.10.0 或更高

13. 安装libsystemd-devlibudev-dev

# 确保安装最新版本的 libsystemd-dev 和 libudev-dev
apt update
apt install -y libsystemd-dev libudev-dev# 验证包是否已安装
dpkg -l | grep -E "libsystemd-dev|libudev-dev"# 进入 pkgconfig 目录
cd /usr/lib/x86_64-linux-gnu/pkgconfig
# 为 systemd 创建符号链接
ln -s libsystemd.pc systemd.pc
# 为 udev 创建符号链接
ln -s libudev.pc udev.pc# 验证符号链接
ls -l systemd.pc
ls -l udev.pc# 返回构建目录
cd /workspace/Sunshine/build

14. 修改cmake文件

linux.cmake 文件内容:

# linux specific packaginginstall(DIRECTORY "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/assets/"DESTINATION "${SUNSHINE_ASSETS_DIR}")# copy assets (excluding shaders) to build directory, for running without install
file(COPY "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/assets/"DESTINATION "${CMAKE_BINARY_DIR}/assets"PATTERN "shaders" EXCLUDE)
# use symbolic link for shaders directory
file(CREATE_LINK "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/assets/shaders""${CMAKE_BINARY_DIR}/assets/shaders" COPY_ON_ERROR SYMBOLIC)if(${SUNSHINE_BUILD_APPIMAGE} OR ${SUNSHINE_BUILD_FLATPAK})install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/60-sunshine.rules"DESTINATION "${SUNSHINE_ASSETS_DIR}/udev/rules.d")install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.service"DESTINATION "${SUNSHINE_ASSETS_DIR}/systemd/user")
else()find_package(Systemd)find_package(Udev)if(UDEV_FOUND)# 修复1:确保DESTINATION路径存在if(NOT UDEV_RULES_INSTALL_DIR)set(UDEV_RULES_INSTALL_DIR "/lib/udev/rules.d")endif()install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/60-sunshine.rules"DESTINATION "${UDEV_RULES_INSTALL_DIR}")endif()if(SYSTEMD_FOUND)# 修复2:确保DESTINATION路径存在if(NOT SYSTEMD_USER_UNIT_INSTALL_DIR)set(SYSTEMD_USER_UNIT_INSTALL_DIR "/usr/lib/systemd/user")endif()install(FILES "${CMAKE_CURRENT_BINARY_DIR}/sunshine.service"DESTINATION "${SYSTEMD_USER_UNIT_INSTALL_DIR}")endif()
endif()# Post install
set(CPACK_DEBIAN_PACKAGE_CONTROL_EXTRA "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/postinst")
set(CPACK_RPM_POST_INSTALL_SCRIPT_FILE "${SUNSHINE_SOURCE_ASSETS_DIR}/linux/misc/postinst")# Apply setcap for RPM
# https://github.com/coreos/rpm-ostree/discussions/5036#discussioncomment-10291071
set(CPACK_RPM_USER_FILELIST "%caps(cap_sys_admin+p) ${SUNSHINE_EXECUTABLE_PATH}")# Dependencies
set(CPACK_DEB_COMPONENT_INSTALL ON)
set(CPACK_DEBIAN_PACKAGE_DEPENDS "\${CPACK_DEB_PLATFORM_PACKAGE_DEPENDS} \debianutils, \libcap2, \libcurl4, \libdrm2, \libgbm1, \libevdev2, \libnuma1, \libopus0, \libpulse0, \libva2, \libva-drm2, \libwayland-client0, \libx11-6, \miniupnpc, \openssl | libssl3")
set(CPACK_RPM_PACKAGE_REQUIRES "\${CPACK_RPM_PLATFORM_PACKAGE_REQUIRES} \libcap >= 2.22, \libcurl >= 7.0, \libdrm >= 2.4.97, \libevdev >= 1.5.6, \libopusenc >= 0.2.1, \libva >= 2.14.0, \libwayland-client >= 1.20.0, \libX11 >= 1.7.3.1, \mesa-libgbm >= 25.0.7, \miniupnpc >= 2.2.4, \numactl-libs >= 2.0.14, \openssl >= 3.0.2, \pulseaudio-libs >= 10.0, \which >= 2.21")if(NOT BOOST_USE_STATIC)set(CPACK_DEBIAN_PACKAGE_DEPENDS "\${CPACK_DEBIAN_PACKAGE_DEPENDS}, \libboost-filesystem${Boost_VERSION}, \libboost-locale${Boost_VERSION}, \libboost-log${Boost_VERSION}, \libboost-program-options${Boost_VERSION}")set(CPACK_RPM_PACKAGE_REQUIRES "\${CPACK_RPM_PACKAGE_REQUIRES}, \boost-filesystem >= ${Boost_VERSION}, \boost-locale >= ${Boost_VERSION}, \boost-log >= ${Boost_VERSION}, \boost-program-options >= ${Boost_VERSION}")
endif()# This should automatically figure out dependencies, doesn't work with the current config
set(CPACK_DEBIAN_PACKAGE_SHLIBDEPS OFF)# application icon
if(NOT ${SUNSHINE_BUILD_FLATPAK})install(FILES "${CMAKE_SOURCE_DIR}/sunshine.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps")
else()install(FILES "${CMAKE_SOURCE_DIR}/sunshine.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/apps"RENAME "${PROJECT_FQDN}.svg")
endif()# tray icon
if(${SUNSHINE_TRAY} STREQUAL 1)if(NOT ${SUNSHINE_BUILD_FLATPAK})install(FILES "${CMAKE_SOURCE_DIR}/sunshine.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status"RENAME "sunshine-tray.svg")install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/web/public/images/sunshine-playing.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status")install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/web/public/images/sunshine-pausing.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status")install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/web/public/images/sunshine-locked.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status")else()# flatpak icons must be prefixed with the app id or they will not be included in the flatpakinstall(FILES "${CMAKE_SOURCE_DIR}/sunshine.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status"RENAME "${PROJECT_FQDN}-tray.svg")install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/web/public/images/sunshine-playing.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status"RENAME "${PROJECT_FQDN}-playing.svg")install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/web/public/images/sunshine-pausing.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status"RENAME "${PROJECT_FQDN}-pausing.svg")install(FILES "${SUNSHINE_SOURCE_ASSETS_DIR}/common/assets/web/public/images/ssunshine-locked.svg"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/icons/hicolor/scalable/status"RENAME "${PROJECT_FQDN}-locked.svg")endif()set(CPACK_DEBIAN_PACKAGE_DEPENDS "\${CPACK_DEBIAN_PACKAGE_DEPENDS}, \libayatana-appindicator3-1, \libnotify4")set(CPACK_RPM_PACKAGE_REQUIRES "\${CPACK_RPM_PACKAGE_REQUIRES}, \libappindicator-gtk3 >= 12.10.0")
endif()# desktop file
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_FQDN}.desktop"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
if(NOT ${SUNSHINE_BUILD_APPIMAGE} AND NOT ${SUNSHINE_BUILD_FLATPAK})install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_FQDN}.terminal.desktop"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/applications")
endif()# metadata file
install(FILES "${CMAKE_CURRENT_BINARY_DIR}/${PROJECT_FQDN}.metainfo.xml"DESTINATION "${CMAKE_INSTALL_DATAROOTDIR}/metainfo")

修改“/workspace/Sunshine/cmake/packaging/linux.cmake”为上述内容。

15. 安装 libgbm-dev

# 更新软件源
apt-get update# 安装 Mesa 图形库开发文件
apt-get install -y libgbm-dev# 检查 gbm.h 文件是否存在
ls -l /usr/include/gbm.h# 检查软件包安装状态
dpkg -l libgbm-dev

16. 编译Sunshine并修复Font Awesome路径问题

至此,可以对Sunshine进行编译,但是编译到99%可能会出现错误,此时修复Font Awesome路径问题,即可完整编译。

首先,对Sunshine进行构建与编译。

cd /workspace/Sunshine
mkdir build && cd build
cmake ..
make -j$(nproc)

若出现以下错误,需要修复Font Awesome路径问题。

../../../../build/assets/web/assets/_plugin-vue_export-helper-5b94bc85.js   342.54 kB │ gzip: 117.99 kB
✓ built in 3.06s
[ 19%] Built target web-ui
[ 20%] Linking CXX static library ../../../lib/libgtest.a
[ 20%] Built target gtest
make: *** [Makefile:156: all] Error 2
root@29e64a32e260:/workspace/Sunshine/build#

运行以下代码修复Font Awesome路径问题。

# 创建目标目录
mkdir -p /workspace/Sunshine/third-party/doxyconfig/node_modules/@fortawesome/fontawesome-free/js/# 创建符号链接
ln -sf /workspace/Sunshine/node_modules/@fortawesome/fontawesome-free/js/all.min.js \/workspace/Sunshine/third-party/doxyconfig/node_modules/@fortawesome/fontawesome-free/js/all.min.js# 重新构建
make -j$(nproc)

此时,Sunshine应该可以完成编译:

../../../../build/assets/web/assets/_plugin-vue_export-helper-5b94bc85.js   342.54 kB │ gzip: 117.99 kB
✓ built in 4.92s
[100%] Built target web-ui
root@29e64a32e260:/workspace/Sunshine/build#

17. 打包Sunshine

cd /workspace/Sunshine/build
make package
cpack -G DEB

打包时间较长,请耐心等待,最终生成文件:

/workspace/Sunshine/build/cpack_artifacts/Sunshine.tar.Z

18. 在主机中安装Sunshine

首先,将打包后的文件复制到宿主机中,在宿主机中执行以下代码,可以在Desktop运行终端。

# 注意容器ID为29e64a32e260
docker cp 29e64a32e260:/workspace/Sunshine/build/cpack_artifacts/Sunshine.tar.Z ./
# 解压文件
uncompress Sunshine.tar.Z
tar -xf Sunshine.tar

解压后的文件中包含rules.d和usr,将其复制到特定位置,实现Sunshine的安装。

# 复制usr目录下的所有内容到系统的/usr目录
sudo cp -r usr/* /usr/# 复制rules.d目录下的所有内容到系统的/etc/udev/rules.d/目录
sudo cp -r rules.d/* /etc/udev/rules.d/

安装后,需要重新加载udev规则:

sudo udevadm control --reload-rules
sudo udevadm trigger

尝试运行Sunshine:

sunshine

至此,Sunshine编译安装完成。

0x03 构件

1. 所构建的Sunshine打包:https://download.csdn.net/download/u010160146/91967887

2. 构件Sunshine使用的Docker镜像:

        1. https://download.csdn.net/download/u010160146/91967986?spm=1001.2014.3001.5501

        2. https://download.csdn.net/download/u010160146/91967999?spm=1001.2014.3001.5501

        3. https://download.csdn.net/download/u010160146/91967998?spm=1001.2014.3001.5501

        4. https://download.csdn.net/download/u010160146/91967984?spm=1001.2014.3001.5501

0x04 后记

No Pains,No Gains.

0x05 参考

1. https://github.com/LizardByte/Sunshine/issues/3524[Ubuntu 24.10] Error while loading shared libraries: libminiupnpc.so.17: cannot open shared object file: No such file or directory #3524 https://github.com/LizardByte/Sunshine/issues/3524

2. Ubuntu 25.04 安装 Docker 与 Portainer 教程
https://blog.csdn.net/fpxnbl/article/details/150440828?fromshare=blogdetail&sharetype=blogdetail&sharerId=150440828&sharerefer=PC&sharesource=u010160146&sharefrom=from_link

http://www.dtcms.com/a/390512.html

相关文章:

  • WebRTC 如何实现的低延迟和高带宽利用率
  • Python接口自动化浅析unittest单元测试原理
  • 【附源码】基于SpringBoot的新能源汽车销售管理系统的设计与实现
  • 虚拟机Ubuntu挂载共享文件夹
  • JS实现房贷计算器和购物车页面
  • 【开题答辩全过程】以 Android安全网购平台为例,包含答辩的问题和答案
  • 期权市场反常信号是什么?
  • 【SpringBoot】26 核心功能 - Web开发原理 - Spring Boot 中定制 Servlet 容器
  • java spring boot 搭建项目
  • 【一文了解】闭包
  • 深入解析Mysql数据库并发:从读写机制到多版本控制
  • Python自学20 - Python操作PDF文件
  • Windows 本地 UV 环境部署 Index-TTS2 实战:基于 EPGF 架构的完整指南(支持 DeepSpeed + FP16)
  • 【cpp Trip第4站】函数参数传递
  • 【Spotfire】实现错行效果
  • 【Day 61】Linux-haproxy负载均衡
  • 搭建线上线下融合的商城小程序,关键步骤有哪些?
  • 软件测试教程资源合集
  • Proteus(8.17)SP2 仿真下载安装过程(附详细安装过程图)
  • 微软获评 2025 Gartner 云原生应用平台魔力象限 领导者
  • Java 生态监控体系实战:Prometheus+Grafana+SkyWalking 整合全指南(一)
  • 【学习】响应系统
  • Linux网络:socket网络套接字
  • 知识图谱对人工智能中自然语言处理的深层语义分析的影响与启示
  • 从车间到云端:Kepware如何加速IIoT落地
  • MyISAM 与 InnoDB 深度对比:如何正确选择 MySQL 存储引擎
  • 串口无线数传模块实现化工园区与3公里外水泵PLC无线通讯实现设备数据传输
  • rook-ceph自定义添加osd流程
  • 【需求导向】解读660页智慧教育大数据信息化顶层设计及智慧应用建设方案
  • InnoDB 引擎深潜指南---从逻辑结构到 MVCC 原理,带源码级案例与性能要点