投稿来自 MeshCN 社区读者 YE2F4。谢谢作者把这次 Ubuntu / WSL2 / Docker 的完整踩坑过程整理出来。MeshCN 在尽量保留原文语气的基础上,仅做了标题层级、代码块、图片说明和少量技术注释整理。

写在前面
在《5 分钟让 MeshSense 跑起来:Docker Compose 一键部署全攻略》里,我们写过:
把 MeshSense 常驻在一台服务器上,随时用浏览器查看 Meshtastic 网络拓扑、收发与信号质量,听起来是个很简单的事情。但现实里,端口占用、镜像架构不匹配、
ACCESS_KEY放哪儿、数据目录怎么弄,这些细节很容易把一次简单部署拖成一整晚的折腾。你不需要先成为 Docker 专家,也不必为环境差异焦虑——跟着 深圳南山-jinsu 写的步骤完成安装、启动,最终在
http://<主机IP>:5920登录即可。

如果你也认为这样做是一件轻松的事情,那么不妨来看看我与 Ubuntu 斗智斗勇的——欢(技)乐(术)故(事)事(故)。
前言
本文作为一篇教程,详细记录了我在部署 MeshSense 时踩过的各种坑,旨在帮助更多用户简单、便捷、一遍成功地完成部署。

一、系统配置
| 项目 | 配置 |
|---|---|
| CPU | i5-10210U |
| 运行内存 | 8GB LPDDR4 |
| 存储 | 1TB SSD + 9TB HDD |
| 操作系统 | Windows 10 22H2 |
| Linux 环境 | WSL2 - Ubuntu 24.04(已更换清华源) |
二、暴风雨前的宁静
准备好后,二话不说直接开整。(请看 VCR)
1.1 安装 Docker 和 Docker Compose
Linux(Ubuntu/Debian):
sudo apt-get update
sudo apt-get install -y docker.io docker-compose
sudo systemctl enable --now docker

翻译:系统未使用 systemd 作为初始化系统(PID 1)启动。无法操作。
连接总线失败:主机已关闭。
简单地说,就是——我的上司不是这个人!
噔、噔、咚!什么情况?堂堂一个大 Ubuntu 竟然没有 systemd?可笑!看我来搞定!
编者注:WSL2 里的 systemd这类报错通常不是 Ubuntu 没装 systemd,而是当前环境没有把 systemd 作为 PID 1 启动。Windows + WSL2 用户如果想省心运行 Docker,通常有三条路线:使用 Docker Desktop 的 WSL 集成、启用 WSL 的 systemd 支持,或者像本文后面这样改用
service docker start启动 Docker 服务。本文保留作者的完整踩坑过程,方便遇到同类报错的读者对照排查。
三、与 systemctl 的抗衡
Round One:安……安上了?
气得我立马 apt:
apt install systemd -y

什么?已经有了?
一定是我打开方式不正确。
apt install systemctl -y
嘿,您猜怎么着?

少依赖!
apt install systemd-sysv -y
本以为这次可以万事大吉了,结果……

安……安上了?
Round Two:铁拳出击!
三次受挫,气得我直接上狠活——aptitude。
aptitude 是一个用于管理 Debian GNU/Linux 系统及其衍生版的 APT 包管理工具。它提供了命令行和全屏文本界面两种操作模式,主要功能包括软件包安装、升级和卸载,并能自动处理依赖关系。
aptitude install systemctl -y
(Tips:记住红圈里的那个,一会儿会考。)

Emm……这次看起来好多了!
再来!
systemctl enable --now docker
不是,哥们,你……

算了,跳过!
四、焊死的窗户
上帝为你关上一扇门的同时,会为你打开一扇窗。
——《The Bible》
1.2 验证安装
docker --version
docker-compose --version

成果喜人!
2.1 新建项目目录
mkdir meshsense-project
cd meshsense-project
2.2 编写 docker-compose.yml
使用以下内容创建文件,复制到项目目录:

