当前位置: 首页 > news >正文

linux系统的u盘/mmc/sd卡等的支持热插拔和自动挂载行为

1.了解mdev

        mdev是busybox自带的一个简化版的udev。udev是从Linux 2.6 内核系列开始的设备文件系统(DevFS)的替代品,是 Linux 内核的设备管理器。总的来说,它取代了 devfs 和 hotplug,负责管理 /dev 中的设备节点。同时,udev 也处理所有用户空间发生的硬件添加、删除事件,以及某些特定设备所需的固件加载。比如,当我们插入U盘后udev会自动在/dev下创建设备节点,同时将U盘挂载到系统中;当拔掉U盘后,udev又会自动删除/dev下U盘的设备节点以及挂载的目录。mdev是udev的简化版,因此它的工作和udev是相同的。

mdev需要内核sysfs的支持。为了使用动态更新的功能,同要需要配置内核支持热拔插。

要使用mdev功能,应在编译busybox时在menconfig的Linux System Utilities中勾选上支持mdev的选项以及在编译kernel时勾选上支持hotplug。如果你对mdev的配置方法不熟悉,请:

一定要看docs/mdev.txt和examples/mdev.conf

关于初始化脚本的详细内容请参阅busybox的docs/mdev.txt文件,里面有详细的介绍,

下面这张图片,展示几个关键的内容

linux的内核的第一个程序是/etc/init.d/rcS

2.配置1

我的配置如下  /etc/init.d # cat rcS

#!/bin/sh
/bin/mount -t proc none /proc
/bin/mount -t sysfs sysfs /sys

/bin/mount -t ramfs /tmp
/bin/mount -t ramfs /mnt
#/bin/mkdir /mnt/pts
#/bin/mount -t devpts devpts /dev/pts
/bin/echo > /dev/mdev.seq
/bin/echo /bin/mdev > /proc/sys/kernel/hotplug
/bin/mdev -s

insmod /usr/drivers_demo/mpu6050d.ko

source /etc/profile
 

3.配置2

/bin/echo /bin/mdev > /proc/sys/kernel/hotplug的运行之前,需要配置脚本的路径

        这样,系统启动时执行了命令echo /sbin/mdev > /proc/sys/kernel/hotplug,当那么当有热插拔事件产生时,内核就会调用位于/sbin目录的mdev。这时mdev通过环境变量中的 ACTION和DEVPATH(这两个变量是系统自带的)来确定此次热插拔事件的动作以及影响了/sys 中的那个目录。接着会看看这个目录中是否有" dev "的属性文件,如果有就利用这些信息为这个设备在/dev下创建设备节点文件。

# cat /etc/mdev.conf
mmcblk([0-9]+)p([0-9]+) 0:0 660 */sbin/automount.sh $MDEV X${ACTION}
mmcblk([0-9]+)          0:0 660 */sbin/automount.sh $MDEV X${ACTION}
sd([a-z]+)([0-9]+)      0:0 660 */sbin/automount.sh $MDEV X${ACTION}
sd([a-z]+)              0:0 660 */sbin/automount.sh $MDEV X${ACTION}

#mtdblock([0-9]+)        0:0 660 */sbin/automount.sh $MDEV X${ACTION}

for usb: sd[a-z][0-9]

for sd/mmc card:mmcblk[0-9]p[0-9] 0:6

指令:<device regex> <uid>:<gid> <octal permissions> [<@|$|*> <command>]

特殊字符的意义如下:

 @:在创建设备节点后运行命令。

 $:在删除设备节点前运行命令。

*:在创建设备节点和删除设备节点前都运行命令。

Command :对应的shell—般位于letc/mdev目录

为了利用脚本(如Shell脚本automout.sh)实现u盘在嵌入式系统上的自动挂载,在mdev规则文件/sbin/automount.sh中加入以下一行匹配规则使mdev在找到匹配行时可以执行用户自定义的命令( shell脚本中的内容):

sd[a-z][0-9]* 0:0 0600 */sbin/automount.sh $MDEV

4.脚本automount.sh

