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

news/2024/7/24 8:39:36 标签: linux, 运维, 服务器

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.niftyadmin.cn/n/5266093.html

相关文章

新手HTML和CSS的常见知识点

​​​​ 目录 1.HTML标题标签&#xff08;到&#xff09;用于定义网页中的标题&#xff0c;并按照重要性递减排列。例如&#xff1a; 2.HTML段落标签&#xff08;&#xff09;用于定义网页中的段落。例如&#xff1a; 3.HTML链接标签&#xff08;&#xff09;用于创建链接…

人工智能与低代码:前端技术的双重变革

随着科技的飞速发展&#xff0c;人工智能&#xff08;AI&#xff09;和低代码开发平台已经成为当下热门的话题。在前端技术领域&#xff0c;这两大技术的崛起正在悄然改变开发模式&#xff0c;提高开发效率&#xff0c;降低技术门槛。本文将从以下几个方面&#xff0c;详细探讨…

用python编写九九乘法表

1 问题 我们在学习一门语言的过程中&#xff0c;都会练习到编写九九乘法表这个代码&#xff0c;下面介绍如何编写九九乘法表的流程。 2 方法 &#xff08;1&#xff09;打开pycharm集成开发环境&#xff0c;创建一个python文件&#xff0c;并编写第一行代码&#xff0c;主要构建…

四级作文考前积累(个人蒟蒻向)

观点类 With the giant leap of the economy,nowdays the youngsters have different opinions upon gratuation Some think that....,while others think that.... Personally ,i perfer the former,the letter. The following reasons can account for my preference. Fi…

SQL Server判断数据库、表、列、视图、存储过程、函数是否存在

一、前言概述 在写一些业务逻辑相对复杂点的存储过程的时候&#xff0c;经常会用到临时表或者数据表作为临时结果的保存。但每次在作表是否存在的判断时&#xff0c;往往想不起完整的SQL写法。因此&#xff0c;记录一些常用的数据库对象是否存在的判断方法&#xff0c;可以达到…

SSM—Mybatis

目录 和其它持久化层技术对比 搭建MyBatis 开发环境 创建maven工程 创建MyBatis的核心配置文件 创建mapper接口 创建MyBatis的映射文件 通过junit测试功能 加入log4j日志功能 核心配置文件详解 MyBatis的增删改查 新增 删除 修改 查询一个实体类对象 查询list集…

【C++】特殊类设计及单例模式

1.设计一个只能在堆上创建对象的类 实现方式&#xff1a; 将类的构造函数私有&#xff0c;拷贝构造声明成私有。防止别人调用拷贝在栈上生成对象。提供一个静态的成员函数&#xff0c;在该静态成员函数中完成堆对象的创建。代码示例如下&#xff1a; class HeapOnly { publi…

2023,真人漫改走上IP高地

你能接受自己的纸片人老公/老婆变成了真人吗&#xff1f; 无论大家能不能接受&#xff0c;真人漫改都已经成为了影视行业的新趋势&#xff0c;而阅文集团收购腾讯动漫的举措&#xff0c;无疑是为漫改剧添了一把火。 在阅文宣布以6亿人民币的价格收购腾讯动漫旗下的相关业务以…