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,兼容性好。缺点嘛,就是贵,而且体积大。

我的建议: 如果只是数据采集和协议转换,树莓派够用;如果需要AI推理,上Jetson;如果要求7×24小时不间断运行,别犹豫,直接上工业PC。

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。装完后,我会做两件事:

  1. 禁用不必要的服务:snapd、cups、bluetooth、ModemManager,这些在工业现场基本用不上。
  2. 内核参数调优:针对实时性要求高的场景,我会调整内核参数。
# 禁用不必要的服务
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
注意: 内核参数调优要谨慎。我曾经在一台工控机上把swappiness设成了0,结果内存一满,OOM Killer直接把我的边缘应用杀了。后来我改成10,既保证性能,又留有余地。

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容器化要规范,镜像要精简,部署要可靠。

我个人觉得,边缘部署最考验的不是技术,而是对现场环境的理解。你想想看,一个在实验室跑得好好的应用,到了车间可能因为温度、震动、电源不稳就挂了。所以,多留一手,多做测试,多考虑异常情况。这才是工程师该有的态度。

下一章,咱们聊聊边缘节点上的数据采集与协议转换。到时候见。