Linux系统下自动挂载SD卡最大可用分区的方案咨询
自动挂载SD卡最大可用分区的解决方案
问题背景
现有两种SD卡:
| SD卡类型 | 可用分区 | 分区大小 |
|---|---|---|
| A型(烧录过镜像) | mmcblk0p1、mmcblk0p2 | mmcblk0p1: 30Mb, mmcblk0p2: 31Gb |
| B型(全新) | mmcblk0p1 | mmcblk0p1: 31Gb |
通过/etc/fstab指定固定分区挂载时,更换SD卡类型会失效,需要实现无视SD卡类型,开机自动挂载最大可用分区的功能。
方法一:自定义脚本 + Systemd服务(推荐开机自动挂载)
1. 编写挂载脚本
创建/usr/local/bin/mount-largest-sd-part.sh,内容如下:
#!/bin/bash # 挂载点路径,可自行修改 MOUNT_POINT="/mnt/sdcard" # SD卡主设备,根据实际情况调整(比如/dev/sdb如果是USB读卡器) SD_DEVICE="/dev/mmcblk0" # 创建挂载点 mkdir -p "$MOUNT_POINT" # 卸载已有挂载(避免冲突) umount "$MOUNT_POINT" 2>/dev/null # 筛选该设备下最大的分区 LARGEST_PART=$(lsblk -n -o NAME,SIZE,TYPE "$SD_DEVICE" \ | grep "part" \ | sort -k2 -n -r \ | head -n1 \ | awk '{print "/dev/"$1}') # 执行挂载 if [ -n "$LARGEST_PART" ]; then # 如需指定文件系统,添加-t 参数,比如 mount -t ext4 "$LARGEST_PART" "$MOUNT_POINT" mount "$LARGEST_PART" "$MOUNT_POINT" echo "Success: Mounted $LARGEST_PART to $MOUNT_POINT" else echo "Error: No valid partition found on $SD_DEVICE" fi
2. 赋予脚本执行权限
chmod +x /usr/local/bin/mount-largest-sd-part.sh
3. 创建Systemd服务
创建/etc/systemd/system/mount-sdcard.service:
[Unit] Description=Auto mount largest SD card partition After=local-fs.target [Service] Type=oneshot ExecStart=/usr/local/bin/mount-largest-sd-part.sh RemainAfterExit=yes [Install] WantedBy=multi-user.target
4. 启用并启动服务
systemctl daemon-reload systemctl enable mount-sdcard.service systemctl start mount-sdcard.service
方法二:Udev规则(支持热插拔+开机自动处理)
如果需要SD卡热插拔时也自动挂载最大分区,可搭配udev规则:
- 创建udev规则文件
/etc/udev/rules.d/99-mount-largest-sd.rules:
# 匹配SD卡主设备,根据实际调整KERNEL值 SUBSYSTEM=="block", KERNEL=="mmcblk0", ACTION=="add", RUN+="/usr/local/bin/mount-largest-sd-part.sh"
- 重新加载udev规则:
udevadm control --reload-rules udevadm trigger
注意事项
- 若SD卡不是
/dev/mmcblk0,用lsblk命令查看实际设备名后替换脚本和规则中的对应值。 - 如需让普通用户访问挂载点,可在
mount命令中添加权限参数,比如:
(替换1000为你的用户UID/GID,可通过mount -o uid=1000,gid=1000 "$LARGEST_PART" "$MOUNT_POINT"id命令查看) - 如需指定文件系统类型,在
mount命令中添加-t ext4(或对应文件系统)参数。
内容的提问来源于stack exchange,提问作者curosity
相关产品推荐
相关产品推荐

