15 votos

¿Cómo puedo hacer un enlace simbólico (o equivalente) dentro de /almacén/embudo/0?

Por lo tanto, he rooteado mi teléfono (GT-i9505 con Android 5.0.1) y me gustaría mover mi carpeta WhatsApp a mi tarjeta SD externa para ahorrar 3 GB de almacenamiento interno. Esto es lo que he intentado hasta ahora.

EDITORIAL: solución encontrada

Así que, después de todo la opción #2 parecía ser la correcta, pero necesitaba algunos ajustes para que funcionara. Como lo sugirió Irfan Latif el problema fue que el punto de montaje tiene que ser creado en un espacio de nombres de montaje global, de lo contrario otras aplicaciones no lo verán, así que los comandos a utilizar son:

su -mm
mount -o bind /data/sdext2/AppData/WhatsAppMedia /sdcard/WhatsApp/Media

¡Pero eso puede no ser suficiente! No funcionó hasta que me aseguré de que el espacio de nombres de Root fuera global. Para ello no conozco ninguna forma universal, pero lo que me funcionó fue ir a la configuración de la aplicación SuperSU y desmarcar la opción mount namespace separation .

Eso realmente depende de la aplicación SU que tengas instalada.

Opción 1: enlace simbólico

Lo primero que pensé fue en hacer un enlace simbólico, así que ese fue el comando que usé:

ln -s "/data/sdext2/AppData/WhatsAppMedia" "/sdcard/WhatsApp/Media"

Ya había creado una segunda partición en mi tarjeta SD externa (ext4) que está montada en /data/sdext2

Sin embargo, eso vuelve operation not permitted al usar el emulador de terminal (sí lo hice su ) y un error con cualquier aplicación de gestión de archivos Root que haya probado.

Después de algunas investigaciones me di cuenta de que por alguna razón, aunque /storage/emulator/0 está en una partición externa, es tratada de manera diferente para que no soporte el enlace simbólico dentro (corrígeme si me equivoco).

Así que, en la siguiente cosa

Opción 2: montar

De acuerdo con esta pregunta el siguiente comando debería montar la carpeta de la tarjeta SD externa en otra carpeta de la tarjeta SD interna, sin necesidad de un enlace simbólico

mount -o bind "/data/sdext2/AppData/WhatsAppMedia" "/sdcard/WhatsApp/Media"

Sin embargo, mientras se ejecuta el comando no devuelve ningún error la carpeta en /sdcard/WhatsApp/Media sigue vacía, así que no sé realmente cómo manejar esto.

Opción 3: enlace simbólico en /datos/medios/

Seguí las instrucciones de este puesto e hizo el enlace simbólico en /data/media/0 en lugar de almacenamiento, así que usando este comando:

ln -s "/data/sdext2/AppData/WhatsAppMedia" "/data/media/0/WhatsApp/Media"

¡Esta vez el enlace se crea! Sin embargo...

Aunque un ls en /data/media/0/WhatsApp/Media reveló que el vínculo fue exitoso, cd /sdcard/WhatsApp/Media devuelve una muy irritante no such file or directory y eso es confirmado por el explorador de archivos que muestra una carpeta vacía con un icono de archivo en blanco.

Mis pensamientos

En primer lugar, ahora descubrí que realmente odio a Android. Ahora, dicho esto, esto es lo que creo que podría ayudar a hacer:

  • moviendo mis archivos de la tarjeta SD a otro lugar: si el resto del sistema de archivos Root soporta symlink (lo cual parece ser así), podría incluso mover la carpeta /storage/emulated/0 en otro lugar y hacer un nuevo vínculo con él, pero no sé si eso resolvería el problema

Eso es todo por ahora, me pondré al día con más opciones cuando piense en ellas...

14voto

Jack Wade Puntos 231

ALMACENAMIENTO DE Androids:

En Android 5 :

/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media

En Android 6+ :

# USER-ID of current user in case of multiple users, normally "0"

# for apps
# VIEW is one of "read" or "write" and /storage to VIEW bind mount is inside a separate mount namespace for every app
/sdcard >S> /storage/self/primary
/storage/self >B> /mnt/user/USER-ID
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/VIEW/emulated
/mnt/runtime/VIEW/emulated >E> /data/media

# for services/daemons/processes in root namespace
/sdcard >S> /storage/self/primary
/storage >B> /mnt/runtime/default
/mnt/runtime/default/self/primary >S> mnt/user/0/primary
/mnt/user/0/primary >S> /storage/emulated/0
/storage/emulated >B> /mnt/runtime/default/emulated
/mnt/runtime/default/emulated >E> /data/media

>S> para symlink, >E> para emular y >B> para el montaje de bind

En resumen, /sdcard apunta a /data/media/0 a través de FUSE o sdcardfs emulación. Esto es para restringir el acceso no autorizado de aplicaciones/procesos a medios privados en la tarjeta SD. Lee El viaje de almacenamiento de Android .

SYMLINKS:

Ahora /sdcard no es un almacenamiento real sino emulado que representa un sistema de archivos FAT/vFAT/FAT32 (para la compatibilidad retroactiva y la gestión de permisos) que no soporta los enlaces simbólicos (y otras cosas incluyendo los permisos de *NIX y ioctls como FS_IOC_FIEMAP ). Así que las opciones 1 y 3 de la tuya no funcionarán si creas un enlace simbólico directamente en un almacenamiento emulado o intentas emular el enlace simbólico ya creado en ext4.

BIND MOUNT:

Esta es la alternativa comúnmente usada de symlink para la familia de sistemas de archivos FAT. Lo que has probado en la opción 2 debería funcionar. Esto es lo que le gusta a las aplicaciones Apps2SD hacer. Pero hay otra vez una limitación: mount namespace . Necesitas unir la montura en el espacio de nombres global/Root mount para que la montura sea visible para todas las aplicaciones:

su -mm -c 'mount -o bind "/data/sdext2/AppData/WhatsApp Media" "/sdcard/WhatsApp/Media"'

En Android 6+ esto tiene que ser montado en cada VIEW (por defecto, lectura, escritura) por separado para que todas las aplicaciones funcionen.

Puedes hacerlo permanente estableciendo Modo de montaje del espacio de nombres a Global en Magisk o desactivando Separación del Monte Namespace en SuperSU. Para más detalles ver esto responder a .


RELACIONADO:

1voto

Instale MiXplorer desde este hilo de XDA aquí → navegar a la ruta usando MiXplorer → hacer clic en + en la parte inferior → elija "Crear enlace simbólico".

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X