Linux如何自动挂载U盘

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

脚本编写

将脚本文件写在/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
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值