当前位置:首页 > 工业控制 > 工业控制
[导读]工业现场跑Linux最忌“拿Ubuntu改改就上产线”。通用发行版带桌面栈、Python、systemd全套守护进程、man手册、包管理器,占空间是小事,关键是引入不可控延迟、随机后台进程、更新任务扫盘,控制线程会被悄悄拖尾。 轻量化本质就一条:只保留“启动+挂载根文件+通信+控制业务”的最小集合,其余全砍。


工业现场跑Linux最忌“拿Ubuntu改改就上产线”。通用发行版带桌面栈、Python、systemd全套守护进程、man手册、包管理器,占空间是小事,关键是引入不可控延迟、随机后台进程、更新任务扫盘,控制线程会被悄悄拖尾。 轻量化本质就一条:只保留“启动+挂载根文件+通信+控制业务”的最小集合,其余全砍。

一、先列硬件清单再动内核

别从defconfig盲目删,先列目标板外设:

必留:串口、CAN、以太网、GPIO、SPI/I2C、看门狗、根文件所用MMC/NAND

可删:USB外设驱动、声卡、显卡、蓝牙、WiFi、KVM、调试符号

make ARCH=arm CROSS_COMPILE=arm-linux-gnueabihf- menuconfig

# General setup -> DEBUG_INFO=n

# Timer frequency 非实时场景100Hz,实时场景1000Hz

# 文件系统只留ext4/squashfs,关btrfs/nfs/cifs

每次改完make savedefconfig留版本,别一次性全关——裁过头根挂不上只能JTAG救。

二、根文件系统:Buildroot/BusyBox路线

工业网关类设备根文件系统压到十几MB是常态做法:

C库换musl,别用glibc

init用BusyBox init,不用systemd

关udev改用devtmpfs+mdev

镜像用squashfs只读,可写区挂tmpfs/overlay

make busybox-menuconfig

# 去bash、vi、telnetd、httpd、ftp

# 留ash、ip、mount、cat、date、nc

Yocto侧同理:

IMAGE_LINGUAS = ""

NO_RECOMMENDATIONS = "1"

IMAGE_INSTALL:remove = "bluez5 avahi-daemon cups python3"

DISTRO_FEATURES_remove = "x11 wayland bluetooth alsa"

用oe-pkgdata-util查谁把大依赖拉进来了,别手动rm。

三、运行时关掉多余服务

即便用了systemd,也要把桌面/服务器守护全disable,甚至mask:

systemctl disable bluetooth avahi-daemon cups postfix

systemctl mask modemmanager

查残留看两个命令:

systemctl list-units --type=service --state=running

ss -tuln

不用的端口全关掉,既是省资源也是缩攻击面。

工控板常留:业务进程、sshd(维护用)、看门狗服务、网络配置。其余图形登录、打印、邮件、零配置发现一律不要。

四、根文件系统只读+看门狗

现场断电多了,可写根文件几次就腐。做法:

rootfs用squashfs只读

/var/log、配置区挂tmpfs或小的可读写分区

配置变更走“双备份+CRC”,不直写运行配置

watchdog节点/dev/watchdog由控制主循环喂,不交给无关守护

int wdt = open("/dev/watchdog", O_WRONLY);

write(wdt, "V", 1);   // 关前释放

控制线程活着才喂狗;systemd软看门狗不够用,得是内核watchdog。

五、实时性:PREEMPT_RT+核隔离

光裁组件不等于实时。控制周期要求到ms级就得打PREEMPT_RT(6.12+主线直接开CONFIG_PREEMPT_RT),把自旋锁改rt_mutex、中断线程化。

启动参数隔离核:

isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3 irqaffinity=0-1

控制线程绑核+SCHED_FIFO:

struct sched_param sp = {.sched_priority = 70};

pthread_setschedparam(th, SCHED_FIFO, &sp);

CPU_ZERO(&set); CPU_SET(2, &set);

pthread_setaffinity_np(th, sizeof(set), &set);

mlockall(MCL_CURRENT|MCL_FUTURE);

优先级别踩99,watchdog/migration占着;应用一般20~80。

实测1kHz多轴控制,标准Linux最大延迟可超1000μs,PREEMPT_RT+隔离后能压到几十μs。 但要求亚10μs真硬实时,还是MCU+RTOS跑控制环,Linux只做HMI/算法/通信。

六、落坑清单

拿Debian Server当工控系统→后台服务随机抢CPU

systemd全开→dbus/udev/logind拖延迟

根文件可写ext4→断电几次挂掉

裁剪前不存defconfig→下次构建对不上

关掉看门狗节点→死循环无人复位

PREEMPT_RT不开核隔离→GPU/网络中断照打

控制线程用SCHED_OTHER→被普通进程挤

优先级设99→挡了内核迁移线程

实时路径里malloc→页错误尖刺

Python进控制主循环→GC抖一动就超周期

七、落地顺序

列硬件外设表,内核allnoconfig起加fragment

Buildroot/Yocto只装业务依赖,musl+BusyBox init

systemd服务列表逐个过,无关全disable+mask

根文件squashfs只读,日志/配置走tmpfs

业务进程看门狗自喂,别依赖systemd软狗

控制周期<5ms就上PREEMPT_RT+isolcpus

实时线程SCHED_FIFO绑核、锁内存、不malloc

极硬实时控制环拆到MCU,Linux做上层

嵌入式Linux工控稳定不是“跑起来就行”,是三层收口:内核只编要用到的驱动、根文件只装要跑的包、运行期只留必要服务。裁完不是最小,是“没有意外”——没有后台更新、没有图形栈、没有未知守护抢核,控制线程的延迟长尾才压得下去。PREEMPT_RT解决调度确定性,轻量化解决干扰源数量,俩一起做,Linux在工业边缘控制器里才站得稳;再往下压到微秒级硬实时,就该把控制环交给MCU了,别硬凹。



本站声明: 本文章由作者或相关机构授权发布,目的在于传递更多信息,并不代表本站赞同其观点,本站亦不保证或承诺内容真实性等。需要转载请联系该专栏作者,如若文章内容侵犯您的权益,请及时联系本站删除( 邮箱:macysun@21ic.com )。
关闭