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?
Vaya a Configuración de Magisk y configúrelo Mount Namespace Mode
de Global
una 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>'
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
, user
yuts
se 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 lsns
se 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, nsenter
es 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 su
un 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 mount
comando 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 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 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, su
puede ingresar el mismo espacio de nombres, solo cuandoInherited Namespace
La opción está habilitada en Magisk. Isolated Namespace
siempre 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 init
en 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 slave
o private
con propagación.
Vea esta publicación de hilo para más detalles.
jonny789