¿Por qué las particiones se desmontan automáticamente después de un tiempo?

Tengo un teléfono Android con Oreo 8.1.0. Tengo dos particiones en sdcard. Una partición tiene formato ext4. Lo monto usando:

mount -t ext4 -o rw /dev/block/mmcblk1p2 /data/sdext2

Pero después de un tiempo, la partición se desmonta automáticamente y tengo que volver a montarla.

Incluso cuando está montado, los contenidos no son visibles en las aplicaciones de exploración de archivos como MiXplorer y ES Explorer, y solo son visibles en la terminal.

Entonces, ¿cuál es la mejor manera de montar la partición ext4 en Android de forma persistente y cuál es el motivo de tal comportamiento?

Estoy usando la aplicación magisk. Enfrento este problema solo cuando lo ejecuto en la aplicación de 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?

Respuestas (1)

RESPUESTA CORTA

Vaya a Configuración de Magisk y configúrelo Mount Namespace Modede Globaluna vez por todas. En la aplicación SuperSU , deshabilite Mount Namespace Separation.
O
Para una solución única, use este comando en su lugar:

~$ su -mm -c 'mount <device> <mountpoint>'

RESPUESTA LARGA

pero después de un tiempo, la partición se desmonta automáticamente y tengo que volver a montarla.

ESPACIOS DE NOMBRES DE ANDROID
Este comportamiento se debe al espacio de nombres de montaje implementado por Android desde Android-6 con el propósito de aislamiento/sandboxing de aplicaciones. Con el fin de controlar el acceso de la aplicación a los recursos del sistema y los sistemas de archivos, en particular las tarjetas SD, cada aplicación (Dalvik o ART VM que procesa el código byt de Java para convertirlo en binario ejecutable .dex) se inicia mediante zygote (un proceso de inicio de Android) en un nuevo espacio de nombres de montaje donde puede desmonte de forma independiente cualquier sistema de archivos (excepto rootfs) o vuelva a montarlo, sin afectar otros espacios de nombres. Cada proceso que inicia la aplicación vive en el mismo (o más) espacio de nombres aislado.
Por lo general, los espacios de nombres mnt(montaje) y net(red) están habilitados en el kernel de Android de forma predeterminada. Otros espacios de nombres pid, useryutsse puede habilitar reconstruyendo el kernel.

ESPACIO DE NOMBRES GLOBAL
El primer proceso iniciado por el núcleo en el arranque: init junto con todos los procesos del núcleo (kworkers, etc.) y otros procesos daemon de inicio (como ueventd, logd, servicemanager, vndbinder, mediaserver, netd, etc.) en vivo en el espacio de nombres global/ raíz . Cuando instalamos mods (como Magisk, Xposed, etc.), también comienzan como un proceso en el espacio de nombres raíz, generalmente en la etapa 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 (incluido rootfs) establecidos en slave, de modo que cualquier nuevo montaje dentro de ellos en el espacio de nombres raíz se propaga al espacio de nombres de la aplicación, pero no al revés. Ver propagación de monturas .

HERRAMIENTAS DE ESPACIO DE NOMBRES
El comando de Linux lsnsse puede utilizar para ver todos los espacios de nombres. El espacio de nombres de montaje puede ser creado por unshare -m. Para ingresar un espacio de nombres, nsenteres un contenedor SETNS fácilmente disponible. En la mayoría de los casos, estos comandos no funcionan sin privilegios de root.

SUPERUSUARIO Y MOUNT NS
Cuando ejecutamos suun comando en una aplicación de emulador 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. Entonces, el mountcomando también se ejecuta en el mismo espacio de nombres y, por lo tanto, el sistema de archivos solo es visible dentro de ese espacio de nombres. Una vez que tengamos exitese 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 se elimina por completo cuando Force Stop o la gestión de memoria de Android eliminan su proceso Dalvik .
Si la aplicación Terminal no se eliminó por completo, supuede ingresar el mismo espacio de nombres, solo cuandoInherited NamespaceLa opción está habilitada en Magisk. Isolated Namespacesiempre creará un nuevo espacio de nombres de montaje.

Ahora yendo 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 solo 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 descripción general:

~# ps f -p2 --ppid 2 --deselect -o mntns,pid,cmd --sort=mntns

Puede usar 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 el script init.d se ejecuta initen un 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 el motivo de tal comportamiento?

Para escapar de todo el enigma, monte siempre sus sistemas de archivos a los que accede con frecuencia en el espacio de nombres de montaje global (aunque es vulnerable a las infracciones de seguridad) a menos que sea necesario de otra manera. Una simple verificación si estamos en un 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 solo funciona en PID NS inicial.

Otra posibilidad es crear un espacio de nombres con unshare -m --propagation shared. Ahora, cualquier montaje nuevo en este espacio de nombres se propagará a todos los espacios de nombres. Pero esto no se aplica a los espacios de nombres de las aplicaciones ya creadas. mount --make-rshared /no funciona (al menos para mí) si el espacio de nombres se creó originalmente con slaveo privatecon propagación.

Vea esta publicación de hilo para más detalles.