工控存储外设:U 盘/SD 卡自动挂载、插拔检测、文件拷贝备份
工控存储外设U 盘/SD 卡自动挂载、插拔检测、文件拷贝备份工控现场最常见的需求之一插上U盘自动把数据拷走拔掉U盘数据不损坏。听起来简单坑却不少。一、Linux USB / SD 卡设备识别机制当外部存储设备插入时Linux 内核会自动识别并分配设备节点设备类型设备节点说明U盘/dev/sda1,/dev/sdb1SCSI子系统分配按字母递增SD卡/dev/mmcblk0p1MMC子系统分配pN表示第N分区CD-ROM/dev/sr0较少见工控中偶尔用于离线升级关键区分U盘是/dev/sd*SD卡是/dev/mmcblk*写脚本时千万别搞混。查看当前已识别的块设备cat/proc/partitions# 或者lsblk二、udev 规则配置2.1 什么是 udevudev是 Linux 的设备管理器负责在设备插入/拔出时执行预定义规则。工控场景下我们靠它实现自动挂载和权限设置。2.2 udev 规则语法规则文件放在/etc/udev/rules.d/目录下文件名以数字开头控制优先级# /etc/udev/rules.d/99-usb-storage.rules # U盘插入时触发 ACTIONadd, SUBSYSTEMblock, KERNELsd[a-z][0-9], \ RUN/etc/udev/scripts/mount-usb.sh %k # U盘拔出时触发 ACTIONremove, SUBSYSTEMblock, KERNELsd[a-z][0-9], \ RUN/etc/udev/scripts/umount-usb.sh %k # SD卡插入时触发 ACTIONadd, SUBSYSTEMblock, KERNELmmcblk[0-9]p[0-9], \ RUN/etc/udev/scripts/mount-usb.sh %k # SD卡拔出时触发 ACTIONremove, SUBSYSTEMblock, KERNELmmcblk[0-9]p[0-9], \ RUN/etc/udev/scripts/umount-usb.sh %k规则字段解读ACTIONadd插入或remove拔出SUBSYSTEM设备子系统存储设备是blockKERNEL内核设备名匹配支持通配RUN匹配时执行的脚本%k传入设备名如sda12.3 自定义设备名如果想让特定的U盘固定挂载名比如数据盘可以通过设备的唯一标识匹配# 查看U盘的唯一标识 udevadm info --queryall --name/dev/sda1 | grep ID_SERIAL # 按序列号绑定固定名称 ACTIONadd, SUBSYSTEMblock, \ ENV{ID_SERIAL}USB_Flash_Drive_123456, \ SYMLINKdata_usb这样该U盘插入后会出现/dev/data_usb软链接换一个U盘就不行——工控现场防插错U盘的神技。三、mdev 配置精简 Buildroot 系统如果工控板用的是 Buildroot 精简系统可能没有udev而是用busybox mdev。配置方式不同# /etc/mdev.conf# U盘分区自动挂载sd[a-z][0-9]0:0 0666 */etc/udev/scripts/mount-usb.sh$MDEVmmcblk[0-9]p[0-9]0:0 0666 */etc/udev/scripts/mount-usb.sh$MDEV# 拔出时卸载sd[a-z][0-9]0:0 0666 *$/etc/udev/scripts/umount-usb.sh$MDEV同时需要确保/etc/init.d/中有启动mdev -s的脚本并在内核中开启热插拔支持echo/sbin/mdev/proc/sys/kernel/hotplug mdev-s四、udevadm monitor 监控插拔事件调试 udev 规则时最实用的命令就是udevadm monitor# 监控所有uevent事件udevadm monitor# 只看block子系统udevadm monitor --subsystem-matchblock# 查看设备详细属性用于写规则udevadm info-a-n/dev/sda1插拔U盘时终端会实时输出事件流方便你确认KERNEL和SUBSYSTEM字段是否正确。五、自动挂载脚本实现5.1 挂载脚本#!/bin/sh# /etc/udev/scripts/mount-usb.sh# 用法: mount-usb.sh device 例如: mount-usb.sh sda1DEV$1MOUNT_DIR/mnt/usb/$DEV# 等待设备节点就绪内核可能还没创建完i0while[!-e/dev/$DEV][$i-lt20];dosleep0.1i$((i1))doneif[!-e/dev/$DEV];thenloggermount-usb: /dev/$DEVnot found, timeoutexit1fi# 创建挂载点mkdir-p$MOUNT_DIR# 尝试挂载支持vfat和ext4等常见格式mount-tvfat/dev/$DEV$MOUNT_DIR2/dev/null||\mount-texfat/dev/$DEV$MOUNT_DIR2/dev/null||\mount-text4/dev/$DEV$MOUNT_DIR2/dev/null||\mount/dev/$DEV$MOUNT_DIR2/dev/nullif[$?-eq0];thenloggermount-usb: /dev/$DEVmounted to$MOUNT_DIR# 触发数据同步脚本可选/etc/udev/scripts/sync-data.sh$MOUNT_DIRelseloggermount-usb: failed to mount /dev/$DEVrmdir$MOUNT_DIR2/dev/nullfi5.2 卸载脚本#!/bin/sh# /etc/udev/scripts/umount-usb.sh# 用法: umount-usb.sh deviceDEV$1MOUNT_DIR/mnt/usb/$DEV# 检查是否还在挂载状态ifmountpoint-q$MOUNT_DIR;then# 先sync刷新缓冲防止数据损坏syncumount$MOUNT_DIRloggerumount-usb: /dev/$DEVunmounted from$MOUNT_DIRfi# 清理挂载点目录rmdir$MOUNT_DIR2/dev/null loggerumount-usb: cleanup$MOUNT_DIR关键细节卸载前一定要syncLinux 文件系统有写缓存直接拔U盘可能丢数据。六、文件拷贝备份脚本工控场景典型需求U盘插入后自动把设备上的数据目录拷贝过去并校验完整性。#!/bin/sh# /etc/udev/scripts/sync-data.sh# 用法: sync-data.sh mount_dirMOUNT_DIR$1DATA_DIR/var/log/device_data# 本地数据目录BACKUP_LOG/var/log/backup.log# 等待挂载稳定sleep2loggersync-data: starting backup to$MOUNT_DIR# 生成本次备份的目录名带时间戳BACKUP_NAMEbackup_$(date%Y%m%d_%H%M%S)TARGET$MOUNT_DIR/$BACKUP_NAME# 执行拷贝mkdir-p$TARGETcp-a$DATA_DIR/*$TARGET/2/dev/nullif[$?-ne0];thenloggersync-data: ERROR copy failedexit1fi# MD5校验 - 生成本次备份的文件清单和校验值cd$TARGETfind.-typef-execmd5sum{}\;checksum.md5# 验证校验md5sum-cchecksum.md5/dev/null21if[$?-eq0];thenloggersync-data: backup OK, files at$TARGET# 写入备份日志echo$(date%Y-%m-%d %H:%M:%S)BACKUP OK -$TARGET$BACKUP_LOGelseloggersync-data: WARNING checksum verification failedecho$(date%Y-%m-%d %H:%M:%S)BACKUP CHECKSUM FAIL -$TARGET$BACKUP_LOGfi# 刷新缓冲确保数据落盘sync七、热插拔安全性工控现场拔U盘不讲究所以驱动和脚本层面要做好保护措施说明卸载前sync刷新文件系统缓冲到物理设备使用umount而非直接拔通知文件系统释放资源mount加sync选项mount -o sync实时写入牺牲性能换安全只读挂载选项mount -o ro读取场景下防止误写日志记录logger记录每次挂载/卸载事件便于追溯挂载时加上sync,uid0,gid0,umask000参数对 vfat 格式很实用mount-tvfat-osync,umask000/dev/$DEV$MOUNT_DIRumask000让所有用户可读写避免工控程序因权限问题写不进U盘。八、多分区 U 盘处理一个U盘可能有多个分区如sda1、sda2udev 规则中KERNELsd[a-z][0-9]已经能匹配所有分区但脚本需要处理每个分区独立挂载# 挂载点按分区号区分不会互相覆盖MOUNT_DIR/mnt/usb/$DEV# sda1 - /mnt/usb/sda1# sda2 - /mnt/usb/sda2九、工控存储常见问题汇总问题原因解决方案U盘识别但无法挂载文件系统不支持编译内核时开启 vfat/exfat/ntfs 支持挂载后权限不足默认只有root可写mount -o umask000或修改 udev 规则赋权拔U盘后数据丢失缓冲未刷新脚本中加sync或挂载时用-o sync设备节点名不固定按插入顺序分配字母用ENV{ID_SERIAL}匹配固定符号链接频繁插拔导致挂载点残留umount 失败脚本中fuser -k杀死占用进程后再卸载SD卡分区识别不到没有分区表直接挂/dev/mmcblk0而非mmcblk0p1存储外设自动挂载看似简单但要在工控环境中做到无人值守、数据不丢、即插即用每一个环节的细节都不能含糊。sync该加的加校验该做的做脚本该有的容错一个都不能少。

