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

news2024/10/6 12:20:23

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/console

if [ "$1" == "" ]; then
        echo "parameter is none" > /tmp/error.txt
        exit 1
fi

MNT=$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" ]; then
        mounted=`mount | grep $1 | wc -l`
        if [ $mounted -ge 1 ]; then
                # mounted, assume the ACTION is remove
                #ACT=Xremove
                # only set add for initial population
                ACT=Xadd
        else
                # not mounted, assume the ACTION is add
                ACT=Xadd
        fi
else
        ACT=$2
fi

if [ "$ACT" = "Xremove" ]; then
        # umount the device
        echo "$ACT /mnt/$1" >> /tmp/mdev.log
        if ! umount -l "/mnt/$1"; then
                exit 1
        else
                rm -f "/mnt/$MNT"
                echo "[Umount FS]: /dev/$1 -X-> /mnt/$MNT" > /dev/console
        fi

        if ! rmdir "/mnt/$1"; then
                exit 1
        fi
else
        # mount the device
        mounted=`mount | grep $1 | wc -l`
        #echo "par=$1,mounted=$mounted,MNT=$MNT" > /dev/console
        if [ $mounted -ge 1 ]; then
                #echo "device $1 is already mounted" > /dev/console
                exit 0
        fi

        if ! mkdir -p "/mnt/$1"; then
                exit 1
        fi

        if [ $(echo $1 | grep mtd) ]; then
                if mount -t jffs2 "/dev/$1" "/mnt/$1"; then
                        echo "[Mount JFFS2]: /dev/$1 --> /mnt/$MNT" > /dev/console
                        echo "$ACT /mnt/$1" >> /tmp/mdev.log
                elif mount -t yaffs2 -o"inband-tags" "/dev/$1" "/mnt/$1"; then
                        echo "[Mount YAFFS2]: /dev/$1 --> /mnt/$MNT" > /dev/console
                        echo "$ACT /mnt/$1" >> /tmp/mdev.log
                elif mount -t ubifs "/dev/$1" "/mnt/$1"; then
                        echo "[Mount UBIFS]: /dev/$1 --> /mnt/$MNT" > /dev/console
                        echo "$ACT /mnt/$1" >> /tmp/mdev.log
                else
                        # failed to mount, clean up mountpoint
                        if ! rmdir "/mnt/$1"; then
                                exit 1
                        fi
                fi
        else
                # try vfat only
                if mount -t vfat -o noatime,shortname=mixed,utf8 "/dev/$1" "/mnt/$1"; then
                        ln -s /mnt/$1 /mnt/$MNT
                        echo "[Mount VFAT]: /dev/$1 --> /mnt/$MNT" > /dev/console
                        echo "$ACT /mnt/$1" >> /tmp/mdev.log
                else
                        # failed to mount, clean up mountpoint
                        if ! rmdir "/mnt/$1"; then
                                exit 1
                        fi
                        exit 1
                fi
        fi
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

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1314307.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

github 学习番外篇

我们可以按照仓库开始的提示提交仓库 不知道为什么 出现了 我用 git branch 查看了一下&#xff0c;竟然没发现分支 后来发现是只有commit以后才会显示这个分支 后来显示 这是因为本地和远程仓库不同步的原因 这时候我们就需要git pull 一下 发现两个仓库由于不关联不能git…

垃圾回收 (GC) 在 .NET Core 中是如何工作的?

提起GC大家肯定不陌生&#xff0c;但是让大家是说一下GC是怎么运行的&#xff0c;可能大多数人都不太清楚&#xff0c;这也很正常&#xff0c;因为GC这东西在.NET基本不用开发者关注&#xff0c;它是依靠程序自动判断来释放托管堆的&#xff0c;我们基本不需要主动调用Collect(…

山峰个数 - 华为OD统一考试

OD统一考试 分值: 100分 题解: Java / Python / C++ 题目描述 给定一个数组,数组中的每个元素代表该位置的海拔高度。0表示平地,>=1时表示属于某个山峰,山峰的定义为当某个位置的左右海拔均小于自己的海拔时,该位置为山峰。数组起始位置计算时可只满足一边的条件。 …

原子学习笔记1——阻塞和非阻塞IO

阻塞式 I/O 顾名思义就是对文件的 I/O 操作&#xff08;读写操作&#xff09;是阻塞式的&#xff0c;非阻塞式 I/O 同理就是对文件的I/O 操作是非阻塞的。 当对文件进行读操作时&#xff0c;如果数据未准备好、文件当前无数据可读&#xff0c;那么读操作可能会使调用者阻塞&…

Linux---cp和mv命令选项

1. cp命令选项 命令选项说明-i交互式提示-r递归拷贝目录及其内容-v显示拷贝后的路径描述-a保留文件的原有权限 cp -i命令选项效果图: cp -r命令选项效果图: cp -v命令选项效果图: cp -a命令选项效果图: -a选项说明: -a 选项还支持拷贝文件夹并且文件夹中的文件权限不丢失 …

WPF-附加属性《十二》

非常重要 依赖属性和附加属性&#xff0c;两者是有关系的&#xff0c;也是有些区别的&#xff0c;很多时候&#xff0c;可能会把两者混淆了。 附加属性&#xff08;Attach Property&#xff09; 顾名思义&#xff0c;就是附加上面的属性&#xff0c;自身是没有的&#xff0c;…

详解Keras3.0 KerasCV API: StableDiffusion image-generation model

