有两种方式可以实现,一种是用udev服务来管理USB设备(以U盘为例),一种是自写脚本,通过不断刷描/dev/sda*里面U盘端口是否存在,以确定U盘已经插入,然后执行挂载。通常采用udev服务来实现自动挂载,因为udev服务在很多系统都是预安装的。
2.根据原理,要实现自动挂载,需要三步:一是写一个执行脚本(实现挂载功能),二是写一个服务配置文件,服务执行的就是这个脚本,三是编写规则文件,使之能匹配到我们想要的USB设备(U盘)的拔插读写。
3. 与U盘挂载相关命令
udevadm monitor #监控USB插入或拔出,并将信息打印到终端
lsblk #查看当前所有挂载设备情况
mount [-t auto] [-o uid=pi] [-o pid=pi] [-o iocharset=utf8] [dev] [mountdir] #将dev挂载到mountdir下
umount [dev] #取消挂载设备
#!/usr/bin/bash
logfile=/home/biqu/printer_data/logs/usb_log
user=biqu
group=biqu
mountdir=/home/biqu/printer_data/gcodes/usb
[[ ! -e $logfile ]] && {
touch $logfile
}
logi() {
echo $1 >> $logfile
}
#权限检查
[[ `id -u` != 0 ]] && {
logi "Error:current tool need root permission"
exit 1
}
#参数检查
[[ ! $1 ]] && {
logi "Error: need one parameter to signate the usb-device"
exit 1
}
dev=/dev/${1##*/}
[[ ! -b $dev ]] && {
if grep /etc/mtab -qe "^$dev"; then
logi "$dev device already removed, so umount and clear media"
if umount $dev;then
exitcode=0
else
exitcode=$?
logi "Error: umount $dev errorcode:$exitcode"
fi
else
exitcode=0
logi "Device doesn't exist anymore or not a block device:$dev"
fi
#删除挂载点
rm -rf $mountdir
exit $exitcode
}
#使用blkid读取更多设备信息,eval将信息加进脚本
eval $(blkid -po export $dev)
[[ -z $TYPE ]] && {
logi "$dev has no known filesystem type, ignring mount request"
exit 0
}
#创建挂载点,并挂载设备到挂载点上
logi "Mount-dir:$mountdir,dev:$dev"
mkdir -p $mountdir
#必须加iocharset,不然有些系统可能挂上去文件名显示不正常
if mount -t auto -o uid=$user -o gid=$group -o iocharset=utf8 $dev $mountdir;then
username="$(ps au | awk '$11 ~/^xinit/ {print $1;exit}')"
[ $username ] && DISPLAY=:0 runuser -u $username xdg-open $mountdir
logi "Device successfully mounted:$mountdir"
exit 0
fi
logi "Error: mount-result:$?"
rm -rf $mountdir
exit 1
5.编写服务配置文件,以使udev可以以服务形式启动挂载脚本
[Unit]
Description=An usb device auto mount
[Service]
Type=forking
GuessMainPID=no
ExecStart=/usr/bin/xy_mount %I
6.编写规则
6.3编辑规则文件,文件中以#号开头表示注释,不会被匹配
KERNEL用于匹配内核设备名称,通常设备插入会出现在/dev/下面,如/dev/sda1
SUBSYSTEM,ACTION等都是匹配udevadm monitor中对应的属性名称的,其中最重要的ACTION,指示当前是add,remove等动作
RUN则是匹配到了,该执行什么操作,这里是启动上面的服务
#mount the device when added
KERNEL=="sd[a-z]*", SUBSYSTEM=="block", ACTION=="add", RUN+="/bin/systemctl --no-block restart yusb@%k.service"
#clean up after removal
KERNEL=="sd[a-z]*", SUBSYSTEM=="block", ACTION=="remove", RUN+="/bin/systemctl --no-block restart yusb@%k.service"