相关新闻

坦克世界3D涂装制作:从UML建模到独立模型技术解析

坦克世界3D涂装制作:从UML建模到独立模型技术解析

最近在坦克世界社区里,不少玩家都在讨论一个现象:为什么有些玩家的坦克看起来特别酷炫,炮管上带着独特的防护系统,车体侧面还有明显的反应装甲模块?这些其实都是通过3D涂装实现的深度定制效果。今天要重点分析的&#…

2026/10/2 11:50:24 阅读更多 →
极简字符设备驱动开发:控制继电器、DI/DO 数字输入输出

极简字符设备驱动开发:控制继电器、DI/DO 数字输入输出

极简字符设备驱动开发:控制继电器、DI/DO 数字输入输出驱动开发不是玄学,今天我们就把"点亮一个继电器"这件事从内核层到用户层扒个底朝天。一、Linux 驱动模型简介 Linux 设备驱动分三大类,搞不清楚这个分类,后面学起来…

2026/10/12 10:54:45 阅读更多 →
openEuler基于certbot申请内网ssl泛域名免费证书

openEuler基于certbot申请内网ssl泛域名免费证书

一、安装 Certbot pip3 install certbot certbot-nginx二、申请证书 单域名申请: certbot certonly --manual --preferred-challenges dns -d jk.xxx.cn泛域名申请: certbot certonly --manual --preferred-challenges dns -d *.xxx.cn -d xxx.cn命令详解…

