You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无UUID的多SD卡指定挂载至对应挂载点的实现方案(Ubuntu-20.04)

问题:无UUID的多张SD卡插入时,如何绑定至指定挂载点?

环境

  • Ubuntu-20.04 LTS
  • Bash shell

背景

我正在开发一个Bash脚本,用于从对应SD卡中复制两台摄像头(前/后视)每日生成的图片,现有工作流程:

  1. 手动从摄像头取出标记好的SD卡(比如前置对应"A"卡)
  2. 插入主机连接的SD卡读卡器(对应/dev/sda和/dev/sdb)
  3. 自动挂载到/media/user/front-sd-card和/media/user/rear-sd-card
  4. 运行预定义源路径的脚本,复制图片到目标目录

挑战

  • 插入顺序决定设备名:先插后视SD卡会挂载到/dev/sda/disk,先插前置则前置占/dev/sda/disk,后置到/dev/sdb/disk1,容易人为出错
  • 即使要求按读卡器对应插卡,仍有操作失误可能
  • 两张SD卡都没有UUID,没法通过/etc/fstab按UUID自动挂载到指定目录

期望

"A"卡和"B"卡始终挂载到对应目标路径,确保脚本按预定义路径复制,减少人为失误(目前需要人工检查后再运行脚本)。我考虑加个功能:预览两张SD卡的图片,让用户确认是否正确,错了就退出脚本,也欢迎其他优化建议。


解决方案

方法1:通过SD卡硬件标识绑定挂载点

即使没有UUID,SD卡有短序列号或厂商+型号+容量的唯一组合可用于识别,步骤如下:

  1. 单独插入每张SD卡,执行udevadm info --query=all --name=/dev/sdX(X为卡的设备名),找到ID_SERIAL_SHORT字段(短序列号),这是每张卡独有的标识。
  2. 创建udev规则文件/etc/udev/rules.d/99-sd-card-mount.rules,示例内容:
    # 前置摄像头SD卡(A卡)绑定到指定挂载点
    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="XXXXXX", RUN+="/usr/bin/mount /dev/%k /media/user/front-sd-card"
    # 后置摄像头SD卡(B卡)绑定到指定挂载点
    SUBSYSTEM=="block", ENV{ID_SERIAL_SHORT}=="YYYYYY", RUN+="/usr/bin/mount /dev/%k /media/user/rear-sd-card"
    
    注:%k代表当前设备名,确保挂载点目录已存在(可提前用mkdir -p创建)。
  3. 重载udev规则并触发生效:
    sudo udevadm control --reload-rules && sudo udevadm trigger
    
    之后插入SD卡会自动挂载到指定路径,不受插入顺序影响。

方法2:脚本内自动识别挂载

如果不想配置udev规则,可在复制脚本开头加入识别逻辑,通过卡内文件特征区分:

  1. 遍历所有SD卡分区(用lsblk过滤出FAT/exFAT格式的移动存储)
  2. 临时挂载分区,读取卡内特征(比如前置摄像头图片带front_前缀,或卡内有camera_type.txt标记文件)
  3. 根据识别结果动态挂载到对应路径,示例代码片段:
    # 定义挂载点
    FRONT_MOUNT="/media/user/front-sd-card"
    REAR_MOUNT="/media/user/rear-sd-card"
    # 创建挂载点
    mkdir -p $FRONT_MOUNT $REAR_MOUNT
    
    # 遍历SD卡分区
    for dev in $(lsblk -l -o NAME,FSTYPE | grep -E "(vfat|exfat)" | awk '{print "/dev/"$1}'); do
        temp_mount="/tmp/sd_temp"
        mkdir -p $temp_mount
        mount $dev $temp_mount
    
        # 判断卡类型:前置卡有front_开头的图片
        if ls $temp_mount/front_*.jpg > /dev/null 2>&1; then
            umount $temp_mount
            mount $dev $FRONT_MOUNT
            echo "前置SD卡已挂载到$FRONT_MOUNT"
        elif ls $temp_mount/rear_*.jpg > /dev/null 2>&1; then
            umount $temp_mount
            mount $dev $REAR_MOUNT
            echo "后置SD卡已挂载到$REAR_MOUNT"
        else
            umount $temp_mount
            echo "未知SD卡,跳过"
        fi
        rmdir $temp_mount
    done
    
    # 检查挂载状态
    if ! mountpoint -q $FRONT_MOUNT || ! mountpoint -q $REAR_MOUNT; then
        echo "SD卡挂载失败,请检查"
        exit 1
    fi
    

方法3:优化人工确认流程(预览方案)

在脚本中加入图片预览和用户确认步骤,避免挂载错误:

  1. 临时挂载所有SD卡,用feh工具显示卡内最新图片缩略图(需先安装:sudo apt install feh)
  2. 让用户确认每张卡对应的摄像头类型,再挂载到指定路径,示例代码片段:
    # 获取所有SD卡分区
    sd_devs=($(lsblk -l -o NAME,FSTYPE | grep -E "(vfat|exfat)" | awk '{print "/dev/"$1}'))
    temp_mounts=()
    
    # 临时挂载并预览
    for i in "${!sd_devs[@]}"; do
        temp_mount="/tmp/sd_$((i+1))"
        mkdir -p $temp_mount
        mount ${sd_devs[$i]} $temp_mount
        temp_mounts+=($temp_mount)
        echo "=== SD卡$((i+1)) 预览 ==="
        feh -q -t -l 3 ${temp_mount}/*.jpg  # 显示最新3张图片缩略图列表
    done
    
    # 用户确认
    read -p "请输入前置SD卡的编号(1或2): " front_num
    read -p "请输入后置SD卡的编号(1或2): " rear_num
    
    # 挂载到指定路径
    FRONT_MOUNT="/media/user/front-sd-card"
    REAR_MOUNT="/media/user/rear-sd-card"
    mount ${sd_devs[$((front_num-1))]} $FRONT_MOUNT
    mount ${sd_devs[$((rear_num-1))]} $REAR_MOUNT
    
    # 清理临时挂载
    for mount in "${temp_mounts[@]}"; do
        umount $mount
        rmdir $mount
    done
    

内容的提问来源于stack exchange,提问作者tcluk624

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 22:35:49