ubuntu实现自动挂载u盘和SD卡

编写shell脚本

shell 复制代码
vim /home/usb-mount.sh
shell 复制代码
#!/bin/bash

ACTION=$1
DEVBASE=$2
DEVICE="/dev/${DEVBASE}"

# See if this drive is already mounted
MOUNT_POINT=$(/bin/mount | /bin/grep ${DEVICE} | /usr/bin/awk '{ print $3 }')

do_mount()
{
    if [[ -n ${MOUNT_POINT} ]]; then
        # Already mounted, exit
        exit 1
    fi
	
    # Get info for this drive: $ID_FS_LABEL, $ID_FS_UUID, and $ID_FS_TYPE
    eval $(/sbin/blkid -o udev ${DEVICE})

    # Figure out a mount point to use
    LABEL=${ID_FS_LABEL}
    if [[ -z "${LABEL}" ]]; then
        LABEL=${DEVBASE}
    elif /bin/grep -q " /media/${LABEL} " /etc/mtab; then
        # Already in use, make a unique one
        LABEL+="-${DEVBASE}"
    fi
    MOUNT_POINT="/media/${LABEL}"

    /bin/mkdir -p ${MOUNT_POINT}

    # Global mount options
    OPTS="rw,relatime"

    # File system type specific mount options
    if [[ ${ID_FS_TYPE} == "vfat" ]]; then
        OPTS+=",users,gid=100,umask=000,shortname=mixed,utf8=1,flush"
    fi
    
    # 这里看需要使用sudo 和 <<EOF ,一些设备直接操作硬件SD卡槽需要root权限
    # 无需root权限 /bin/mount  ${DEVICE} ${MOUNT_POINT}   这样就行了
    sudo -S /bin/mount  ${DEVICE} ${MOUNT_POINT} << EOF
nle
EOF

   # 无需root权限 也可以用下面这一段代码
   # if ! echo "nle" | sudo /bin/mount -o ${OPTS} ${DEVICE} ${MOUNT_POINT}; then
   #     # Error during mount process: cleanup mountpoint
   #     /bin/rmdir ${MOUNT_POINT}
   #     exit 1
   # fi
	
}

do_unmount()
{
    if [[ -n ${MOUNT_POINT} ]]; then
        /bin/umount -l ${DEVICE}
    fi

    # Delete all empty dirs in /media that aren't being used as mount points. 
    for f in /media/* ; do
        if [[ -n $(/usr/bin/find "$f" -maxdepth 0 -type d -empty) ]]; then
            if ! /bin/grep -q " $f " /etc/mtab; then
                /bin/rmdir "$f"
            fi
        fi
    done
}
case "${ACTION}" in
    add)
        do_mount
        ;;
    remove)
        do_unmount
        ;;
esac
shell 复制代码
chmod 777 /home/usb-mount.sh

编写服务

shell 复制代码
vim /etc/systemd/system/usb-mount@.service
shell 复制代码
[Unit]
Description=Mount USB Drive on %i

[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/homeusb-mount.sh add %i
ExecStop=/home/usb-mount.sh remove %i

编写udev规则

shell 复制代码
vim /etc/udev/rules.d/99-local.rules
shell 复制代码
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service"
KERNEL=="sd[a-z][0-9]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"
KERNEL=="sd[a-z]", SUBSYSTEMS=="usb", ACTION=="add", RUN+="/bin/systemctl start usb-mount@%k.service"
KERNEL=="sd[a-z]", SUBSYSTEMS=="usb", ACTION=="remove", RUN+="/bin/systemctl stop usb-mount@%k.service"

# 这一段其实是 挂载mmc的SD卡或者TF卡的触发
KERNEL=="mmcblk[0-9]p[0-9]", SUBSYSTEMS=="mmc",ACTION=="add",  RUN+="/bin/systemctl start usb-mount@%k.service"
KERNEL=="mmcblk[0-9]p[0-9]", SUBSYSTEMS=="mmc",ACTION=="remove",  RUN+="/bin/systemctl stop usb-mount@%k.service"

更新配置

shell 复制代码
sudo udevadm control --reload-rules
sudo systemctl daemon-reload

结果

这样就可以,拔插U盘和SD卡,都可以自动挂载和卸载,并创建目录了。


其他问题

文件系统问题-exfat

挂载exfat文件,需要先安装一个组件

shell 复制代码
sudo apt-get install exfat-utils

# 一些设备需要root权限才可以操作
sudo mount /dev/mmcblk1p1 /media/mmcblk1p1
相关推荐
学传打活5 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续3)
微信公众平台·1024程序员节·汉字·昆仑正义文化
学传打活10 天前
【边打字.边学昆仑正义文化】_进阶篇5 宇宙星系的运转(续1)
微信公众平台·1024程序员节·汉字·昆仑正义文化
fangzhanpeng16818 天前
快速掌握C#语言基础知识点(1.基础数据类型)
开发语言·c#·1024程序员节
无己心20 天前
面向多平台 AI 搜索引擎的适配层架构设计
前端·人工智能·搜索引擎·ai·1024程序员节
u0103055271 个月前
AI驱动的安卓UI自动生成功能实现
人工智能·1024程序员节
u0103055271 个月前
长株潭智能体赋能腾讯元器链接共享
1024程序员节
云贝贝贝1 个月前
OceanBase认证体系介绍与备考指南
运维·服务器·oceanbase·1024程序员节
u0103055271 个月前
Java图像处理实战指南
人工智能·1024程序员节
u0103055271 个月前
Java AWT鼠标事件全解析
人工智能·1024程序员节
u0103055271 个月前
Java实用类应用精讲
人工智能·1024程序员节