OpenWrt 安装
OpenWrt 原生安装包目前仅随测试版(Beta)发布,源码来自 MSM 的 dev 分支。稳定版继续使用 main 分支和原有发布流程,不提供 OpenWrt 包。
将 MSM 直接安装到 OpenWrt 路由器时,使用 Beta 发布页的 msm 原生软件包 + luci-app-msm 插件。msm 包提供程序、UCI 配置和 procd 服务;LuCI 插件在「服务 → MSM」中提供启停配置、状态和 Web 控制台入口。
如果 MSM 运行在另一台服务器,只需要让 OpenWrt 接入它,请阅读 OpenWrt 路由与 DNS 配置。
选择包格式和架构
OpenWrt 24.10 及以前使用 opkg / .ipk;25.12 及以后使用 apk v3 / .apk。衍生固件以实际安装的包管理器为准。OpenWrt 官方安装说明
通过 SSH 在路由器上执行:
cat /etc/openwrt_release
if command -v apk >/dev/null 2>&1; then
apk --print-arch
else
opkg print-architecture
fi
df -h
free -m按包管理器返回的架构选择 msm 文件,不要仅凭 uname -m 猜测。尤其 ARM64 设备虽然都显示 aarch64,软件包架构仍可能不同。
| 硬件 | 软件包架构 | 对应程序 |
|---|---|---|
| Intel / AMD 64 位软路由 | x86_64 | Linux amd64,兼容基础 x86-64 指令集 |
| ARM64 路由器、开发板 | aarch64_generic、aarch64_cortex-a53、aarch64_cortex-a72 | Linux arm64 |
| ARMv7 设备 | arm_cortex-a7_neon-vfpv4、arm_cortex-a9_vfpv3-d16、arm_cortex-a9_neon、arm_cortex-a15_neon-vfpv4 | Linux armv7 |
| ARMv6 设备 | arm_arm1176jzf-s_vfp | Linux armv6 |
| LuCI 插件 | all | 所有受支持架构通用 |
没有匹配架构时,不要通过强制架构参数安装其他 CPU 的包。当前发布包不包含 MIPS 或 32 位 x86 版本。
程序使用静态 Go 构建,不依赖 glibc。安装后,数据库和下载的 DNS / 代理内核仍需要额外的持久化空间;小容量闪存设备可以先准备外接存储,再配置数据目录。
下载和校验
- 测试版更新与下载
- 全部发布记录(选择
beta-开头的版本) - 国内镜像:
https://msm.19930520.xyz/dl/beta/<发布标签>/。
在同一个发布版本中下载三个文件:一个匹配架构的 msm 包、一个同格式的 luci-app-msm 包和 SHA256SUMS。发布页的「OpenWrt 原生安装包」表列出了完整文件名。IPK 与 APK 不能混装;APK 是 OpenWrt 的软件包,与 Android 安装包无关。
例如,Beta 标签 beta-1.5.0 的 x86_64 包名是 msm_1.5.0_beta-r1_x86_64.ipk 或 msm-1.5.0_beta-r1_x86_64.apk,LuCI 包名是 luci-app-msm_1.5.0_beta-r3_all.ipk 或 luci-app-msm-1.5.0_beta-r3_all.apk。文件名使用 _beta,避免下载服务器改写特殊字符。IPK 内部版本仍为 1.5.0~beta-r1,APK 内部版本为 1.5.0_beta-r1,以遵循各包管理器的预发布版本排序;下载 URL 的目录仍使用原发布标签。主程序和 LuCI 插件的打包修订号可以不同(例如主程序 r1、界面 r3),请从同一 Beta 发布页配套下载。这里的版本号仅用于说明命名,请以发布页实际文件为准。
在路由器上创建一个空目录,例如 /tmp/msm-install,通过 SCP / SFTP 上传这三个文件。保留下载时的完整文件名,之后在该目录执行校验:
cd /tmp/msm-install
: > selected.sha256
for pkg in ./*.ipk ./*.apk; do
[ -f "$pkg" ] || continue
name="${pkg#./}"
awk -v name="$name" '$2 == name { print; found = 1 } END { if (!found) exit 1 }' SHA256SUMS >> selected.sha256 || exit 1
done
# 应当恰好找到两个包的校验记录,且两个文件都显示 OK。
test "$(wc -l < selected.sha256)" -eq 2 && sha256sum -c selected.sha256校验成功后,按实际包管理器安装。
opkg 固件(IPK)
cd /tmp/msm-install
opkg update
opkg install ./msm_*.ipk ./luci-app-msm_*.ipk也可以通过 LuCI 的「系统 → 软件包 → 上传软件包」先安装 msm,再安装 luci-app-msm。安装本地文件和查询架构的语法见 opkg 官方文档。
apk 固件(APK)
cd /tmp/msm-install
apk update
apk add --allow-untrusted ./msm-*.apk ./luci-app-msm-*.apk发布的 APK 是独立分发包,未使用 OpenWrt 官方软件源签名,因此在校验 SHA256 后用 --allow-untrusted 安装。这里的包使用 apk v3 格式,不能用于 Alpine 的旧版 apk v2。apk 官方文档
安装失败时先检查架构、剩余空间和固件软件源;不要跳过依赖检查。LuCI 插件需要固件提供的 LuCI 和 rpcd,依赖由包管理器解析安装。
启动和初始化
首次安装默认不启动 MSM。重新登录 LuCI,打开「服务 → MSM」:
- 确认 Web 端口,默认
7777。 - 确认数据目录,默认
/etc/msm。外接存储应先完成挂载;修改目录不会自动迁移原来的数据。 - 勾选启用,点击「保存并应用」。
- 点击「打开 MSM 控制台」,完成 首次使用 中的管理员初始化。
也可以通过 SSH 启动:
uci set msm.main.enabled='1'
uci set msm.main.port='7777'
uci commit msm
/etc/init.d/msm enable
/etc/init.d/msm restart默认 Web 地址是 http://<路由器-LAN-IP>:7777。安装本身不会抢占 DNS 端口 53。 从 Beta 主程序包 r2 起,启动 MSM 托管的 DNS / 代理内核时,会按实际配置检查 TCP / UDP 监听地址和端口。
如果托管服务需要监听 53,MSM 会严格核实占用者是否为 OpenWrt 系统 dnsmasq。核实通过后,先保存原端口设置,再临时将对应 dnsmasq 实例的 DNS 端口设为 0,保留 DHCP 服务。最后一个接管服务停止后会恢复原设置;接管后启动失败也会回滚,仍有其他接管服务运行时则保留接管。接管期间用户自行修改的端口设置不会被覆盖。
其他端口发生冲突时,会显示协议、监听地址和能够识别的占用进程,MSM 不会自动终止占用服务。也可以自行选用空闲端口(例如 1053),再配置 dnsmasq 转发或其他接入方式;这是可选部署方式。
如果 MSM 就运行在这台 OpenWrt 上,不要照抄「MSM 位于另一台主机」的网关静态路由示例;按实际部署配置本机服务。
LuCI 服务面板
在「服务 → MSM」中可以查看运行状态、服务版本、连续运行时间、内存占用与数据分区剩余空间,并直接打开 MSM 控制台。
- 基础设置:配置服务启用状态、控制台端口与持久化数据目录;保存并应用只提交 MSM 的配置。
- 服务操作:启动、停止或重启当前 MSM 进程。停止不会修改开机启动设置;尚未启用时,请先启用并保存。
- 运行日志:读取最近的服务日志(最多 200 行、32 KiB),按级别筛选、搜索关键词或下载日志文件。
更换数据目录不会自动搬迁原有文件。请先准备目标存储与数据,再保存新的路径。DNS 内核、规则和订阅仍在 MSM 控制台中管理。
服务管理和排错
OpenWrt 原生包统一使用 procd 管理:
# 状态、重启、停止
/etc/init.d/msm status
/etc/init.d/msm restart
/etc/init.d/msm stop
# 配置和系统日志
uci show msm
logread -e msm
# procd 进程信息
ubus call service list '{"name":"msm"}'要持久停用,在 LuCI 取消启用并保存,或执行:
uci set msm.main.enabled='0'
uci commit msm
/etc/init.d/msm stop
/etc/init.d/msm disable首次创建默认数据目录时,程序日志放在 /tmp/msm/logs,以减少闪存写入;重启设备后这些日志会清空。配置和数据库仍保存在数据目录中。
出现 Web 页面无法访问时,检查服务状态、配置端口是否被占用,以及实际 LAN 地址。修改数据目录后无法启动时,检查目录是否为绝对路径、存储是否已挂载且可写。LuCI 菜单未出现时,重新登录 LuCI 并确认 luci-app-msm 安装成功。
异常退出后系统 DNS 尚未恢复时,先停止 MSM 及其托管的 DNS / 代理服务,再执行恢复命令。自定义数据目录请将 /etc/msm 替换为实际目录:
/etc/init.d/msm stop
msm service recover-dns -c /etc/msm --wait 40s恢复命令会检查托管进程和 DNS 端口;托管进程仍在运行或其他 DNS 服务占用端口时会报错,不会强行覆盖监听。
更新、备份和卸载
更新前,在 MSM 的 备份恢复 页面导出配置,也可以在停服后复制整个数据目录。下载同一 Beta 版本的新 msm 与 luci-app-msm 包,校验后,在包所在目录执行对应更新命令:
# opkg 固件
/etc/init.d/msm stop && opkg install ./msm_*.ipk ./luci-app-msm_*.ipk
# apk 固件(二选一,按实际包管理器执行)
/etc/init.d/msm stop && apk add --allow-untrusted ./msm-*.apk ./luci-app-msm-*.apk更新和卸载都必须先停服成功,再通过 && 执行包操作。 停服脚本会读取 UCI 中的数据目录并恢复 DNS,无需为自定义目录改写上述命令。APK 即使遇到恢复钩子失败,也可能继续替换或删除程序,不能依赖钩子阻止包操作。若停止失败,请先解决冲突或使用上文的 recover-dns 命令恢复,不要继续更新或卸载。
升级保留 UCI 配置和应用数据;原先启用的服务在升级后恢复运行。
OpenWrt 软件包安装的 MSM 应通过 opkg / apk 更新,不要再用通用 Linux 安装脚本覆盖程序和服务文件。
卸载命令:
# opkg 固件
/etc/init.d/msm stop && opkg remove luci-app-msm msm
# apk 固件(二选一,按实际包管理器执行)
/etc/init.d/msm stop && apk del luci-app-msm msm卸载前的停止过程会恢复接管前的 dnsmasq DNS 端口;配置、应用数据和未完成恢复的接管状态会保留,但不能保证包操作失败后程序仍然存在。固件重刷、恢复出厂设置或外接存储变更前,应另外保存备份;自定义数据目录需要自行纳入固件升级备份。