前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >linux使用udev配置U盘自动挂载

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

原创
作者头像
happlyfox
修改2021-03-04 09:48:53
8.6K0
修改2021-03-04 09:48:53
举报
文章被收录于专栏:技术开源分享技术开源分享

udev介绍

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

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

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

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

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

执行脚本

代码语言:javascript
复制
cd /tmp

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

代码语言:javascript
复制
echo `date` >> /tmp/trigger.log

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

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

udev脚本

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

代码语言:javascript
复制
$ su
# udevadm monitor

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

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

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

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

代码语言:javascript
复制
SUBSYSTEM=="block", ACTION=="add", RUN+="/etc/udev/trigger.sh"

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

启动配置规则

代码语言:javascript
复制
udevadm control —reload

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

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

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

实战

配置u盘插入自动挂载

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

udev规则文件

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

代码语言:javascript
复制
###########---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的执行权限也无法执行

代码语言:javascript
复制
#! /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
​

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 使用udev进行一个简单的配置
    • 执行脚本
      • udev脚本
      • 实战
        • 配置u盘插入自动挂载
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档