在没有Umount的情况下移除SD卡后无法挂载

时间:2016-02-24 00:19:46

标签: linux udev yocto

下午好,

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

我的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发行版。

2 个答案:

答案 0 :(得分:2)

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

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

答案:

  1. 强行取出SD卡

  2. 检测到SD卡已断开连接

  3. 最简单的方法是检查SD卡'装载尺寸

    read file "/sys/block/mmcblk1/size" and check it's > 0
    
    1. 关闭正在写入SD卡上文件的所有文件描述符。
    2. 请注意,在移除卡之前无需关闭这些内容。 Linux足够强大,可以写入不存在的文件。但这需要在SD卡卸载之前完成,否则umount将失败,这就是造成我的问题的原因。当SD卡已经重新插入时,也无法运行Umount。

      1. 卸载SD卡

        系统(" umount / mnt / storage");'

      2. 现在重新插入SD卡

      3. 检测到卡已重新插入

      4. 重新安装卡

        系统(" mount / dev / mmcblk1p1 / mnt / storage")

答案 1 :(得分:0)

如果你的系统上运行了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"

使用Yocto" Daisy"这对我来说很好。在armv7平台上。