10

linux使用udev配置U盘自动挂载

 3 years ago
source link: https://my.oschina.net/u/3081398/blog/5034214
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

作者:三十三重天

博客:http://www.zhouhuibo.club

通过学习和分享的过程,将自己工作中的问题和技术总结输出,希望菜鸟和老鸟都能通过自己的文章收获新的知识,并付诸实施。

udev介绍

来源:https://linux.cn/article-10329-1.html

创建这样一个脚本,当指定的设备插入时触发你的计算机去做一个指定动作。

udev 是一个为你的计算机提供设备事件的 Linux 子系统。通俗来讲就是,当你的计算机上插入了像网卡、外置硬盘(包括 U 盘)、鼠标、键盘、游戏操纵杆和手柄、DVD-ROM 驱动器等等设备时,代码能够检测到它们。这样就能写出很多可能非常有用的实用程序,而它已经很好了,普通用户就可以写出脚本去做一些事情,比如当某个硬盘驱动器插入时,执行某个任务。

使用udev进行一个简单的配置

使用udev进行一个简单配置,配置后的实际表现为:当U盘插入机器时,向系统/tmp目录生成一个写入当前系统时间的文本文件

cd /tmp

打开你喜欢的文本编辑器,然后输入下面的简单脚本:

echo `date` >> /tmp/trigger.log

向临时目录写入当前时间,脚本名称保存为trigger.sh.并执行并运行 chmod +x 授予可运行权限

接下来就是通过udev的方式去触发此脚本

udev脚本

使用 udevadm monitor 命令你可以实时利用 udev,并且可以看到当你插入不同设备时发生了什么。用 root 权限试一试。

$ su
# udevadm monitor

udevadm monitor 命令提供了许多很好的信息,但是你可以使用 udevadm info 命令以更好看的格式来看到。你也可以通过fdisk -l命令查看当前已经分配的卷标。

udev的规则都保存在/etc/udev/rules.d目录下,通过命令cd /etc/udev/rules.d`切换置当前目录。

新增一个测试规则,规则后缀使用.rules才能够被程序识别。

使用编辑器写入如下内容,保存为001.rules

SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/trigger.sh"

文件的内容解释为:当有一个usb设备新增的时候,执行定义的脚本文件。当然你也可以通过更多的个性化配置让触发的范围更加精细话,例如可以指定某个品牌的设备,或者单独的某个U盘。这些可以通过百度查询到内容,也可以在上门的链接中获得内容。

启动配置规则

udevadm control —reload

此时可以通过插入u盘,查看系统盘符下是否会生成trigger文件,并包含当前日期。如果不行,可能有俩个问题

1、脚本文件需要设置在/etc/udev/rules.d/目录下,我也不知道 为什么,当脚本放置在当前文件中就可以执行,如果有知道的请在评论区告诉我

2、有些时候重置配置规则没用,使用重启

配置u盘插入自动挂载

执行过程:使用udev配置规则,规则是当检测到u盘插入时执行一段脚本【自动挂载脚本】,当u盘拔出时也执行一段脚本【自动卸载u盘脚本】。在实际使用过程中可以将挂载和卸载脚本放置在一个中,根据参数进行区分。首先开始配置规则

udev规则文件

010.rules,放置在/etc/udev/rules.d 目录下

###########---USB---################
#----------------------------------#
KERNEL=="sd[a-z]*", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh usb %k"
KERNEL=="sd[a-z]*", SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh usb %k", OPTIONS="last_rule"
##########---CF card---#############
#----------------------------------#
KERNEL=="hd[a-z]*", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh cf %k"
KERNEL=="hd[a-z]*", SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh cf %k", OPTIONS="last_rule"
#########-----SD------##############
#----------------------------------#
KERNEL=="mmcblk[0-9]*", SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh sd %k" 
KERNEL=="mmcblk[0-9]*", SUBSYSTEM=="block", ACTION=="remove", RUN+="/etc/udev/rules.d/zhiyuan_udev.sh sd %k", OPTIONS="last_rule"

然后编写执行脚本内容[zhiyuan_udev.sh] ,也放置在相同的目录/etc/udev/rules.d中,放在其他的目录就算给了777的执行权限也无法执行

#! /bin/sh

#一般U盘插入之后会在/dev下产生一个sda和一个sda1节点,
#但是只有sda1是可以挂载的。sda是设备,sda1是分区
#有的U盘只会产生一个/dev/sda节点,此时就应该挂载sda。
#这个脚本不区分设备节点和分区节点,一律先挂载,
#但是挂载失败之后会立即清除建立的挂载点
#-------------------------------------------------#
#磁盘种类		设备节点			设备分区节点
#U盘			sd[a-z]				sd[a-z][0-9]
#SD卡			mmcblk[0-9]			mmcblk[0-9]p[0-9]
#CF卡			hd[a-z]				hd[a-z][0-9]
#-------------------------------------------------#
#说明:在这个脚本中的可以把udev脚本的ACTION作为环境变量来用,
#但是无法使用KERNEL
#-------------------------------------------------#
if [ $# -ne 2 ] ; then	#输入参数必须是两个
	exit 1
fi

MNT_PATH=/media/		#挂载移动设备的目录
#DEV_PRE=$1				#参数1:挂载点的前缀
DEV_NAME=$2				#参数2:设备在/dev下的名字
FS_TYPE=vfat			#设备的文件系统类型

if [ $ACTION == "add" ] ; then
#设备插入
#	echo "=======add==========" >> /media/udev.txt
	wr /bin/mkdir -p $MNT_PATH$DEV_NAME
	/bin/mount /dev/$DEV_NAME $MNT_PATH$DEV_NAME >& /dev/null
	if [[ $? -ne 0 ]] ; then #mount失败则清除刚刚建立的目录
#		echo "mount $DEV_NAME fialed" >> /media/udev.txt
		wr /bin/rmdir $MNT_PATH$DEV_NAME	
	fi
elif [ $ACTION == "remove" ] ; then 
#	echo "=======remove==========" >> /media/udev.txt
#设备移除
	if [[ -e  $MNT_PATH$DEV_NAME ]] ; then 
		/bin/umount -l  $MNT_PATH$DEV_NAME >& /dev/null
		wr /bin/rmdir  $MNT_PATH$DEV_NAME
	fi
fi

exit 0

欢迎关注公众号 程序员工具集 👍👍 致力于分享优秀的开源项目、学习资源 、常用工具

回复关键词“关注礼包”,送你一份最全的程序员技能图谱。

回复关键词"wx"添加个人微信,勾搭作者,欢迎来聊^-^。


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK