您的当前位置:首页正文

6.Linux的U盘自动挂载

2024-11-26 来源:个人技术集锦

有两种方式可以实现,一种是用udev服务来管理USB设备(以U盘为例),一种是自写脚本,通过不断刷描/dev/sda*里面U盘端口是否存在,以确定U盘已经插入,然后执行挂载。通常采用udev服务来实现自动挂载,因为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"
显示全文