RESPUESTA CORTA
Vaya a la configuración de Magisk y establezca Mount Namespace Mode
a Global
de una vez por todas. En Aplicación SuperSU , desactivar Mount Namespace Separation
.
O
Para una solución única, utilice este comando en su lugar:
~$ su -mm -c 'mount <device> <mountpoint>'
RESPUESTA LARGA
pero después de algún tiempo, la partición se desmonta automáticamente y tengo que montarla de nuevo.
Android NAMESPACES
Este comportamiento se debe a Espacio de nombres de montaje implementado por Android desde Android-6 para el propósito de sandboxing / aislamiento de aplicaciones. Con el fin de controlar el acceso de las aplicaciones a los recursos del sistema y a los sistemas de archivos - en particular a las tarjetas SD - cada aplicación (Dalvik o ART VM que procesa el bytcode de Java a un binario ejecutable .dex) es iniciada por zygote (un proceso de inicio de Android) en un nuevo espacio de nombres de montaje donde puede desmontar independientemente cualquier sistema de archivos (excepto rootfs) o volver a montar, sin afectar a otros espacios de nombres. Cada proceso que la aplicación inicia, vive en el mismo (o más) espacio de nombres aislado.
Por lo general, mnt
(montaje) y net
(red) están habilitados por defecto en el kernel de Android. Otros espacios de nombres pid
, user
y uts
se puede habilitar reconstruyendo el kernel.
ESPACIO DE NOMBRES GLOBAL
El primer proceso iniciado por el kernel en el arranque: init junto con todos los procesos del kernel (kworkers, etc.) y otros procesos daemon init (como ueventd, logd, servicemanager, vndbinder, mediaserver, netd, etc.) viven en Espacio de nombres global / root . Cuando instalamos mods (como Magisk, Xposed, etc.), también se inician como un proceso en el espacio de nombres Root, normalmente en la fase inicial del proceso de arranque.
Los sistemas de archivos de Android (reales o pseudo; /system, /data, /proc, etc.) también se montan inicialmente en el espacio de nombres global. El espacio de nombres de una aplicación tiene todos los montajes (incluyendo rootfs) establecidos en slave
para que cualquier nuevo montaje dentro de ellos en el espacio de nombres Root, se propague al espacio de nombres de la aplicación pero no a la inversa. Ver propagación de la montura .
HERRAMIENTAS DEL ESPACIO DE NOMBRES
Comando Linux lsns
se puede utilizar para ver todos los espacios de nombres. El espacio de nombres de montaje puede ser creado por unshare -m
. Para introducir un espacio de nombres, nsenter
es una envoltura de SETNS fácilmente disponible. En la mayoría de los casos estos comandos no funcionan sin privilegios de Root.
SUPER USUARIO Y MOUNT NS
Cuando ejecutamos su
en una aplicación emuladora de Terminal, se inicia un nuevo proceso (shell) con capacidades elevadas. Este proceso vive en el mismo espacio de nombres de montaje que el de la aplicación Terminal. Por lo tanto, el mount
también se ejecuta en el mismo espacio de nombres y, por tanto, el sistema de archivos sólo es visible dentro de ese espacio de nombres. Una vez que exit
ese shell, el punto de montaje no mostrará el contenido del sistema de archivos. Si no hay ningún proceso en ejecución en un espacio de nombres, se limpia automáticamente.
Tenga en cuenta que una aplicación es completamente eliminada cuando su proceso Dalvik es eliminado por Force Stop o por La gestión de la memoria de Android .
Si la aplicación de la Terminal no estaba completamente muerta, su
pueden entrar en el mismo espacio de nombres, sólo cuando Inherited Namespace
está activada en Magisk. Isolated Namespace
siempre creará un nuevo espacio de nombres de montaje.
Ahora vamos a tu pregunta:
Incluso cuando está montado, los contenidos no son visibles en las aplicaciones de exploración de archivos como MiXplorer y ES Explorer, y sólo son visibles en la terminal.
Esto se debe a que los Exploradores (aplicaciones) se ejecutan en sus propios espacios de nombres de montaje. Ejecute este comando como Root para obtener una visión general:
~# ps f -p2 --ppid 2 --deselect -o mntns,pid,cmd --sort=mntns
Puede utilizar Termux para una versión completa de ps
.
Cuando configuro este comando para que se ejecute en el arranque colocándolo dentro del directorio init.d en /etc, entonces funciona normalmente y la partición ext4 no se desmonta automáticamente.
Esto se debe a que ese init.d script es ejecutado por init
en el espacio de nombres global.
Entonces, ¿cuál es la mejor manera de montar la partición ext4 en Android de forma persistente y cuál es la razón de tal comportamiento?
Para escapar de todo el enigma, monte siempre sus sistemas de archivos de acceso frecuente en el espacio de nombres de montaje global (aunque es vulnerable a los fallos de seguridad) a menos que sea necesario de otra manera. Una simple comprobación de si estamos en el espacio de nombres global:
~# [ "$(readlink /proc/self/ns/mnt)" = "$(readlink /proc/1/ns/mnt)" ] && echo 'In Global NS.' || echo 'Not in Global NS.'
NOTA: Esta prueba sólo funciona en el PID NS inicial.
Otra posibilidad es crear un espacio de nombres con unshare -m --propagation shared
. Ahora cualquier nuevo montaje en este espacio de nombres se propagará a todos los espacios de nombres. Pero esto no es aplicable a los espacios de nombres de aplicaciones ya creados. mount --make-rshared /
no funciona (al menos para mí) si el espacio de nombres fue creado originalmente con slave
o private
propagación.
Ver este post del hilo para más detalles.
0 votos
Estoy usando la aplicación magisk. Me encuentro con este problema sólo cuando lo ejecuto en la aplicación terminal de Android. Pero cuando configuro este comando para que se ejecute en el arranque colocándolo dentro del directorio init.d en etc. Entonces funciona normalmente y la partición ext4 no se desmonta automáticamente. No entiendo por qué funciona así en ese caso. ¿Alguien podría explicarlo?