2026/9/29 8:29:15 阅读更多 →

最新新闻

微波通信原理与工程实践:从链路预算到天线安装

微波通信原理与工程实践:从链路预算到天线安装

提到微波通信,很多刚入行或者正在学通信的朋友第一反应是:这东西是不是太老了?光纤都铺进了村里,5G基站密密麻麻,谁还用微波?说实话,我做了十来年通信工程,微波不但没被淘汰&#xf…

2026/10/12 10:54:02 阅读更多 →
AI芯片落地第三阶段:软硬协同系统级调优实战

AI芯片落地第三阶段:软硬协同系统级调优实战

1. 项目概述:这不是芯片设计教科书,而是一份“能跑通、能调优、能量产”的实战手记“AI 芯片的软硬件设计 3”这个标题乍看像课程编号,但在我过去十年参与多个边缘端AI加速器项目的过程中,它实际指向一个非常具体的临界点——当第…

2026/10/12 10:54:02 阅读更多 →
基于半不变量的IEEE 34节点配电网概率潮流计算与Matlab实现

基于半不变量的IEEE 34节点配电网概率潮流计算与Matlab实现

配电网里待久了就会发现,同一个节点不同时刻测到的电压根本不是一个固定值:白天屋顶光伏大发、负荷轻,电压往上飘;晚上负荷重、风场出力不足,电压又往下掉。传统确定性潮流在给定一组负荷和出力后给出一个确定解&#…

2026/10/12 10:54:02 阅读更多 →
AI协同开发STM32:嵌入式工程师的新型工作流

AI协同开发STM32:嵌入式工程师的新型工作流

1. 项目概述:当AI真正坐进嵌入式开发者的工位“AI协同开发STM32程序”——这八个字不是PPT里的概念包装,而是我过去三个月在某工业传感器固件迭代项目中每天真实发生的协作现场。它不等于“用ChatGPT写几行代码”,也不是把Copilot拖进Keil里点…

2026/10/12 10:54:02 阅读更多 →
OpenClaw 模型配置与切换经验分享:把 settings 改到 TaoToken 的实操记录

OpenClaw 模型配置与切换经验分享:把 settings 改到 TaoToken 的实操记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/12 10:54:02 阅读更多 →
Catalyst 9800无线控制器配置与排错实战指南

Catalyst 9800无线控制器配置与排错实战指南

简介:Catalyst 9800-40无线控制器是思科新一代无线网络管理平台,这一实战配置手册主要面向网络工程师、无线网络运维人员,帮助读者快速上手C9800系列控制器的部署与管理。手册围绕硬件规格、接口说明、配置逻辑、初始配置流程等核心部分展开&…

2026/10/12 10:53:00 阅读更多 →

日新闻

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

复古胶片颗粒感噪点合成器:Canvas ImageData 像素高斯杂色注入算法

在数码相机、高清显示屏与现代矢量图形技术高度发达的今天,画面可以做到绝对的锐利、平滑与无瑕。然而,当一张秋日手账插画或拍立得照片过于“平整无瑕”时,往往会散发出一种冰冷生硬的“数码塑料感(Digital Plasticity&#xff0…

2026/10/12 0:00:59 阅读更多 →
活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

活字印刷古籍线装排版:Canvas 竖排文字与栏线自适应算法

在现代网页与移动端设计中,横排(Horizontal Layout)早已经成为了绝对的主流。然而,当我们翻开泛黄的线装古籍、宋版木刻诗集,或是欣赏一张茶道雅集的手写便签时,那种**自上而下纵向书写、自右向左逐列铺展&…

2026/10/12 0:00:59 阅读更多 →
周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

周日晚间的“精神松绑减震器”:无压力情绪倾倒箱与温和轻声陪伴

每到周日的晚上八点到十点,很多人心里都会悄悄亮起一盏警示灯。 在心理学上,这种现象有一个专门的称谓——“周日夜晚焦虑症(Sunday Scaries)”。明天又是周一,闹钟又要重新在七点响彻卧房;脑海里仿佛有一个…

2026/10/12 0:00:59 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/12 0:16:30 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/12 0:16:38 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/12 0:16:43 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 10:45:37 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:53 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/11 14:36:54 阅读更多 →