上一个配置已经指定脚本和路径,现在实现如下

 # cat /sbin/automount.sh

#! /bin/sh# debugging message
#echo "MDEV=$1 : ACTION=$2 : SUBSYSTEM=$SUBSYSTEM : DEVPATH=$DEVPATH : DEVNAME=$DEVNAME" >> /dev/consoleif [ "$1" == "" ]; thenecho "parameter is none" > /tmp/error.txtexit 1
fiMNT=$1
#if [ $(echo $1 | grep mmcblk) ]; then
#       if [ $(echo $1 | grep p[25]) ]; then
#               MNT=sdcard2
#       else
#               MNT=sdcard
#       fi
#elif [ $(echo $1 | grep sd) ]; then
#       if [ $(echo $1 | grep p[25]) ]; then
#               MNT=nandcard2
#       else
#               MNT=nandcard
#       fi
#fi# there is no ACTION, it is for initial population
if [ "$2" = "X" ]; thenmounted=`mount | grep $1 | wc -l`if [ $mounted -ge 1 ]; then# mounted, assume the ACTION is remove#ACT=Xremove# only set add for initial populationACT=Xaddelse# not mounted, assume the ACTION is addACT=Xaddfi
elseACT=$2
fiif [ "$ACT" = "Xremove" ]; then# umount the deviceecho "$ACT /mnt/$1" >> /tmp/mdev.logif ! umount -l "/mnt/$1"; thenexit 1elserm -f "/mnt/$MNT"echo "[Umount FS]: /dev/$1 -X-> /mnt/$MNT" > /dev/consolefiif ! rmdir "/mnt/$1"; thenexit 1fi
else# mount the devicemounted=`mount | grep $1 | wc -l`#echo "par=$1,mounted=$mounted,MNT=$MNT" > /dev/consoleif [ $mounted -ge 1 ]; then#echo "device $1 is already mounted" > /dev/consoleexit 0fiif ! mkdir -p "/mnt/$1"; thenexit 1fiif [ $(echo $1 | grep mtd) ]; thenif mount -t jffs2 "/dev/$1" "/mnt/$1"; thenecho "[Mount JFFS2]: /dev/$1 --> /mnt/$MNT" > /dev/consoleecho "$ACT /mnt/$1" >> /tmp/mdev.logelif mount -t yaffs2 -o"inband-tags" "/dev/$1" "/mnt/$1"; thenecho "[Mount YAFFS2]: /dev/$1 --> /mnt/$MNT" > /dev/consoleecho "$ACT /mnt/$1" >> /tmp/mdev.logelif mount -t ubifs "/dev/$1" "/mnt/$1"; thenecho "[Mount UBIFS]: /dev/$1 --> /mnt/$MNT" > /dev/consoleecho "$ACT /mnt/$1" >> /tmp/mdev.logelse# failed to mount, clean up mountpointif ! rmdir "/mnt/$1"; thenexit 1fifielse# try vfat onlyif mount -t vfat -o noatime,shortname=mixed,utf8 "/dev/$1" "/mnt/$1"; thenln -s /mnt/$1 /mnt/$MNTecho "[Mount VFAT]: /dev/$1 --> /mnt/$MNT" > /dev/consoleecho "$ACT /mnt/$1" >> /tmp/mdev.logelse# failed to mount, clean up mountpointif ! rmdir "/mnt/$1"; thenexit 1fiexit 1fifi
fi

5.测试

6.如果我想把automount.sh放到其他地方,如何修改启动文件

自启动脚本添加如下内容

  • 添加下面两条指令到mdev.conf:

sd([a-z]+)([0-9]+)      0:0 660 */home/fhsj_app/automount.sh $MDEV X${ACTION}"

sd([a-z]+)              0:0 660 */home/fhsj_app/automount.sh $MDEV X${ACTION}"

  • 确保/home/fhsj_app/下面有automount.sh(或者是你自己的目录)的脚本且权限660以上
  • 加入热插拔和自动挂载的指令

/sbin/echo /sbin/mdev > /proc/sys/kernel/hotplug