Stable Diffusion 图像生成模型&#xff0c;可用于根据简短的文本描述&#xff08;称为“提示”&#xff09;生成图片 keras_cv.models.StableDiffusion(img_height512, img_width512, jit_compileTrue) 参数说明 img_height&#xff1a;int&#xff0c;要生成的图像的高度…

TCP/IP详解——UDP 协议

文章目录 1. UDP1.1 UDP 头部1.2 UDP 校验和1.3 UDP 传输过程1.4 UDP-Lite1.5 最大 UDP 数据报长度1.6 UDP 输入队列 1. UDP UDP&#xff1a;用户数据报协议&#xff08;User Datagram Protocol&#xff09;面向无连接的&#xff0c;也就是无需建立连接&#xff0c;传输不可靠。…

PDF转为图片

PDF转为图片 背景pdf展示目标效果 发展过程最终解决方案&#xff1a;python PDF转图片pdf2image注意&#xff1a;poppler 安装 背景 最近接了一项目&#xff0c;主要的需求就是本地的文联单位&#xff0c;需要做一个电子刊物阅览的网站&#xff0c;将民族的刊物发布到网站上供…

音视频参数介绍

一、视频参数概念 单个视频帧&#xff1a;可以简单地理解成为一张图片 单个视频帧主要的参数概念&#xff1a; 分辨率&#xff1a; 分辨率是指图像或显示器上像素的数量&#xff0c;通常用横向像素数乘以纵向像素数表示。例如&#xff0c;1920x1080 表示宽度为1920像素&…

数据结构 | Log-Structured Merge Tree (LSM Tree)

今天介绍LSM Tree这个数据结构&#xff0c;严格意义上来说&#xff0c;他并不像他的名字一样是一棵树型的数据结构&#xff0c;而更多是一种设计思想。 LSM Tree最先在1996年被提出&#xff0c;后来被广泛运用于现代NoSQL&#xff08;非关系型数据库&#xff09;系统中&#xf…

【Spark精讲】Spark与MapReduce对比

目录 对比总结 MapReduce流程 ​编辑 MapTask流程 ReduceTask流程 MapReduce原理 阶段划分 Map shuffle Partition Collector Sort Spill Merge Reduce shuffle Copy Merge Sort 对比总结 Map端读取文件&#xff1a;都是需要通过split概念来进行逻辑切片&…

CSS新手入门笔记整理:CSS常用属性表

字体样式 属性 属性值 说明 font-family 微软雅黑/苹方 字体类型 font-size 数值 字体大小 font-weight 数值/关键字 字体粗细&#xff08;字重&#xff09; font-style normal&#xff08;正常(默认值)&#xff09;italic&#xff08;斜体&#xff09;oblique&am…

湖南财信:灰盒测试筑牢安全防线,保障差异化金融服务体系建设

湖南财信是国有独资公司&#xff0c;湖南省唯一的省级地方金融控股公司、省属国有大型骨干企业。湖南财信坚持金融科技战略&#xff0c;以数字化建设为驱动&#xff0c;创新融资服务手段&#xff0c;逐步打造出差异化产品与数字化服务体系&#xff0c;全方位、多维度推动金融服…

大语言模型:开启自然语言处理新纪元

导言 大语言模型&#xff0c;如GPT-3&#xff08;Generative Pre-trained Transformer 3&#xff09;&#xff0c;标志着自然语言处理领域取得的一项重大突破。本文将深入研究大语言模型的基本原理、应用领域以及对未来的影响。 1. 简介 大语言模型是基于深度学习和变压器&…

WPF 基于TableControl的页面切换

文章目录 前言其它项目的UserControl切换TableControl添加按钮&#xff0c;隐去TableItem的Header 结论 前言 我想用WPF简单实现一个按钮视图切换的效果&#xff0c;但是我发现别人的实现效果非常的麻烦。 其它项目的UserControl切换 我网上找了个开源的项目&#xff0c;他是…

网络协议 - HTTP 协议详解

网络协议 - HTTP 协议详解 一 、基础概念URL请求和响应报文1. 请求报文2. 响应报文 二、HTTP 方法GETHEADPOSTPUTPATCHDELETEOPTIONSCONNECTTRACE 三、HTTP 状态码1XX 信息2XX 成功3XX 重定向4XX 客户端错误5XX 服务器错误 四、HTTP 首部通用首部字段请求首部字段响应首部字段实…

如何提升数据结构方面的算法能力?

谈及为什么需要花时间学算法&#xff0c;我至少可以列举出三个很好的理由。 (1)性能&#xff1a;选择正确的算法可以显著提升应用程序的速度。仅就搜索来说&#xff0c;用二分查找替 换线性搜索就能为我们帶来巨大的收益。 (2)安全性&#xff1a;如果你选用了错误的算法&…

软件供应链投毒 — NPM 恶意组件分析

聚焦源代码安全&#xff0c;网罗国内外最新资讯&#xff01; 专栏供应链安全 数字化时代&#xff0c;软件无处不在。软件如同社会中的“虚拟人”&#xff0c;已经成为支撑社会正常运转的最基本元素之一&#xff0c;软件的安全性问题也正在成为当今社会的根本性、基础性问题。 随…

最新Redis7主从复制(保姆级教程)

前提准备&#xff1a;三台云服务器&#xff08;吐血消费&#xff0c;点赞回血&#xff09;也可以使用虚拟机创建三台&#xff0c;但是我搞了一天也连接不上&#xff0c;要是又可以连接上的大家可以教我一下&#xff0c;也可以参考一下或者大家可以参考一下这个大佬的配置&#…