udev 设备管理器
Udev 是 Linux 2.6 内核的设备管理器,它动态地在 /dev 目录中创建/删除设备节点。它是 devfs 和 hotplug 的继承者。它在用户空间运行,用户可以使用 Udev 规则更改设备名称。
Udev 依赖于 2.5 内核中引入的 sysfs 文件系统。sysfs 使设备在用户空间中可见。添加或删除设备时,会产生内核事件,通知用户空间中的 Udev。
/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
完成上诉步骤后,还需要修改udev对应的服务配置
debian 10 是在 /lib/systemd/system/udev.service /lib/systemd/system/systemd-udevd.service
其他linux系统可能不一样例如/usr/lib/systemd/system/systemd-udevd.service 等
修改参数如下
[Service] PrivateMounts=no MountFlags=shared (如没有也可不加)
保存配置并重启服务
sudo systemctl daemon-reload
sudo service systemd-udevd --full-restart
U盘拷贝数据:
如是数据不大,可以直接在上面脚本中添加对应命令即可。
如果数据大则不行,因为udev调用到的脚本都不会允许长时间运行,会被强制性kill掉,哪怕使用 nohup 或者 setsid 等开启进程进行拷贝。
所有得有独立于udev的进程服务实现拷贝。
可以使用c代码使用udev相关库编写服务程序,或则通过管道通信通知自定义开机启动服务程序完成数据拷贝。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· Docker 太简单,K8s 太复杂?w7panel 让容器管理更轻松!