/sbin/mdev -s

我的自启动脚本如下:

awk '1; END {print "sd([a-z]+)([0-9]+)      0:0 660 */home/fhsj_app/automount.sh $MDEV X${ACTION}"}' /etc/mdev.conf > /tmp/mdev.conf && mv /tmp/mdev.conf /etc/mdev.conf

awk '1; END {print "sd([a-z]+)              0:0 660 */home/fhsj_app/automount.sh $MDEV X${ACTION}"}' /etc/mdev.conf > /tmp/mdev.conf && mv /tmp/mdev.conf /etc/mdev.conf

/sbin/echo /sbin/mdev > /proc/sys/kernel/hotplug

/sbin/mdev -s

 

相关文章:

linux系统的u盘/mmc/sd卡等的支持热插拔和自动挂载行为

1.了解mdev mdev是busybox自带的一个简化版的udev。udev是从Linux 2.6 内核系列开始的设备文件系统&#xff08;DevFS&#xff09;的替代品&#xff0c;是 Linux 内核的设备管理器。总的来说&#xff0c;它取代了 devfs 和 hotplug&#xff0c;负责管理 /dev 中的设备节点。同时…...

使用Python将OSS文件免费下载到本地:项目分析和准备工作

大家好&#xff0c;我是水滴~~ 本文将介绍如何使用Python编程语言将OSS&#xff08;对象存储服务&#xff09;中的文件免费下载到本地计算机。我们先进行项目分析和准备工作&#xff0c;为后续的编码及实施提供基础。 《Python入门核心技术》专栏总目录・点这里 文章目录 1. 前…...

从Gitee克隆项目、启动方法

从gitee克隆VUE项目到本地后&#xff0c;不能直接运行&#xff0c;需要进行npm install安装node_modules文件夹里面的内容&#xff0c;因为在git上传的时候&#xff0c;一般都会过滤到node_modules中的依赖文件。 安装依赖以后&#xff0c;启动通过npm run serve启动项目出错。…...

不用再找了,这是大模型实践最全的总结

随着ChatGPT的迅速出圈&#xff0c;加速了大模型时代的变革。对于以Transformer、MOE结构为代表的大模型来说&#xff0c;传统的单机单卡训练模式肯定不能满足上千&#xff08;万&#xff09;亿级参数的模型训练&#xff0c;这时候我们就需要解决内存墙和通信墙等一系列问题&am…...

QT 记录

qml 移动窗口会闪烁 int main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);//orQCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL); }window 拉取qml程序依赖文件 打开QT自带的命令窗口&#xff0c;转到exe程序目录&#xff1a; …...

智能优化算法应用:基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码

智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用&#xff1a;基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑寡妇算法4.实验参数设定5.算法结果6.参考文…...

VSCode 常用的快捷键和技巧系列(2)

一、如何让VSCode工程树显示图标 第一步&#xff1a;安装 快捷键 CtrlP &#xff0c;输入 ext install vscode-icons &#xff0c;然后点击安装插件 第二步&#xff1a;配置 安装成功后&#xff0c;点击Reload重新加载。 然后配置&#xff0c;当前图标使用VsCode-Icons Go…...

【Hadoop】执行start-dfs.sh启动hadoop集群时,datenode没有启动怎么办

执行start-dfs.sh后&#xff0c;datenode没有启动&#xff0c;很大一部分原因是因为在第一次格式化dfs后又重新执行了格式化命令&#xff08;hdfs namenode -format)&#xff0c;这时主节点namenode的clusterID会重新生成&#xff0c;而从节点datanode的clusterID 保持不变。 在…...

计算机网络(四)

九、网络安全 &#xff08;一&#xff09;什么是网络安全&#xff1f; A、网络安全状况 分布式反射攻击逐渐成为拒绝攻击的重要形式 涉及重要行业和政府部门的高危漏洞事件增多。 基础应用和通用软硬件漏洞风险凸显&#xff08;“心脏出血”&#xff0c;“破壳”等&#x…...

非递归实现的快速排序

