linux 实现U盘自动挂载
2024-08-23 23:12:18
某些场景下,服务器可能没有必要的键盘等输入设备、屏幕等输出设备。此时需要在没有人为干预的情况下实现当插入U盘或者硬盘后自动挂载,并执行某些脚本动作。以下是我的实践过程。
必要组件
- udev,udisks
- busybox (需要用到blkid)可以直接获取到设备的卷标,这样就可以指定挂载路径名称了。
实现
规则编写
编写udev规则实现U盘插入时候的动作。规则文件写在/etc/udev/rules.d
下。
如上, 通过规则定义U盘插入与拔出的动作即可,动作的具体实现可以在规则中编写,也可以通过指定执行脚本来实现。本文的规则中仅指定执行脚本。
规则如下:
ENV{DEVTYPE}="partition",RUN+="/lib/udev/automount.sh",ENV{REMOVE_CMD}="/lib/udev/autounmount.sh"
- 1
脚本编写
将脚本文件写在/lib/udev
下,根据上文规则,应该分别实现插入的动作脚本和拔出的动作脚本。
插入动作脚本
主要在于需要获取到设备的卷标,来确定挂载的路径(即$ID_FS_LABEL
)
#!/bin/sh
mount_point=$ID_FS_LABEL
if [ -z $mount_point ];then
mount_point=${DEVNAME##*/}
fi
if [ -n $mount_point ];then
mkdir -p /media/$mount_point
mount -t $ID_FS_TYPE -o gid=100,dmask=000,fmask=111,utf8,flush,rw,noatime,users $DEVNAME /media/$mount_point
fi
拔出动作脚本
在U盘拔出时候,及时删掉挂载的路径
mount_point=$ID_FS_LABEL
if [ -z $mount_point ];then
mount_point=${DEVNAME##*/}
fi
if [ -n $mount_point ];then
umount -l /media/$mount_point
rm -r /media/$mount_point
fi
自动执行动作脚本
这样,当U盘插入时,/media/
下就会出现于卷标相同的文件夹,并挂载上了U盘。因此,需要实现U盘插入自动执行的话,通过轮询探测/media/
下相应目录是否存在即可。
如:
UDISK=$1
# ---------------main control area ---------------
while (true)
do
# probe mounted disk
if [ -e "$UDISK" ];then
echo "Mounted device [$UDISK] found !"
else
echo "Device not found [$UDISK] !"
fi
echo "Sleep for sometime..."
sleep 3s
done
需要注意的问题
新版本的udev可能会遇到mount失效的问题,通过查询资料可知,udev的rules运行于独立的文件空间上,与用户的文件空间不同,因此及时挂载上了,用户也无法访问。因此需要将udev的运行方式改为共享。
修改方式如下:
- 拷贝一份
/usr/lib/systemd/system/systemd-udevd.service
到/etc/systemd/system/
(推荐) - 编辑
/etc/systemd/system/
将MountFlags
改为shared
- 重启即可。
最新文章
- tracert-命令小结
- js常用
- win8.1 user profile service 服务登录失败
- 所有设备的CSS像素
- linux设置tomcat开机启动
- python学习笔记七--数据操作符
- mongodb集成spring
- Qt WebEngine 网页交互
- createDocumentFragment
- 新特性GTID
- Solr 01 - 什么是Solr + Solr安装包目录结构说明
- java_List集合及其实现类
- 第六节:WebApi的部署方式(自托管)
- 从虚拟dom了解vue渲染函数
- 关于mybatis中传入一个List,字符串数组,或者Map集合作为查询条件的参数
- CPU火焰图
- HTTP Status 404(The requested resource is not available)的几种解决方案
- !important的用法
- Cmake入门资料
- UOJ.26.[IOI2014]Game(交互 思路)
热门文章
- mongo分布式锁Java实现
- iOS用contenteditable滚动时,光标不会刷新定位的处理方法
- RAD Studio 10 up1欢迎页证书不可用
- 多线程编程-- part 5.2 JUC锁之Condition条件
- idea使用问题总结
- 多线程 - 线程通信 suspend-resume wait-notify park-unpark 伪唤醒
- vim快速到行尾
- [转帖]微軟将从 .NET 4 以后的版本弃用 System.Data.OracleClient
- 关于nmap扫描端口
- 【leetcode】1266. Minimum Time Visiting All Points