zoukankan      html  css  js  c++  java
  • (转) 嵌入式 Linux 利用 udev 实现自动检测挂载U盘

    本文链接:https://blog.csdn.net/cfl927096306/article/details/95180940

    udev配置文件是/etc/udev/udev.conf,也许长这样:

    # udev.conf
    # The initial syslog(3) priority: "err", "info", "debug" or its
    # state can be changed with: "udevcontrol log_priority=<value>".
    udev_root="/dev/"
    udev_rules="/etc/udev/rules.d"
    udev_log="err"

    udev_rules这一行表示udev的规则存储的目录,这个目录存储的是以.rules结束的文件。每一个文件处理一系列规则来帮助udev分配名字给设备文件以保证能被内核识别。 
    一般/etc/udev/rules.d下面可能有好几个udev规则文件,这些文件一部分是udev包安装的,另外一部分则是可能是别的硬件或者软件包生成的。这些规则文件的文件名通常是两个数字开头,它表示系统应用该规则的顺序,数字越小优先级越高。

    /etc/udev/rules.d/11-usb-hotplug.rules  检测U盘的文件也许长这样:

    KERNEL=="sd*", SUBSYSTEM=="block", RUN+="/etc/udev/disk-hotplug.sh"

     这一行字面意思可以理解为有节点 /dev/sd* 创建的话,就会去执行 /etc/udev/disk-hotplug.sh 这个脚本
    sd*的*是通配符,包含sda/sda1/sda2...,sdb/sdb1/sdb2...

    /etc/udev/disk-hotplug.sh 可以这样写:

    #!/bin/sh
    ################################################################################
    #    Create By Czy
    ################################################################################
     
    ################################################################################
    CONSOLE=/dev/ttyAMA0
    ################################################################################
    show_env ()
    {
        local RED="33[31m"
        local NORMAL="33[00m"
        {
            echo -e ${RED}"ACTION=$ACTION"           ${NORMAL}
            echo -e ${RED}"DEVNAME=$DEVNAME"         ${NORMAL}
            echo -e ${RED}"DEVTYPE=$DEVTYPE"         ${NORMAL}
            echo -e ${RED}"DEVPATH=$DEVPATH"         ${NORMAL}
            echo -e ${RED}"SUBSYSTEM=$SUBSYSTEM"     ${NORMAL}
            echo -e ${RED}"SEQNUM=$SEQNUM"           ${NORMAL}
        } > ${CONSOLE}
    }
    ################################################################################
    add_usb ()
    {
        if [ ss"$SUBSYSTEM" != ss"block" ]; then
            return 1
        fi
        
        if [ ss"$DEVTYPE" != ss"partition" ]; then
            return 1
        fi
        
        show_env
        
        if [ -e $DEVNAME ]; then    
            echo "add_usb..." > ${CONSOLE}
            mount $DEVNAME /mnt
            sync
        fi
    }
    ################################################################################
    remove_usb ()
    {
        if [ ss"$SUBSYSTEM" != ss"block" ]; then
            return 1
        fi
        
        if [ ss"$DEVTYPE" != ss"partition" ]; then
            return 1
        fi
        
        show_env
        
        echo "remove_usb..." > ${CONSOLE}
        umount /mnt
    }
    ################################################################################
    hotplug_usb ()
    {
        case "$ACTION" in
        "add"    )
            add_usb
        ;;
        "remove" )
            remove_usb
        ;;
        * )
            echo "Not recognise ACTION:${ACTION}" > ${CONSOLE}
        ;;
        esac
     
        return 0
    }
    ################################################################################
     
    hotplug_usb

    这样既可实现自动检测U盘挂载

    CONSOLE=/dev/ttyAMA0  这一句要改成实际用的

    测试结果贴一下

    想用C/C++在程序代码里监控USB事件的话,可以利用PF_NETLINK    NETLINK_KOBJECT_UEVENT来实现

    参考:https://blog.csdn.net/yangzhongxuan/article/details/8494570 https://blog.csdn.net/HAOMCU/article/details/7371801

  • 相关阅读:
    前端 时间转换为时间戳 时间戳转时间
    RT, 吞吐量,并发用户数,QPS名词解释
    Bluetooth开发资料的收集
    Day20_学成在线项目就业指导
    Day20_docker相关xml
    Day20_Jenkins安装文档
    八段锦口诀
    Day20_GitLab安装文档
    Day20_GitCommand
    Day20_DevOps
  • 原文地址:https://www.cnblogs.com/schips/p/11658526.html
Copyright © 2011-2022 走看看