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。
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
本文介绍了如何在Linux系统中通过mount命令和udev设备管理器实现U盘、CF卡和SD卡的自动挂载与热插拔。首先,讲解了mount命令和udev的基本概念,然后详细阐述了创建udev规则文件和挂载脚本的过程。通过在/etc/udev/rules.d/目录下创建规则文件,并编写挂载脚本usb_udev.sh,实现了设备插入和移除时的自动挂载和卸载操作。此外,还解决了可能出现的Udev规则不生效的问题,通过修改systemd-udevd.service文件并重启服务来确保功能正常。最后,提供了参考资料链接以便进一步学习。

1688

被折叠的 条评论
为什么被折叠?



