【问题标题】:Cannot Mount SD card after it is removed without UmountSD卡在没有Umount的情况下被移除后无法挂载
【发布时间】:2016-02-24 00:19:45
【问题描述】:

下午好,

我有一个项目,其中 SD 卡可能会由于 SD Detect 引脚上的弱接触而暂时断开连接。我希望能够检查它是否已被卸载并在软件中重新安装。

我的 SD 卡分区是/dev/mmcblk1p1 它最初是在 Linux 启动时自动挂载的

如果我执行 umount /mnt/storage 命令,然后取出 SD 卡,我可以重新插入它,然后执行 mount /dev/mmcblk1p1 /mnt/storage 没有问题

但是,如果我先取出 SD 卡,没有umount,则执行mount /dev/mmcblk1p1 /mnt/storage 会导致

mounting /dev/mmcblk1p1 on /mnt/storage failed: No such device or address

我试着跑了

umount /mnt/storage
rmdir /mnt/storage
mkdir /mnt/storage

SD 卡在未卸载的情况下被移除时总是会出现此错误

我正在使用在 Imx6 上运行的 Yocto 发行版。

【问题讨论】:

  • 在之前和之后做一个ls /dev。 IIRC,即使系统在重新插入设备后看到该设备,由于 systemd 和/或 udev 等原因,它也可能在 /dev 中使用不同的名称,尤其是在有多个设备的情况下。如果第二个lsno 条目,则系统可能没有看到重新插入。查看系统日志,lspcilsusb/sys/...* 找到它
  • 不属于编程论坛... OT。

标签: linux udev yocto


【解决方案1】:

如果 SD 卡是由 C++ 应用程序写入的,则可以强制将其移除,但在该应用程序关闭文件描述符之前无法 umount(ed)。应用程序本身不需要关闭。

此解决方案适用于机械应用程序,其中 SD 卡(或其他闪存介质)可能会暂时断开连接,需要应用程序恢复写入:

答案:

  1. 强行取出 SD 卡

  2. 检测到SD卡断开

最简单的方法是检查 SD 卡的安装大小

read file "/sys/block/mmcblk1/size" and check it's > 0
  1. 关闭所有正在写入 SD 卡上文件的文件描述符。

请注意,在移除卡之前不必关闭这些。 Linux 足够强大,可以写入不存在的文件。但这需要在卸载 SD 卡之前完成,否则卸载将失败,这就是导致我的问题的原因。重新插入 SD 卡时也无法运行卸载。

  1. 卸载 SD 卡

    system("umount /mnt/storage");'

  2. 现在重新插入 SD 卡

  3. 检测卡已重新插入

  4. 重新装卡

    system("mount /dev/mmcblk1p1 /mnt/storage")

【讨论】:

    【解决方案2】:

    如果您的系统上正在运行 udev,您可以让 udev 的挂载脚本在您的设备被删除后自动卸载它们。 因此在/etc/udev/scripts/mount.sh 中添加如下内容:

    UMOUNT="/bin/umount"
    
    if [ "$ACTION" = "remove" ] && [ -x "$UMOUNT" ] && [ -n "$DEVNAME" ]; then
            for mnt in `cat /proc/mounts | grep "$DEVNAME" | cut -f 2 -d " " `; do
                    $UMOUNT $mnt
            done
    fi
    

    此外,您必须告诉 udev 在添加和删除的设备上运行该挂载脚本。因此我创建了/etc/udev/rules.d/autounmount.rules:

    SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh"
    

    这对我在 armv7 平台上使用 Yocto "Daisy" 很有效。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-23
      • 1970-01-01
      相关资源
      最近更新 更多