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 -sinsmod /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 内核系列开始的设备文件系统(DevFS)的替代品,是 Linux 内核的设备管理器。总的来说,它取代了 devfs 和 hotplug,负责管理 /dev 中的设备节点。同时…...
使用Python将OSS文件免费下载到本地:项目分析和准备工作
大家好,我是水滴~~ 本文将介绍如何使用Python编程语言将OSS(对象存储服务)中的文件免费下载到本地计算机。我们先进行项目分析和准备工作,为后续的编码及实施提供基础。 《Python入门核心技术》专栏总目录・点这里 文章目录 1. 前…...
从Gitee克隆项目、启动方法
从gitee克隆VUE项目到本地后,不能直接运行,需要进行npm install安装node_modules文件夹里面的内容,因为在git上传的时候,一般都会过滤到node_modules中的依赖文件。 安装依赖以后,启动通过npm run serve启动项目出错。…...
不用再找了,这是大模型实践最全的总结
随着ChatGPT的迅速出圈,加速了大模型时代的变革。对于以Transformer、MOE结构为代表的大模型来说,传统的单机单卡训练模式肯定不能满足上千(万)亿级参数的模型训练,这时候我们就需要解决内存墙和通信墙等一系列问题&am…...
QT 记录
qml 移动窗口会闪烁 int main(int argc, char *argv[]) {QCoreApplication::setAttribute(Qt::AA_UseOpenGLES);//orQCoreApplication::setAttribute(Qt::AA_UseSoftwareOpenGL); }window 拉取qml程序依赖文件 打开QT自带的命令窗口,转到exe程序目录: …...
智能优化算法应用:基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码
智能优化算法应用:基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码 文章目录 智能优化算法应用:基于黑寡妇算法3D无线传感器网络(WSN)覆盖优化 - 附代码1.无线传感网络节点模型2.覆盖数学模型及分析3.黑寡妇算法4.实验参数设定5.算法结果6.参考文…...
VSCode 常用的快捷键和技巧系列(2)
一、如何让VSCode工程树显示图标 第一步:安装 快捷键 CtrlP ,输入 ext install vscode-icons ,然后点击安装插件 第二步:配置 安装成功后,点击Reload重新加载。 然后配置,当前图标使用VsCode-Icons Go…...
【Hadoop】执行start-dfs.sh启动hadoop集群时,datenode没有启动怎么办
执行start-dfs.sh后,datenode没有启动,很大一部分原因是因为在第一次格式化dfs后又重新执行了格式化命令(hdfs namenode -format),这时主节点namenode的clusterID会重新生成,而从节点datanode的clusterID 保持不变。 在…...
计算机网络(四)
九、网络安全 (一)什么是网络安全? A、网络安全状况 分布式反射攻击逐渐成为拒绝攻击的重要形式 涉及重要行业和政府部门的高危漏洞事件增多。 基础应用和通用软硬件漏洞风险凸显(“心脏出血”,“破壳”等&#x…...
非递归实现的快速排序
目录 序列文章 前言 学前补充 非递归快速排序 注意事项(重要) 实现步骤 代码实现 时空复杂度 快速排序的特性 栈的相关代码 序列文章 非递归实现的快速排序:http://t.csdnimg.cn/UEcL6 快速排序的挖坑法与双指针法:ht…...
windows 安装jenkins
下载jenkins 官方下载地址:Jenkins 的安装和设置 清华源下载地址:https://mirrors.tuna.tsinghua.edu.cn/jenkins/windows-stable/ 最新支持java8的版本时2.346.1版本,在清华源中找不到,在官网中没找到windows的下载历史ÿ…...
SQL进阶理论篇(十二):InnoDB中的MVCC是如何实现的?
文章目录 简介事务版本号行记录的隐藏列Undo LogRead View的工作流程总结参考文献 简介 在不同的DBMS里,MVCC的实现机制是不同的。本节我们会以InnoDB举例,讲解InnoDB里MVCC的实现机制。 我们需要掌握这么几个概念: 事务版本号行记录的隐藏…...
SpringCloudAliBaba篇之Seata:分布式事务组件理论与实践
1、事务简介 事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在关系数据库中,一个事务由一组SQL语句组成,事务具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID原则。 原子性(atomici…...
在centos7.9上安装Jenkins的安装过程
1.jenkins的安装和配置: 安装JDK: yum install -y fontconfig java-11-openjdk # 安装目录:/usr/lib/jvm # fontconfig 是 Linux 系统中用于配置和管理字体的一种工具 下载jenkins安装包: sudo wget -O /etc/yum.repos.d/jenkins…...
uni-app基本标签
导航栏设置 - navigationBarBackgroundColor: 设置导航栏的背景颜色(全局页面) - navigationBarTextStyle: 导航栏标题颜色(仅支持 black 和 white) - navigationBarTitleText: 设置导航栏标题内容 - enablePullDownRefresh: 是否…...
《PySpark大数据分析实战》-14.云服务模式Databricks介绍基本概念
📋 博主简介 💖 作者简介:大家好,我是wux_labs。😜 热衷于各种主流技术,热爱数据科学、机器学习、云计算、人工智能。 通过了TiDB数据库专员(PCTA)、TiDB数据库专家(PCTP…...
微信小程序校园跑腿系统怎么做,如何做,要做多久
在这个互联网快速发展、信息爆炸的时代,人人都离不开手机,每个人都忙于各种各样的事情,大学生也一样,有忙于学习,忙于考研,忙着赚学分,忙于参加社团,当然也有忙于打游戏的&#x…...
当我分别问8款GPT一个问题。。。
前两天下班在地铁上无聊寻思问一下不同的GPT一个相同的问题,哪个会给出我比较满意的答案,然后我就提问:我老妹有点憨怎么办?(ps:开玩笑的,嘻嘻。。。) 很明显其他GPT都给出了大差不差…...
Elasticsearch 8.9 search命令执行查询源码
一、相关的API的handler1、接收HTTP请求的handler2、往数据节点发送查询请求的action(TransportSearchAction)3、通过transportService把查询请求发送到指定的数据节点 二、数据节点收到请求的处理逻辑1、尝试从缓存中加载查询结果2、不通过缓存查询,直接执行查询(1…...
【PHP】身份证正则验证、校验位验证
目录 1.正则 简单正则 详细正则 2.校验位验证 1.正则 简单正则 function isValidIdCardNumber($idCardNumber) {// 身份证号长度为 15 位或 18 位$pattern /^(?:\d{15}|\d{17}[\dxX])$/;return preg_match($pattern, $idCardNumber); }$idCardNumber 12345678901234567…...
调用支付宝接口响应40004 SYSTEM_ERROR问题排查
在对接支付宝API的时候,遇到了一些问题,记录一下排查过程。 Body:{"datadigital_fincloud_generalsaas_face_certify_initialize_response":{"msg":"Business Failed","code":"40004","sub_msg…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍
文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结: 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析: 实际业务去理解体会统一注…...
前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...
稳定币的深度剖析与展望
一、引言 在当今数字化浪潮席卷全球的时代,加密货币作为一种新兴的金融现象,正以前所未有的速度改变着我们对传统货币和金融体系的认知。然而,加密货币市场的高度波动性却成为了其广泛应用和普及的一大障碍。在这样的背景下,稳定…...
Python Ovito统计金刚石结构数量
大家好,我是小马老师。 本文介绍python ovito方法统计金刚石结构的方法。 Ovito Identify diamond structure命令可以识别和统计金刚石结构,但是无法直接输出结构的变化情况。 本文使用python调用ovito包的方法,可以持续统计各步的金刚石结构,具体代码如下: from ovito…...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
python打卡day49@浙大疏锦行
知识点回顾: 通道注意力模块复习空间注意力模块CBAM的定义 作业:尝试对今天的模型检查参数数目,并用tensorboard查看训练过程 一、通道注意力模块复习 & CBAM实现 import torch import torch.nn as nnclass CBAM(nn.Module):def __init__…...