目录 序列文章 前言 学前补充 非递归快速排序 注意事项&#xff08;重要&#xff09; 实现步骤 代码实现 时空复杂度 快速排序的特性 栈的相关代码 序列文章 非递归实现的快速排序&#xff1a;http://t.csdnimg.cn/UEcL6 快速排序的挖坑法与双指针法&#xff1a;ht…...

windows 安装jenkins

下载jenkins 官方下载地址&#xff1a;Jenkins 的安装和设置 清华源下载地址&#xff1a;https://mirrors.tuna.tsinghua.edu.cn/jenkins/windows-stable/ 最新支持java8的版本时2.346.1版本&#xff0c;在清华源中找不到&#xff0c;在官网中没找到windows的下载历史&#xff…...

SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?

文章目录 简介事务版本号行记录的隐藏列Undo LogRead View的工作流程总结参考文献 简介 在不同的DBMS里&#xff0c;MVCC的实现机制是不同的。本节我们会以InnoDB举例&#xff0c;讲解InnoDB里MVCC的实现机制。 我们需要掌握这么几个概念&#xff1a; 事务版本号行记录的隐藏…...

SpringCloudAliBaba篇之Seata:分布式事务组件理论与实践

1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中&#xff0c;一个事务由一组SQL语句组成&#xff0c;事务具有4个属性&#xff1a;原子性、一致性、隔离性、持久性。这四个属性通常称为ACID原则。 原子性(atomici…...

在centos7.9上安装Jenkins的安装过程

1.jenkins的安装和配置&#xff1a; 安装JDK&#xff1a; yum install -y fontconfig java-11-openjdk # 安装目录&#xff1a;/usr/lib/jvm # fontconfig 是 Linux 系统中用于配置和管理字体的一种工具 下载jenkins安装包&#xff1a; sudo wget -O /etc/yum.repos.d/jenkins…...

uni-app基本标签

导航栏设置 - navigationBarBackgroundColor: 设置导航栏的背景颜色&#xff08;全局页面&#xff09; - navigationBarTextStyle: 导航栏标题颜色&#xff08;仅支持 black 和 white&#xff09; - navigationBarTitleText: 设置导航栏标题内容 - enablePullDownRefresh: 是否…...

《PySpark大数据分析实战》-14.云服务模式Databricks介绍基本概念

&#x1f4cb; 博主简介 &#x1f496; 作者简介&#xff1a;大家好&#xff0c;我是wux_labs。&#x1f61c; 热衷于各种主流技术&#xff0c;热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员&#xff08;PCTA&#xff09;、TiDB数据库专家&#xff08;PCTP…...

微信小程序校园跑腿系统怎么做,如何做,要做多久

​ 在这个互联网快速发展、信息爆炸的时代&#xff0c;人人都离不开手机&#xff0c;每个人都忙于各种各样的事情&#xff0c;大学生也一样&#xff0c;有忙于学习&#xff0c;忙于考研&#xff0c;忙着赚学分&#xff0c;忙于参加社团&#xff0c;当然也有忙于打游戏的&#x…...

当我分别问8款GPT一个问题。。。

前两天下班在地铁上无聊寻思问一下不同的GPT一个相同的问题&#xff0c;哪个会给出我比较满意的答案&#xff0c;然后我就提问&#xff1a;我老妹有点憨怎么办&#xff1f;&#xff08;ps&#xff1a;开玩笑的&#xff0c;嘻嘻。。。&#xff09; 很明显其他GPT都给出了大差不差…...

Elasticsearch 8.9 search命令执行查询源码

一、相关的API的handler1、接收HTTP请求的handler2、往数据节点发送查询请求的action(TransportSearchAction)3、通过transportService把查询请求发送到指定的数据节点 二、数据节点收到请求的处理逻辑1、尝试从缓存中加载查询结果2、不通过缓存查询&#xff0c;直接执行查询(1…...

【PHP】身份证正则验证、校验位验证

