Saltar al contenido

Android: ¿Qué es / storage / emulated / 0 /?

Luego de mucho trabajar ya dimos con el resultado de esta incógnita que muchos los lectores de nuestra web han tenido. Si deseas aportar algún dato puedes compartir tu conocimiento.

Solución:

/storage/emulated/0/Download es la ruta real a los archivos.

/sdcard/Download es un enlace simbólico a la ruta real de /storage/emulated/0/Download

sin embargo, el real los archivos se encuentran en el sistema de archivos en /data/media, que luego se monta en /storage/emulated/0 (y a menudo también otros puntos de montaje)

Un enlace simbólico En informática, un enlace simbólico es un término para cualquier archivo que contiene una referencia a otro archivo o directorio en forma de una ruta absoluta o relativa y que afecta la resolución de la ruta. Los enlaces simbólicos ya estaban presentes en 1978 en los sistemas operativos de miniordenadores de DEC y RDOS de Data General.

/storage/emulated/0/ es en realidad /data/media/0/ expuesto a través de un sistema de archivos emulado / virtual, no el real.

Esto es con referencia a mi respuesta anterior aquí, pero con detalles más relevantes.

ALMACENAMIENTO DE ANDROID:

En Android 5:

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

En Android 6+:

# for (Java) Android apps (running inside zygote virtual machine)
# "/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/global namespace (VIEW = default)
/sdcard >S> /storage/self/primary
/storage >B> /mnt/runtime/default
/mnt/runtime/default/self/primary >S> /mnt/user/USER-ID/primary
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/default/emulated
/mnt/runtime/default/emulated >E> /data/media

* >S> para enlace simbólico, >E> para emulado y >B> para unir el montaje
* USER-ID del usuario actual en caso de Multiple Users o Work Profile, normalmente 0 es decir, el del propietario del dispositivo
* VIEW es uno de read (para aplicaciones con permiso READ_EXTERNAL_STORAGE) o write (permiso.WRITE_EXTERNAL_STORAGE) o default (para procesos que se ejecutan en el espacio de nombres de montaje raíz / global, es decir, fuera del cigoto)
* Hubo pequeñas diferencias en las versiones anteriores de Android, pero el concepto de emulación fue el mismo desde que se implementó.
* Para obtener más detalles sobre la implementación del espacio de nombres de montaje de Android, consulte esta respuesta.

En breve, /sdcard y /storage/emulated/0 – que representan un sistema de archivos FAT / vFAT / FAT32 – apunte hacia /data/media/0 (o /mnt/expand/[UUID]/media/0 en caso de Almacenamiento Adoptable) a través de FUSE o sdcardfs emulación.

Al no ser específico de Android, pero generalmente relacionado con Linux, el enlace simbólico y el montaje de enlace (consulte “Creación de un montaje de enlace”) están fuera del alcance de esta pregunta, ya que la pregunta es principalmente sobre la parte de emulación.

EMULACIÓN:

¿Por qué está aquí la emulación? El sistema de archivos emulado es una capa de abstracción en el sistema de archivos real (ext4 o f2fs) que tiene básicamente dos propósitos:

  • Conserve la conectividad USB de los dispositivos Android a las PC (implementado a través de MTP hoy en día)
  • Restrinja el acceso no autorizado de aplicaciones / procesos a los medios privados del usuario y a los datos de otras aplicaciones en la tarjeta SD.

Lea el viaje de almacenamiento de Android para obtener más detalles, el resumen es:

Los primeros dispositivos Android tenían poco almacenamiento interno y dependían (físicamente) de tarjetas SD externas que tradicionalmente usan la familia de sistemas de archivos FAT para garantizar la compatibilidad con la mayoría de las PC (consulte el dominio de Microsoft en el mundo de las PC).
Cuando el almacenamiento interno aumentó de tamaño, el mismo sistema de archivos se cambió a una tarjeta SD interna (todavía llamada “externa”).
Pero la implementación de FAT / vFAT tuvo dos problemas principales que Google abordó gradualmente:

  • Los dispositivos Android se conectaron directamente a las PC (almacenamiento masivo USB) del mismo modo que conectamos una unidad USB en estos días. UMS expone el dispositivo a nivel de bloque y desconecta la tarjeta SD del marco de Android (desmonta), lo que hace que los datos completos no estén disponibles para las aplicaciones y posiblemente rompa muchas funcionalidades.
  • FAT (siendo el favorito de Windows en los días del desarrollo) nunca fue diseñado para hacer cumplir los permisos de UNIX (modo, uid, gid y también enlaces simbólicos, y ioctls me gusta FS_IOC_FIEMAP). Por lo tanto, todos los datos de la tarjeta SD estaban disponibles para todas las aplicaciones (ya que cada aplicación de Android es un usuario de UNIX / Linux y tiene un uid) sin restricciones, lo que genera serios problemas de privacidad y seguridad.

