Los comandos raíz en el emulador de terminal no funcionan en todo el sistema

Quiero ejecutar el siguiente comando como root en Android Terminal Emulator .

mount -o bind /storage/extSdCard /data/media

Probé esto en un Samsung Galaxy S3 con CyanogenMod 11 y funciona como se esperaba. Cuando entro /data/mediausando otra aplicación como el administrador de archivos ES File Explorer , obtengo el contenido de la tarjeta SD externa en lugar de la memoria interna.

El problema es que esto no funciona en otro S3 que tengo, este ejecuta TouchWiz ROM versión 4.3 y rooteado con CF-Auto-Root . También he probado a usar el kernel personalizado de Adam y tampoco funciona.

Cuando ejecuto el comando en la terminal y luego escribo ls /data/mediacomo raíz, muestra el contenido de la tarjeta SD externa, pero si ejecuto otra terminal como un usuario normal (no raíz) y escribo el mismo comando, obtengo el contenido de la tarjeta SD interna. memoria. Lo mismo sucede si intento acceder /data/mediausando el administrador de archivos ES File Explorer

Entonces, parece que los comandos raíz solo tienen efecto para el usuario raíz, no para otros usuarios en todo el sistema. ¿Cuál podría ser la causa de este comportamiento?

ACTUALIZACIÓN: OK, mi error, no me expresé correctamente. Es cierto que un usuario normal no puede acceder a /data/media. Pero /data/mediaes la verdadera ubicación de los archivos en la memoria interna. Hay muchas rutas en las que Android pone esta memoria a disposición de los usuarios normales, como /sdcardo /storage/sdcard0, las cuales apuntan a /data/media/0través de un sistema de archivos FUSE.

Mi pensamiento aquí es que si creo una carpeta nombrada 0en la sd externa y luego la vinculo /storage/extSdCarda /data/media, cuando el sistema intente acceder /sdcardo /storage/sdcard0obtendrá el contenido /storage/extSdCard/0ya que /data/mediaya no apunta a la memoria interna, sino a la sd externa.

Esto funciona como se esperaba en CM11 cuando ejecuto como root

mount -o bind /storage/extSdCard /data/media

Luego, si accedo /sdcarden la terminal, ya sea como root y como usuario normal, llego al contenido de /storage/extSdCard/0. Lo mismo sucede si uso ES File Explorer en modo normal o raíz

Pero cuando hago lo mismo en el firmware rooteado 4.3, no funciona. Solo la raíz en la terminal puede ver los cambios, el usuario normal en la terminal y el usuario normal y raíz en ES File Explorer no verán cambios

I get the contents of the internal memory.)-- No entiendo cómo un usuario normal es capaz de ver cualquier contenido /data/mediasin privilegios elevados. Debería obtener un error en la terminal, algo así como "Operación no permitida". Acerca de su segundo caso con ES, como usuario normal, ES no debería mostrar nada en /datael directorio y no sé cómo ir a una determinada ubicación directamente usando ES (no parece tener una barra de ubicación). Dicho esto, /data/mediatodavía puede acceder un usuario normal usando Terminal. Lo revisé, funciona bien.
Sí, tienes razón, no me expresé bien. Edité la pregunta proporcionando información adicional.

Respuestas (2)

Mi caso, supongo que es la misma razón para ti.

Vaya a su aplicación de administrador de superusuarios, supongo que es SuperSU.

Vaya a la configuración y busque 'Montar separación de espacio de nombres' y verifique si está marcado. Desmarque la opción y reinicie.

SuperSU proporcionó esta opción para hacer que su sistema sea más seguro al ocultar el espacio de nombres de montaje de una aplicación de los demás, por lo tanto, si monta o desmonta algo, solo es visible para la aplicación (UID) que está usando y nada más.

Alternativamente, al ejecutar su, puede agregar una opción -mpara que su shell tenga el control del espacio de nombres de montaje maestro. Entonces tus monturas funcionarán globalmente.

Aparentemente, esta es ahora una función de seguridad de Android SELinux: los montajes iniciados desde la mayoría de los procesos no son visibles para otros procesos. Ver esta respuesta .

Un hilo de desarrollo del kernel de Android relacionado sugiere reemplazar un servicio del sistema innecesario (por ejemplo /system/bin/debuggerd, ) con un script de shell que ejecuta el comando de montaje deseado. Esto lo lanzarías con start debuggerd.

Actualización: Esto funcionó para mí, después de reiniciar.