嵌入式Linux利用udev实现自动检测挂载U盘

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=".
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盘的文件也许长这样:

#
# Create By Czy
#

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="\033[31m"
	local NORMAL="\033[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  这一句要改成实际用的

测试结果贴一下

嵌入式Linux利用udev实现自动检测挂载U盘_第1张图片

 

想用C/C++在程序代码里监控USB事件的话,可以利用PF_NETLINK    NETLINK_KOBJECT_UEVENT来实现,参考这篇文章
https://blog.csdn.net/yangzhongxuan/article/details/8494570

https://blog.csdn.net/HAOMCU/article/details/7371801

你可能感兴趣的:(嵌入式Linux,udev,自动挂载U盘,嵌入式)