工业一体机Linux系统部署实战:驱动安装、环境配置到应用上线的完整流程

发布时间:2026/7/24 12:17:17
工业一体机Linux系统部署实战:驱动安装、环境配置到应用上线的完整流程 工业一体机是面向工业现场应用的集成化计算终端搭载处理器、显示屏及工业通信接口RS-232/485、CAN、GPIO等能在宽温、高粉尘和强电磁干扰环境下长期稳定运行。在数据采集、设备监控和边缘计算场景中Linux系统因其稳定性和开源性成为工业一体机的常用操作系统选择。本文记录笔者在实际项目中为一台ARM架构工业一体机RK3568平台部署Ubuntu 20.04系统的完整过程涵盖系统烧录、串口驱动配置、GPIO开发环境搭建和应用部署供有同样需求的开发者参考。## 一、系统烧录与基础配置### 1.1 烧录环境准备# 工具准备- 烧录工具rkdeveloptoolLinux烧录或 AndroidToolWindows烧录- 镜像文件Ubuntu 20.04 for RK3568厂家提供或社区构建- USB数据线Type-C### 1.2 进入Loader模式RK3568平台进入Maskrom/Loader模式的操作1. 断开电源按住主板上的MASKROM按键2. 连接USB数据线至PC3. 设备管理器中识别到USB设备后松开按键bash# Linux下确认设备连接lsusb | grep 2207# 预期输出Bus 001 Device 004: ID 2207:350a Fuzhou Rockchip Electronics Co., Ltd### 1.3 烧录系统镜像bash# 使用rkdeveloptool烧录sudo rkdeveloptool ld # 确认设备连接sudo rkdeveloptool db MiniLoaderAll.bin # 下载Loader# 分区烧录sudo rkdeveloptool wl 0x40 idbloader.imgsudo rkdeveloptool wl 0x4000 uboot.imgsudo rkdeveloptool wl 0x8000 boot.imgsudo rkdeveloptool wl 0x40000 rootfs.img# 重启设备sudo rkdeveloptool rd### 1.4 首次启动配置bash# 串口连接波特率115200sudo minicom -D /dev/ttyUSB0 -b 115200# 设置静态IP避免DHCP分配不稳定sudo nano /etc/netplan/01-netcfg.yamlyamlnetwork:version: 2ethernets:eth0:addresses:- 192.168.1.100/24gateway4: 192.168.1.1nameservers:addresses: [8.8.8.8, 114.114.114.114]bashsudo netplan apply## 二、串口驱动配置工业一体机通常配置多路RS-232/485串口RK3568平台的串口设备节点在/dev/ttyS*下。### 2.1 确认串口设备bash# 查看所有串口设备ls -l /dev/ttyS*# 输出示例# crw-rw---- 1 root dialout 4, 64 ttyS0 (调试串口)# crw-rw---- 1 root dialout 4, 65 ttyS1 (COM1 - RS-232)# crw-rw---- 1 root dialout 4, 66 ttyS2 (COM2 - RS-232)# crw-rw---- 1 root dialout 4, 67 ttyS3 (COM3 - RS-485)# crw-rw---- 1 root dialout 4, 68 ttyS4 (COM4 - RS-485)### 2.2 串口权限配置bash# 将当前用户加入dialout组sudo usermod -aG dialout $USER# 或直接设置udev规则推荐重启后仍生效sudo nano /etc/udev/rules.d/99-serial.rules# /etc/udev/rules.d/99-serial.rulesKERNELttyS[0-9]*, SUBSYSTEMtty, MODE0666KERNELttyUSB[0-9]*, SUBSYSTEMtty-usb, MODE0666bash# 重新加载udev规则sudo udevadm control --reload-rulessudo udevadm trigger### 2.3 串口参数配置bash# 安装stty工具sudo apt install setserial# 查看串口当前配置stty -F /dev/ttyS1 -a# 设置串口参数9600 8N1stty -F /dev/ttyS1 9600 cs8 -cstopb -parenb -ixon -ixoff# RS-485方向控制如果硬件支持RTS自动切换# 设置RTS延时为0启用自动方向控制sudo setserial /dev/ttyS3 port 0xfe620000 irq 63 baud_base 9600### 2.4 串口通信测试python#!/usr/bin/env python3# serial_test.py - 串口通信测试脚本import serialimport timedef test_rs232():RS-232收发测试ser serial.Serial(port/dev/ttyS1,baudrate9600,bytesizeserial.EIGHTBITS,parityserial.PARITY_NONE,stopbitsserial.STOPBITS_ONE,timeout1)if ser.is_open:print(f[INFO] 串口 {ser.port} 已打开)# 发送测试数据test_data b\x01\x03\x00\x00\x00\x0A\xC5\xCD # Modbus RTU请求帧ser.write(test_data)print(f[TX] 发送: {test_data.hex()})# 接收响应time.sleep(0.1)response ser.read(64)if response:print(f[RX] 接收: {response.hex()})else:print([WARN] 无响应检查接线和波特率)ser.close()if __name__ __main__:test_rs232()## 三、GPIO开发环境搭建### 3.1 确认GPIO编号RK3568平台的GPIO通过sysfs接口访问首先需要确认引脚编号。bash# 查看GPIO控制器ls /sys/class/gpio/# gpiochip0 gpiochip1 gpiochip2 gpiochip3 gpiochip4# 查看各控制器基准编号cat /sys/class/gpio/gpiochip*/base# 0 32 64 96 128### 3.2 GPIO控制脚本bash#!/bin/bash# gpio_ctrl.sh - GPIO控制脚本GPIO_NUM48 # 根据实际引脚计算base offset# 导出GPIOecho $GPIO_NUM /sys/class/gpio/export# 设置为输出方向echo out /sys/class/gpio/gpio$GPIO_NUM/direction# 设置高电平继电器闭合echo 1 /sys/class/gpio/gpio$GPIO_NUM/value# 设置低电平继电器断开echo 0 /sys/class/gpio/gpio$GPIO_NUM/value# 释放GPIOecho $GPIO_NUM /sys/class/gpio/unexport### 3.3 Python GPIO库封装python#!/usr/bin/env python3# gpio_manager.py - GPIO管理类import osimport timeclass GPIOPin:def __init__(self, gpio_num):self.gpio_num gpio_numself.gpio_path f/sys/class/gpio/gpio{gpio_num}def export(self):if not os.path.exists(self.gpio_path):with open(/sys/class/gpio/export, w) as f:f.write(str(self.gpio_num))time.sleep(0.1) # 等待sysfs创建完成def set_direction(self, direction):设置方向in 或 outwith open(f{self.gpio_path}/direction, w) as f:f.write(direction)def set_value(self, value):设置电平0或1with open(f{self.gpio_path}/value, w) as f:f.write(str(value))def get_value(self):读取电平with open(f{self.gpio_path}/value, r) as f:return int(f.read().strip())def unexport(self):if os.path.exists(self.gpio_path):with open(/sys/class/gpio/unexport, w) as f:f.write(str(self.gpio_num))# 使用示例if __name__ __main__:relay GPIOPin(48)relay.export()relay.set_direction(out)# 控制继电器闭合2秒后断开relay.set_value(1)print(继电器闭合)time.sleep(2)relay.set_value(0)print(继电器断开)relay.unexport()## 四、Docker应用部署### 4.1 安装Dockerbash# 添加Docker官方源ARM64sudo apt updatesudo apt install -y ca-certificates curl gnupg lsb-releasesudo mkdir -p /etc/apt/keyringscurl -fsSL https://download.docker.com/linux/ubuntu/gpg | \sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpgecho deb [archarm64 signed-by/etc/apt/keyrings/docker.gpg] \https://download.docker.com/linux/ubuntu focal stable | \sudo tee /etc/apt/sources.list.d/docker.listsudo apt updatesudo apt install -y docker-ce docker-ce-cli containerd.io# 将当前用户加入docker组sudo usermod -aG docker $USER### 4.2 部署Node-RED工业数据采集平台bash# 创建数据持久化目录mkdir -p /opt/nodered/data# 部署Node-RED容器docker run -d \--name nodered \--restartalways \--privileged \--device/dev/ttyS1:/dev/ttyS1 \--device/dev/ttyS3:/dev/ttyS3 \-p 1880:1880 \-v /opt/nodered/data:/data \-v /sys/class/gpio:/sys/class/gpio \nodered/node-red:latest# 确认容器运行状态docker ps | grep nodered### 4.3 开机自启配置bash# 创建systemd服务sudo tee /etc/systemd/system/industrial-app.service EOF[Unit]DescriptionIndustrial Data Collection AppAfterdocker.serviceRequiresdocker.service[Service]TypeoneshotExecStart/usr/bin/docker start noderedExecStop/usr/bin/docker stop noderedRemainAfterExityes[Install]WantedBymulti-user.targetEOFsudo systemctl daemon-reloadsudo systemctl enable industrial-app.service## 五、性能优化与稳定性加固### 5.1 看门狗配置bash# 确认硬件看门狗设备ls /dev/watchdog*# 配置内核看门狗60秒超时echo 60 | sudo tee /sys/class/watchdog/watchdog0/timeoutecho 1 | sudo tee /sys/class/watchdog/watchdog0/enable# 安装看门狗守护进程sudo apt install watchdogsudo nano /etc/watchdog.conf# /etc/watchdog.confwatchdog-device /dev/watchdogtimeout 60interval 10max-load-1 24bashsudo systemctl enable watchdogsudo systemctl start watchdog### 5.2 日志轮转配置bash# 防止日志写满存储sudo nano /etc/logrotate.d/industrial-app/opt/nodered/data/logs/*.log {dailyrotate 7compressdelaycompressmissingoknotifemptycreate 0644 root root}### 5.3 系统资源监控| 监控项 | 命令 | 告警阈值 ||--------|------|---------|| CPU温度 | cat /sys/class/thermal/thermal_zone0/temp | 7500075℃ || CPU使用率 | top -bn1 \| grep Cpu(s) | 85% || 内存使用率 | free -m \| awk /Mem/{print $3/$2*100} | 85% || 磁盘使用率 | df -h / | 90% || 串口丢包率 | 自定义脚本统计 | 0.1% |## 六、部署验证清单bash#!/bin/bash# deploy_check.sh - 部署验证脚本echo 工业一体机部署验证 # 1. 系统信息echo [1] 系统版本:uname -a# 2. 串口设备检查echo [2] 串口设备:ls /dev/ttyS* 2/dev/null || echo ERROR: 未找到串口设备# 3. GPIO可用性echo [3] GPIO控制器:ls /sys/class/gpio/gpiochip*/ 2/dev/null | head -5 || echo ERROR: GPIO不可用# 4. Docker服务状态echo [4] Docker状态:systemctl is-active docker# 5. 看门狗状态echo [5] 看门狗:systemctl is-active watchdog# 6. CPU温度echo [6] CPU温度:temp$(cat /sys/class/thermal/thermal_zone0/temp 2/dev/null)if [ -n $temp ]; thenecho $((temp/1000))°Celseecho ERROR: 无法读取温度fi# 7. 网络连通性echo [7] 网络连通:ping -c 1 -W 2 192.168.1.1 /dev/null 21 echo OK || echo FAILecho 验证完成 ## 常见问题FAQ**QRK3568平台串口通信出现偶发性数据丢失如何排查**A首先用 stty -F /dev/ttyS* -a 确认波特率、数据位、停止位配置是否与对端设备一致。其次检查串口是否为独立控制器dmesg | grep ttyS查看中断号是否不同。如果是共享中断的扩展方案多设备同时通信时确实可能丢包需要在应用层加超时重传和CRC校验。最后用 cat /proc/interrupts | grep tty 查看串口中断计数是否异常增长。**QDocker容器内无法访问串口设备怎么办**A运行容器时通过 --device/dev/ttyS1:/dev/ttyS1 参数映射设备节点。如果容器内需要设置串口参数如波特率需要添加 --privileged 参数赋予容器特权模式。生产环境建议不用privileged而是通过 --cap-addSYS_RAWIO 精确授权。容器内访问GPIO同理需将 /sys/class/gpio 挂载到容器中。**Q工业一体机部署后如何实现远程OTA固件更新**A推荐方案是基于双分区A/B partition设计。系统维护两个rootfs分区OTA时将新固件写入非活动分区验证通过后切换启动分区。RK3568平台可通过U-Boot的bootcmd配置实现分区切换。应用层OTA可使用Docker镜像更新方式先拉取新镜像再切换容器。两种方案都需配置回滚机制更新失败后自动切回上一个可用版本。