无UUID的多SD卡指定挂载至对应挂载点的实现方案(Ubuntu-20.04)
问题:无UUID的多张SD卡插入时,如何绑定至指定挂载点?
环境
- Ubuntu-20.04 LTS
- Bash shell
背景
我正在开发一个Bash脚本,用于从对应SD卡中复制两台摄像头(前/后视)每日生成的图片,现有工作流程:
- 手动从摄像头取出标记好的SD卡(比如前置对应"A"卡)
- 插入主机连接的SD卡读卡器(对应
/dev/sda和/dev/sdb) - 自动挂载到
/media/user/front-sd-card和/media/user/rear-sd-card - 运行预定义源路径的脚本,复制图片到目标目录
挑战
- 插入顺序决定设备名:先插后视SD卡会挂载到
/dev/sda/disk,先插前置则前置占/dev/sda/disk,后置到/dev/sdb/disk1,容易人为出错 - 即使要求按读卡器对应插卡,仍有操作失误可能
- 两张SD卡都没有UUID,没法通过
/etc/fstab按UUID自动挂载到指定目录
期望
"A"卡和"B"卡始终挂载到对应目标路径,确保脚本按预定义路径复制,减少人为失误(目前需要人工检查后再运行脚本)。我考虑加个功能:预览两张SD卡的图片,让用户确认是否正确,错了就退出脚本,也欢迎其他优化建议。
解决方案
方法1:通过SD卡硬件标识绑定挂载点
即使没有UUID,SD卡有短序列号或厂商+型号+容量的唯一组合可用于识别,步骤如下:
- 单独插入每张SD卡,执行
udevadm info --query=all --name=/dev/sdX(X为卡的设备名),找到ID_SERIAL_SHORT字段(短序列号),这是每张卡独有的标识。 - 创建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创建)。 - 重载udev规则并触发生效:
之后插入SD卡会自动挂载到指定路径,不受插入顺序影响。sudo udevadm control --reload-rules && sudo udevadm trigger
方法2:脚本内自动识别挂载
如果不想配置udev规则,可在复制脚本开头加入识别逻辑,通过卡内文件特征区分:
- 遍历所有SD卡分区(用
lsblk过滤出FAT/exFAT格式的移动存储) - 临时挂载分区,读取卡内特征(比如前置摄像头图片带
front_前缀,或卡内有camera_type.txt标记文件) - 根据识别结果动态挂载到对应路径,示例代码片段:
# 定义挂载点 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:优化人工确认流程(预览方案)
在脚本中加入图片预览和用户确认步骤,避免挂载错误:
- 临时挂载所有SD卡,用
feh工具显示卡内最新图片缩略图(需先安装:sudo apt install feh) - 让用户确认每张卡对应的摄像头类型,再挂载到指定路径,示例代码片段:
# 获取所有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
相关产品推荐
相关产品推荐