Ambos problemas se abordaron mediante la emulación:

  • El almacenamiento real de la tarjeta SD se movió a /data partición (o partición independiente / sdcard en algunos dispositivos anteriormente) que contiene ext4 sistema de archivos (siendo reemplazado gradualmente por f2fs), implementando completamente los permisos de UNIX.
  • Este diseño hizo imposible el uso de UMS porque todo /data La partición no pudo exponerse a la PC por 2 razones más: (1) contiene una gran cantidad de configuraciones y datos de aplicaciones que deben protegerse de otras aplicaciones y de usuarios humanos. (2) Los sistemas de archivos Linux no son compatibles con Windows.
    Por lo tanto, UMS fue reemplazado por el Protocolo de transferencia de medios, que es una extensión de tipo cliente-servidor para PTP, un protocolo ya establecido. MTP no expone el dispositivo de bloque, pero funciona a través de la pila de software. El host MTP se ejecuta en Android como una aplicación (android.process.media) completamente aislado en el marco de Android, no es capaz de realizar tareas escaladas.

Ahora las aplicaciones (y MTP, que también es una aplicación) interactúan con el almacenamiento emulado en lugar de /data/media, logrando ambos propósitos al mismo tiempo, es decir, haciendo cumplir las verificaciones de permisos debajo y luciendo como un sistema de archivos FAT en la superficie superior.

Google ahora está implementando la emulación a través de sdcardfs para superar las deficiencias de FUSE; uno de los principales es la sobrecarga de entrada / salida, es decir, mejorar las velocidades de lectura / escritura.

PERMISOS DE ALMACENAMIENTO EXTERNO:

El concepto de archivos públicos y privados en almacenamiento externo se puede demostrar con un ejemplo:
Instale la aplicación Termux.
Crea directorios /sdcard/Android/data/com.termux/test_dir y /sdcard/test_dir.
Crear archivos /sdcard/Android/data/com.termux/test_file y /sdcard/Android/data/com.termux/test_file.
Ejecute los siguientes comandos:

without_storage_perm

* Debe tener WhatsApp instalado o seleccionar la carpeta privada de alguna otra aplicación.

Ahora fuerce la detención de la aplicación Termux y otorgue el permiso de almacenamiento. Ejecute los comandos nuevamente:

with_storage_perm

Vea la diferencia en los permisos de los mismos archivos y directorios. Esto parece no ser simplemente posible sin la emulación en un sistema de archivos nativo de Linux cuando hay cientos de aplicaciones (usuarios) que deben tratarse simultáneamente. Esta es la emulación del sistema de archivos que permite que el mismo archivo se exponga con tres conjuntos diferentes de permisos al mismo tiempo, independientemente de sus permisos originales en el sistema de archivos real:

# touch /data/media/0/test_file

# stat -c '%a %u %g %n' /data/media/0/test_file
644 1023 1023 /data/media/0/test_file

# stat -c '%a %u %g %n' /mnt/runtime/*/emulated/0/test_file
660 0 1015 /mnt/runtime/default/emulated/0/test_file
640 0 9997 /mnt/runtime/read/emulated/0/test_file
660 0 9997 /mnt/runtime/write/emulated/0/test_file

Consulte también ¿Qué es el UID “u # _everybody”?

Relacionado:

  • ¿Por qué el directorio ‘almacenamiento / emulado /’ es inaccesible?
  • ¿Cómo puedo hacer un enlace simbólico (o equivalente) dentro de / storage / emulated / 0?

Si conservas algún reparo y disposición de reformar nuestro crónica eres capaz de realizar un paráfrasis y con deseo lo leeremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)


Tags : /

Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *