4. 边缘节点部署:硬件选型、操作系统裁剪与Docker容器化
好,咱们进入第四章。这一章我打算聊聊边缘节点的部署。说实话,这是整个流程自动化项目里最「接地气」的部分。你想想看,再好的算法、再漂亮的架构,最后都得落到一个能扛得住现场灰尘、高温、震动的小盒子上。
我个人习惯把边缘节点部署拆成三个步骤:选硬件 → 裁系统 → 装容器。每一步都有坑,咱们一个一个说。
4.1 硬件选型:三种主流方案怎么选?
先聊硬件。我这些年经手过的项目,边缘硬件基本就三类:树莓派、NVIDIA Jetson、工业PC。它们各有各的脾气。
| 维度 | 树莓派 4B/5 | NVIDIA Jetson Nano/Orin | 工业PC(如研华、西门子) |
|---|---|---|---|
| CPU | ARM Cortex-A72 | ARM + GPU(CUDA核心) | x86(赛扬/酷睿/至强) |
| AI算力 | 无(可外接TPU) | 0.5~275 TOPS | 依赖独立显卡 |
| 功耗 | 5~15W | 10~60W | 30~200W |
| 工作温度 | 0~50°C | -25~80°C(工业版) | -20~70°C |
| 典型价格 | 300~800元 | 1000~15000元 | 3000~20000元 |
| 适用场景 | 原型验证、数据采集 | 视觉检测、AI推理 | 高可靠、多协议、实时控制 |
树莓派:我最早做边缘原型时就用它。便宜、社区资源多,但说实话,别指望它跑复杂的视觉模型。有一次我在现场用树莓派做Modbus TCP数据采集,夏天车间温度一上来,SD卡直接挂了。后来我学乖了,要么用工业级SD卡,要么直接上SSD启动。
NVIDIA Jetson:如果你要做AI推理,比如产品外观检测、缺陷识别,Jetson系列是首选。我去年帮一个客户做PCB焊点检测,用的就是Jetson Orin NX。16TOPS的算力,跑一个轻量级YOLOv8,帧率能到30fps。嗯,这里要注意:Jetson的散热是个大问题,一定要配主动散热。
工业PC:这是最「稳」的选择。我见过不少工厂,PLC上位机、SCADA系统、边缘网关全跑在一台工控机上。优点是接口丰富(串口、CAN、DIO),支持Windows或Linux,兼容性好。缺点嘛,就是贵,而且体积大。
4.2 操作系统裁剪:别让系统吃掉你的资源
硬件选好了,接下来装系统。很多人图省事,直接装个Ubuntu Desktop。我一开始也这么干,结果发现系统启动就要占2GB内存,CPU动不动就飙到30%。你想想看,边缘设备总共才4GB内存,留给应用的空间还有多少?
所以,操作系统必须裁剪。说白了,就是去掉一切不需要的东西。
4.2.1 树莓派:Raspberry Pi OS Lite
别装桌面版,装Lite版。只有命令行,没有GUI。我一般这样操作:
# 下载镜像
wget https://downloads.raspberrypi.org/raspios_lite_arm64_latest
# 写入SD卡
sudo dd if=2024-10-22-raspios-bookworm-arm64-lite.img of=/dev/sdb bs=4M status=progress
# 启用SSH
touch /boot/ssh
# 配置WiFi(可选)
cat >> /boot/wpa_supplicant.conf <<EOF
country=CN
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="你的WiFi名"
psk="你的密码"
}
EOF
装完后,我还会关掉蓝牙、WiFi(如果用有线)、还有avahi-daemon这些用不上的服务。能省一点是一点。
4.2.2 Jetson:JetPack + 最小化安装
Jetson官方推荐JetPack SDK。但注意,JetPack默认会装很多示例和工具。我建议只选必要的组件:
- L4T(Linux for Tegra)内核
- CUDA + cuDNN(跑AI必须)
- TensorRT(推理优化)
- 多媒体API(如果做视频处理)
其他的,比如OpenCV示例、Python示例包,统统不装。我曾经帮客户排查一个Jetson设备,发现系统里装了3个版本的OpenCV,占了几百MB空间。你说这何必呢?
4.2.3 工业PC:Ubuntu Server + 内核裁剪
工业PC我一般装Ubuntu Server 22.04 LTS。装完后,我会做两件事:
- 禁用不必要的服务:snapd、cups、bluetooth、ModemManager,这些在工业现场基本用不上。
- 内核参数调优:针对实时性要求高的场景,我会调整内核参数。
# 禁用不必要的服务
sudo systemctl disable snapd.service
sudo systemctl disable cups.service
sudo systemctl disable bluetooth.service
# 内核参数调优(实时性)
cat >> /etc/sysctl.conf <<EOF
# 减少网络延迟
net.core.rmem_default = 262144
net.core.wmem_default = 262144
# 提高文件句柄限制
fs.file-max = 100000
EOF
sudo sysctl -p
4.3 Docker容器化部署:让应用「一次构建,到处运行」
系统裁好了,接下来部署应用。我强烈建议用Docker。为什么?因为现场环境太复杂了。你在一台设备上调试好的Python环境,换一台设备可能就缺个库、版本不对。Docker把应用和依赖打包在一起,到哪都能跑。
4.3.1 安装Docker
树莓派和Jetson都是ARM架构,安装脚本略有不同:
# 树莓派 / Jetson(ARM64)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
# 工业PC(x86_64)
sudo apt update
sudo apt install docker.io docker-compose-v2
sudo systemctl enable docker
sudo systemctl start docker
装完后,记得把当前用户加入docker组,不然每次都要sudo:
sudo usermod -aG docker $USER
# 退出重新登录生效
4.3.2 编写Dockerfile
我以一个典型的边缘数据采集应用为例。这个应用需要读取Modbus设备数据,然后通过MQTT上报到云端。
# 使用轻量级基础镜像
FROM python:3.11-slim-bookworm
# 设置工作目录
WORKDIR /app
# 安装系统依赖(最小化)
RUN apt-get update && apt-get install -y --no-install-recommends \
libmodbus-dev \
&& rm -rf /var/lib/apt/lists/*
# 复制依赖文件
COPY requirements.txt .
# 安装Python依赖
RUN pip install --no-cache-dir -r requirements.txt
# 复制应用代码
COPY . .
# 运行入口
CMD ["python", "main.py"]
这里有个小技巧:--no-install-recommends 和 --no-cache-dir 能大幅减小镜像体积。我见过有人一个镜像2GB,精简后只有300MB。你想想看,边缘设备存储本来就有限,能省则省。
4.3.3 使用Docker Compose管理多容器
实际项目中,边缘节点往往不止一个服务。比如数据采集、AI推理、本地数据库、MQTT Broker。这时候用Docker Compose就方便了。
version: '3.8'
services:
# MQTT Broker
mqtt:
image: eclipse-mosquitto:2.0
ports:
- "1883:1883"
- "9001:9001"
volumes:
- ./mosquitto/config:/mosquitto/config
- ./mosquitto/data:/mosquitto/data
restart: unless-stopped
# 数据采集服务
collector:
build: ./collector
depends_on:
- mqtt
environment:
- MQTT_BROKER=mqtt://mqtt:1883
- MODBUS_DEVICE=/dev/ttyUSB0
devices:
- /dev/ttyUSB0:/dev/ttyUSB0
restart: unless-stopped
# AI推理服务
inference:
build: ./inference
depends_on:
- mqtt
environment:
- MQTT_BROKER=mqtt://mqtt:1883
- MODEL_PATH=/models/yolov8n.engine
volumes:
- ./models:/models
runtime: nvidia # Jetson专用
restart: unless-stopped
restart: unless-stopped:容器挂了自动重启,适合无人值守场景。devices:映射串口设备到容器内。runtime: nvidia:Jetson上必须加这个,才能调用GPU。
4.3.4 部署与验证
最后,把整个项目传到边缘设备上,执行:
# 构建并启动所有服务
docker compose up -d
# 查看日志
docker compose logs -f collector
# 检查容器状态
docker compose ps
嗯,这里有个坑。我曾经在Jetson上部署时,发现容器启动后CPU占用率一直100%。排查了半天,发现是nvidia-container-runtime没装。解决方案很简单:
sudo apt install nvidia-container-runtime
sudo systemctl restart docker
4.4 小结
这一章咱们聊了边缘节点部署的三个核心环节。硬件选型要看场景,别盲目追求高性能;操作系统要裁剪,别让无关服务浪费资源;Docker容器化要规范,镜像要精简,部署要可靠。
我个人觉得,边缘部署最考验的不是技术,而是对现场环境的理解。你想想看,一个在实验室跑得好好的应用,到了车间可能因为温度、震动、电源不稳就挂了。所以,多留一手,多做测试,多考虑异常情况。这才是工程师该有的态度。
下一章,咱们聊聊边缘节点上的数据采集与协议转换。到时候见。