前两日对群晖系统做了一次升级,以获取官方的一些安全补丁更新,结果升级完成后突然发现博客无法访问,初步排查是 wireguard 服务无法正常启动,看来升级真是一件有风险的事情,哪怕对于群晖这套的稳定的系统而言。
由于安装 wireguard 已经有一段时间,只记得当时从第三方插件源找了一个 wireguard 的 SPK 包,然后通过 terminal 做好配置并手动启动 wireguard 隧道。这次确有些不一样,再次进入后台执行 wg-quick up wg0 提示如下信息:
[#] ip link add wg0 type wireguard
RTNETLINK answers: Operation not supported
Unable to access interface: Protocol not supported
[#] ip link delete dev wg0
Cannot find device "wg0"
在套件中心也同时发现 WireGuard 组件无法正常启动,提示对不起,本套件不支持您的机型!
综合分析大概率是由于 wireguard 驱动无法加载导致,到这里算是知道了直接原因,但是好端端的为什么驱动加载就失败了呢?
难道是 DSM7.2 到 DSM7.3 升级了系统内核,经过查看系统 changelog 未见相关信息:https://www.synology.cn/zh-cn/releaseNote/DSM
带着问题继续分析,在查看 wireguard 驱动的过程中发现一个线索(https://github.com/gpopesc/wireguard-module-synology),群晖的 SPK 包是区分架构的,不同的架构对应一套硬件平台与操作系统,官方信息如下:https://kb.synology.com/en-global/DSM/tutorial/What_kind_of_CPU_does_my_NAS_have, 想想也对,群晖的具体型号如此之多,一旦涉及到驱动,绑定到平台与系统就是必然的。
接下来就是分析 wireguard 包具体的机制了,需要分析下其在加载驱动时具体在哪里出错了。借助万能的豆包,SPK 包在安装后会解压到 /var/package/xxxx 目录,在该目录下的 SPK 包遵循一定的规范,其中 script 目录下的 start-stop-status 是最终运行的入口。
关键代码如下:
kver=$(uname -r | sed 's/+//')
platform=$(get_key_value /etc.defaults/synoinfo.conf platform_name)
dsmver=$(get_key_value /etc.defaults/VERSION majorversion).$(get_key_value /etc.defaults/VERSION minorversion)
case "$kver" in
4.4.180 | 4.4.302 | 4.4.59 | 3.10.105 | 3.10.108)
driver_root="${SYNOPKG_PKGDEST}/modules/${platform}-${kver}"
;;
5.10.55)
driver_root="${SYNOPKG_PKGDEST}/modules/${platform}-${dsmver}-${kver}"
;;
*)
echo "kernel version not support"
;;
esac
//////////
if [ ! -d ${driver_root} ]; then
echo -e "对不起,本套件不支持您的机型!" | tee -a $SYNOPKG_TEMP_LOGFILE
exit 0
fi
在通过代码实锤后,进入 modules 目录将 geminilakenk-7.2-5.10.55 目录重新拷贝一份 geminilakenk-7.3-5.10.55 最终解决,reboot 系统后 wireguard 同样运行正常。
最后,这里也有疑问,为什么之前的驱动仅判断硬件平台以及内核版本,而到了 7.x 版本确要检验系统版本。罢了,对于一个第三方平台包(https://spk7.imnks.com/),用爱发电就无需多求了。
————— 20260105 —————
考虑到未来升级系统可能再次失效的问题,对代码做了微调,不再判断 DSM 版本号。
kver=$(uname -r | sed 's/+//')
platform=$(get_key_value /etc.defaults/synoinfo.conf platform_name)
dsmver=$(get_key_value /etc.defaults/VERSION majorversion).$(get_key_value /etc.defaults/VERSION minorversion)
case "$kver" in
4.4.180 | 4.4.302 | 4.4.59 | 3.10.105 | 3.10.108)
driver_root="${SYNOPKG_PKGDEST}/modules/${platform}-${kver}"
;;
5.10.55)
# driver_root="${SYNOPKG_PKGDEST}/modules/${platform}-${dsmver}-${kver}"
driver_root="${SYNOPKG_PKGDEST}/modules/${platform}-${kver}"
;;
*)
echo "kernel version not support"
;;
esac
最后修改于 2026-01-04