Buena tarde,
Tengo un proyecto en el que la tarjeta SD puede desconectarse momentáneamente debido a un contacto débil en el pin SD Detect. Quiero poder verificar si se ha desmontado y volver a montarlo en el software.
La partición de mi tarjeta SD es /dev/mmcblk1p1 Originalmente se monta automáticamente cuando se inicia Linux
Si ejecuto un umount /mnt/storage , luego quito la tarjeta SD, puedo volver a insertarla y realizar un mount /dev/mmcblk1p1 /mnt/storage sin problemas
Sin embargo, si primero quito la tarjeta SD, sin umount , ejecutar mount /dev/mmcblk1p1 /mnt/storage da como resultado
mounting /dev/mmcblk1p1 on /mnt/storage failed: No such device or addresstraté de correr
umount /mnt/storage rmdir /mnt/storage mkdir /mnt/storageEste error siempre aparece cuando se extrae la tarjeta SD sin desmontar
Estoy usando una distribución de Yocto que se ejecuta en Imx6.
Si una aplicación C++ escribe en la tarjeta SD, se puede quitar a la fuerza, pero no se puede desmontar (desmontar) hasta que esa aplicación cierre los descriptores de archivo. La aplicación en sí no necesita cerrarse.
Esta solución es para aplicaciones mecánicas, donde la tarjeta SD (u otro medio flash) puede desconectarse momentáneamente y una aplicación debe reanudar la escritura:
Responder:
Extraiga a la fuerza la tarjeta SD
Detectar que la tarjeta SD está desconectada
La forma más sencilla de hacerlo es verificar el tamaño de montaje de las tarjetas SD
read file "/sys/block/mmcblk1/size" and check it's > 0Tenga en cuenta que no es necesario cerrarlos antes de retirar la tarjeta. Linux es lo suficientemente robusto como para escribir en un archivo que no existe. Pero esto debe hacerse antes de que se desmonte la tarjeta SD, de lo contrario, el desmontaje fallará, y esto es lo que estaba causando mi problema. Umount tampoco se puede ejecutar cuando la tarjeta SD ya se ha vuelto a insertar.
Desmontar la tarjeta SD
system("montar /mnt/almacenamiento");'
Ahora vuelva a insertar la tarjeta SD
Detectar que la Tarjeta ha sido reinsertada
Vuelva a montar la tarjeta
sistema ("montar /dev/mmcblk1p1 /mnt/almacenamiento")
Si tiene udev ejecutándose en su sistema, puede dejar que el script de montaje de udev desmonte automáticamente sus dispositivos si se eliminan. Por lo tanto, agregue algo como lo siguiente en /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 Además, debe decirle a udev que ejecute ese script de montaje en dispositivos agregados y eliminados. Por lo tanto, he creado /etc/udev/rules.d/autounmount.rules :
SUBSYSTEM=="block", ACTION=="remove" RUN+="/etc/udev/scripts/mount.sh"Esto funciona bien para mí usando Yocto "Daisy" en una plataforma armv7.