高端的代码,往往只需要简单的编辑工具。
3. 配置修改(可选)
由于只是临时测试,所以很多部分没有修改。自己掂量着来。
4.1 启动容器
docker-compose up -d
-d 表示后台运行。
上帝为你关上一扇门的同时,会为你焊死那扇为你打开的窗。
——《The Bubble》
docker.errors.DockerException: Error while fetching server API version: ('Connection aborted.', FileNotFoundError(2, 'No such file or directory'))
翻译:获取服务器 API 版本时出错:连接中止,没有此类文件或目录。
上网查找才知道,这是因为 Docker 没有启动。
但是,网上给出的启动方法是:
systemctl start docker
可是别忘了,与 systemctl 的战争还未结束!
五、再一次出发
既然显示已安装,那就卸载重装大法!
apt remove systemctl

好好好,现在又说我未安装?我倒要看看你是不是在跟我躲猫猫。
systemctl --version

很明显,systemctl 命令可以使用,而且也正确安装了 systemd,只不过它没有运行罢了。
无妨,启动一下即可。
六、systemctl,启动!
先看看掌管你系统的上司是谁:
ps -p 1 -o comm=

是 init。
都 6025 年了,这种原始的启动方式怎么还会出现在 24.04 上?
更新一下配置看看?
sudo update-initramfs -u
事实证明,然并卵。
但是,更新完以后还是有一些变化。
还记得那扇焊死的窗吗?它变成了:
docker.errors.DockerException: error while fetching server API version: ('connection aborted.', connectionrefusederror(111, 'connection refused'))
翻译:获取服务器 API 版本时出错:连接中止,连接被拒绝。
这就像是窗户上泼了 502,再加几把挂锁。

气得我呀:
apt remove systemctl
apt remove systemd
apt remove systemd-sysv
aptitude remove systemctl
aptitude remove systemd
aptitude remove systemd-sysv
嘿,您再猜猜怎么着?

正事不干,安一堆 NTP,真是服了。

七、退一步海阔天空
为什么不能就着它的意愿来呢?
既然上司是 init,那么为什么不用属于它的命令呢?
systemctl 有自己的命令,init 也有!
service
再次尝试启动 Docker:
service start docker

吔!淦!怎么回事?
(此处省略 35 次重复操作……)
后来查资料得知,正确的命令格式是:
service docker start
输入,然后:
Enter!
八、上帝啊,以后用劲小一点!

哈哈!成啦!
(此时的天堂)

(你猜他为啥看你?)
因为你高兴得太早了!

你努力地挖坑,想从地下逃离困住你的地方。
上帝用大石头重重地把你刚挖好的坑堵上了。
——《The Bundle》
但是,他没有注意到,这一下把门锁震掉了。
经过不懈的摸索和努力,终于找到了解决办法:
touch /etc/fstab
update-alternatives --set iptables /usr/sbin/iptables-legacy
update-alternatives --set ip6tables /usr/sbin/ip6tables-legacy
执行,再试一次。

What can I say?

九、胜利,就在眼前
(踹门,踹门,踹门!)
4.1 启动容器
docker-compose up -d
-d 表示后台运行。

别看这幅图简单,这可是靠运气和耐心的。建议准备科学与魔法。
最后,见证时刻的奇迹!
docker-compose ps
docker logs meshsense
(门开了!)

我滴任务,完~成~辣~!Hiahiahia……
写在最后
在《折腾太阳能节点的奇妙旅程》里,我们曾经写过:
相信对他来说,DIY 虽然累,但能看着自己的设备稳稳运行,那种成就感是无可替代的。他的故事是 Meshtastic DIY 的一个缩影,它告诉我们:DIY 不仅仅是动手实践,更是一场充满未知的冒险。虽然可能会遇到各种问题,但只要坚持下去,总能找到解决的办法。
虽然经历了很多挫折,情绪几近崩溃,完成时也已经很晚了,但是看着屏幕上跳动的数据,我还是感到无比欣慰。
有志者事竟成,破釜沉舟,百二秦关终属楚。
苦心人天不负,卧薪尝胆,三千越甲可吞吴。
码海沉浮志未销,孤灯夜战,三千日夜终破局。
系统鏖兵心犹烈,百策苦研,九九难关自通途。
希望社区的广大网友也能不畏艰难,一往无前,迎风而上,勇攀高峰!

Ps:终于看见 1RHJ 了!
吐槽:OpenStreetMap 为什么总是加载不出来呢……
本文作者: YE2F4 | 社区读者投稿
本文链接: https://meshcn.net/meshsense-ubuntu-wsl-docker-deployment-troubleshooting/