目录 1.正则 简单正则 详细正则 2.校验位验证 1.正则 简单正则 function isValidIdCardNumber($idCardNumber) {// 身份证号长度为 15 位或 18 位$pattern /^(?:\d{15}|\d{17}[\dxX])$/;return preg_match($pattern, $idCardNumber); }$idCardNumber 12345678901234567…...

Java 语言特性(面试系列1)

一、面向对象编程 1. 封装&#xff08;Encapsulation&#xff09; 定义&#xff1a;将数据&#xff08;属性&#xff09;和操作数据的方法绑定在一起&#xff0c;通过访问控制符&#xff08;private、protected、public&#xff09;隐藏内部实现细节。示例&#xff1a; public …...

CMake基础:构建流程详解

目录 1.CMake构建过程的基本流程 2.CMake构建的具体步骤 2.1.创建构建目录 2.2.使用 CMake 生成构建文件 2.3.编译和构建 2.4.清理构建文件 2.5.重新配置和构建 3.跨平台构建示例 4.工具链与交叉编译 5.CMake构建后的项目结构解析 5.1.CMake构建后的目录结构 5.2.构…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

听写流程自动化实践,轻量级教育辅助

随着智能教育工具的发展&#xff0c;越来越多的传统学习方式正在被数字化、自动化所优化。听写作为语文、英语等学科中重要的基础训练形式&#xff0c;也迎来了更高效的解决方案。 这是一款轻量但功能强大的听写辅助工具。它是基于本地词库与可选在线语音引擎构建&#xff0c;…...

【FTP】ftp文件传输会丢包吗?批量几百个文件传输,有一些文件没有传输完整,如何解决?

FTP&#xff08;File Transfer Protocol&#xff09;本身是一个基于 TCP 的协议&#xff0c;理论上不会丢包。但 FTP 文件传输过程中仍可能出现文件不完整、丢失或损坏的情况&#xff0c;主要原因包括&#xff1a; ✅ 一、FTP传输可能“丢包”或文件不完整的原因 原因描述网络…...

WEB3全栈开发——面试专业技能点P7前端与链上集成

一、Next.js技术栈 ✅ 概念介绍 Next.js 是一个基于 React 的 服务端渲染&#xff08;SSR&#xff09;与静态网站生成&#xff08;SSG&#xff09; 框架&#xff0c;由 Vercel 开发。它简化了构建生产级 React 应用的过程&#xff0c;并内置了很多特性&#xff1a; ✅ 文件系…...

智能职业发展系统:AI驱动的职业规划平台技术解析

智能职业发展系统&#xff1a;AI驱动的职业规划平台技术解析 引言&#xff1a;数字时代的职业革命 在当今瞬息万变的就业市场中&#xff0c;传统的职业规划方法已无法满足个人和企业的需求。据统计&#xff0c;全球每年有超过2亿人面临职业转型困境&#xff0c;而企业也因此遭…...

篇章二 论坛系统——系统设计

目录 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 1. 数据库设计 1.1 数据库名: forum db 1.2 表的设计 1.3 编写SQL 2.系统设计 2.1 技术选型 2.2 设计数据库结构 2.2.1 数据库实体 通过需求分析获得概念类并结合业务实现过程中的技术需要&#x…...

客户案例 | 短视频点播企业海外视频加速与成本优化:MediaPackage+Cloudfront 技术重构实践

01技术背景与业务挑战 某短视频点播企业深耕国内用户市场&#xff0c;但其后台应用系统部署于东南亚印尼 IDC 机房。 随着业务规模扩大&#xff0c;传统架构已较难满足当前企业发展的需求&#xff0c;企业面临着三重挑战&#xff1a; ① 业务&#xff1a;国内用户访问海外服…...

医疗AI模型可解释性编程研究:基于SHAP、LIME与Anchor

1 医疗树模型与可解释人工智能基础 医疗领域的人工智能应用正迅速从理论研究转向临床实践,在这一过程中,模型可解释性已成为确保AI系统被医疗专业人员接受和信任的关键因素。基于树模型的集成算法(如RandomForest、XGBoost、LightGBM)因其卓越的预测性能和相对良好的解释性…...