某些场景下,服务器可能没有必要的键盘等输入设备、屏幕等输出设备。此时需要在没有人为干预的情况下实现当插入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的运行方式改为共享。
修改方式如下:

    1. 拷贝一份 /usr/lib/systemd/system/systemd-udevd.service/etc/systemd/system/ (推荐)
    2. 编辑/etc/systemd/system/MountFlags 改为 shared
    3. 重启即可。

最新文章

  1. tracert-命令小结
  2. js常用
  3. win8.1 user profile service 服务登录失败
  4. 所有设备的CSS像素
  5. linux设置tomcat开机启动
  6. python学习笔记七--数据操作符
  7. mongodb集成spring
  8. Qt WebEngine 网页交互
  9. createDocumentFragment
  10. 新特性GTID
  11. Solr 01 - 什么是Solr + Solr安装包目录结构说明
  12. java_List集合及其实现类
  13. 第六节:WebApi的部署方式(自托管)
  14. 从虚拟dom了解vue渲染函数
  15. 关于mybatis中传入一个List,字符串数组,或者Map集合作为查询条件的参数
  16. CPU火焰图
  17. HTTP Status 404(The requested resource is not available)的几种解决方案
  18. !important的用法
  19. Cmake入门资料
  20. UOJ.26.[IOI2014]Game(交互 思路)

热门文章

  1. mongo分布式锁Java实现
  2. iOS用contenteditable滚动时,光标不会刷新定位的处理方法
  3. RAD Studio 10 up1欢迎页证书不可用
  4. 多线程编程-- part 5.2 JUC锁之Condition条件
  5. idea使用问题总结
  6. 多线程 - 线程通信 suspend-resume wait-notify park-unpark 伪唤醒
  7. vim快速到行尾
  8. [转帖]微軟将从 .NET 4 以后的版本弃用 System.Data.OracleClient
  9. 关于nmap扫描端口
  10. 【leetcode】1266. Minimum Time Visiting All Points