Linux 自动挂载U盘 实现热插拔

Linux 自动挂载U盘 实现热插拔

1、必备知识

  • mount 命令
  • udev 设备管理器

1.1 mount 命令

mount 命令是用于挂载Linux系统外的文件 具体参数: https://www.runoob.com/linux/linux-comm-mount.html

1.2 udev 设备管理器

什么是 Udev?

​ Udev 是 Linux 2.6 内核的设备管理器,它动态地在 /dev 目录中创建/删除设备节点。它是 devfs 和 hotplug 的继承者。它在用户空间运行,用户可以使用 Udev 规则更改设备名称。

​ Udev 依赖于 2.5 内核中引入的 sysfs 文件系统。sysfs 使设备在用户空间中可见。添加或删除设备时,会产生内核事件,通知用户空间中的 Udev。

​ 资料链接:udev简介udev手册

2、实操

​ 进入/etc/udev/rules.d目录下,创建一个usb自动挂载的规则文件10-usb.rules

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

规则文件写好后,我们这里进行挂载文件的脚本编写usb_udev.sh

#!/bin/bash

MNT_PATH=/media/        #挂载移动设备的目录
DEV_PRE=$1              #参数1:挂载点的前缀
DEV_NAME=$2             #参数2:设备在/dev下的名字
if [ $ACTION == "add" ]; then
    /usr/bin/mkdir -p $MNT_PATH$DEV_PRE-$DEV_NAME
    /usr/bin/mount /dev/$DEV_NAME $MNT_PATH$DEV_PRE-$DEV_NAME   #这里可根据 which mount 来产看自己的mount在什么位置
    if [[ $? -ne 0 ]]; then
        /usr/bin/rmdir $MNT_PATH$DEV_PRE-$DEV_NAME
    fi
elif [ $ACTION == "remove" ]; then 
    if [[ -e  $MNT_PATH$DEV_PRE-$DEV_NAME ]] ; then 
        /usr/bin/umount $MNT_PATH$DEV_PRE-$DEV_NAME
        /usr/bin/rmdir  $MNT_PATH$DEV_PRE-$DEV_NAME
    fi
fi
exit 0

编写完成后,需要将脚本文件加上可执行权限,chmod +x usb_udev.sh。以上规则和脚本取材于:https://zhuanlan.zhihu.com/p/357314668。

其实编写到这里的时候已经完成了自动挂载功能,但是也有可能会出现挂载磁盘的 Udev 规则不起作用的情况。这里参考https://newbedev.com/udev-rule-to-mount-disk-does-not-work 得到解决。

 在/usr/lib/systemd/system/systemd-udevd.service文件添加相关配置
[Service]
PrivateMounts=no
MountFlags=shared 
完事儿后保存配置并重启服务
sudo systemctl daemon-reload
sudo service systemd-udevd --full-restart

到这里就能正常挂载了。

综上参考链接如下:

https://zhuanlan.zhihu.com/p/357314668

https://newbedev.com/udev-rule-to-mount-disk-does-not-work

https://www.runoob.com/linux/linux-comm-mount.html

  • 3
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
将可移动设备连入系统时,系统的后台中会依次发生如下事件: l 内核检测到新硬件插入,然后分别通知hotplug和udev。前者用来装入相应的内核模块(如usb-storage),而后者用来在/dev中创建相应的设备节点(如/dev/sda1)。 l udev创建了相应的设备节点之后,会将这一消息通知hal的守护程序(hald)。当然udev还得保证新创建的设备节点可以被普通用户访问。 l hotplug装入了相应的内核模块之后,会把这一消息通知给hald。 l hald在受到hotplug和udev发出的消息之后,认为新硬件已经正式被系统认可了。此时它会通过一系列精心编写的规则文件(就是传说中的xxx-policy.fdi),把发现新硬件的消息通过dbus发送出去,同时还会调用update-fstab或fstab-sync来更新/etc/fstab,为相应的设备节点创建适合的挂载点。 l 卷管理器会监听dbus中发现新硬件的消息。根据所插入的硬件(区分U盘和数码相机等)不同,卷管理器会先将相应的设备节点挂载到hald创建的挂载点上,然后再打开不同的应用程序。 当然,如果是在CDROM中插入光盘,过程可能比较简单。因为CDROM本身就是一个固定的硬件,无需hotplug和udev的协助: l hald会自己监视CDROM,并且将光盘托架开合的消息通过dbus发出去。 l 卷管理器负责检查CDROM中的盘片内容,进行挂载,并调用合适的应用程序。 要注意,hald的工作是从上游得到硬件就绪的消息,然后将这个消息转发到dbus中。尽管它会调用程序来更新fstab,但实际上它自己并不执行挂载的工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值