您的位置:首页 > 运维架构 > Linux

Linux如何自动挂载U盘

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

拔出动作脚本

在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
1
2
3
4
5
6
7
8
9
10
11
12
13

需要注意的问题

新版本的udev可能会遇到mount失效的问题,通过查询资料可知,udev的rules运行于独立的文件空间上,与用户的文件空间不同,因此及时挂载上了,用户也无法访问。因此需要将udev的运行方式改为共享。

修改方式如下:

拷贝一份
/usr/lib/systemd/system/systemd-udevd.service
/etc/systemd/system/
(推荐)
编辑
/etc/systemd/system/
MountFlags
改为
shared

重启即可。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: