5 votes

Pourquoi la partition est démontée automatiquement après un certain temps ?

J'ai un téléphone Android fonctionnant sous Oreo 8.1.0. J'ai deux partitions sur la carte SD. Une partition est formatée en ext4. Je la monte en utilisant :

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

Mais après un certain temps, la partition est démontée automatiquement et je dois la remonter.

Même lorsqu'il est monté, son contenu n'est pas visible dans les applications d'exploration de fichiers comme MiXplorer et ES Explorer, et n'est visible que dans le terminal.

Alors, quel est le meilleur moyen de monter une partition ext4 dans Android de manière persistante et quelle est la raison d'un tel comportement ?

0 votes

J'utilise l'application Magisk. Je rencontre ce problème uniquement lorsque je l'exécute dans l'application Android terminal. Mais lorsque je configure cette commande pour qu'elle soit exécutée au démarrage en la plaçant dans le répertoire init.d dans etc. Ensuite, il fonctionne normalement et la partition ext4 ne se démonte pas automatiquement. Je ne comprends pas pourquoi cela fonctionne ainsi dans ce cas. Quelqu'un peut-il l'expliquer ?

9voto

Irfan Latif Points 16863

RÉPONSE COURTE

Allez dans les paramètres de Magisk et définissez Mount Namespace Mode a Global une fois pour toutes. Sur Application SuperSU , désactiver Mount Namespace Separation .
OU
Pour une solution ponctuelle, utilisez cette commande à la place :

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

LONGUE RÉPONSE

mais après un certain temps, la partition est démontée automatiquement et je dois la remonter.

Android NAMESPACES
Ce comportement est dû à Espace de nom de montage implémenté par Android depuis Android-6 pour le sandboxing/isolement des applications. Afin de contrôler l'accès des applications aux ressources du système et aux systèmes de fichiers - en particulier les cartes SDCard - chaque application (Dalvik ou ART VM qui traite le bytcode Java pour en faire un binaire exécutable .dex) est démarrée par zygote (un processus init Android) dans un nouvel espace de noms mount où elle peut indépendamment démonter tout système de fichiers (sauf rootfs) ou le remonter, sans affecter les autres espaces de noms. Chaque processus lancé par l'application vit dans le même espace de noms isolé (ou plus loin).
Habituellement mnt (monture) et net (réseau) sont activés par défaut dans le noyau Android. Autres espaces de noms pid , user y uts peut être activé en reconstruisant le noyau.

ESPACE DE NOMS GLOBAL
Le tout premier processus lancé par le noyau au démarrage : init, ainsi que tous les processus du noyau (kworkers, etc.) et les autres processus du démon init (tels que ueventd, logd, servicemanager, vndbinder, mediaserver, netd, etc. Espace de nom global / racine . Lorsque nous installons des mods (tels que Magisk, Xposed, etc.), ils démarrent également en tant que processus dans l'espace de noms Root, généralement à l'étape initiale du processus de démarrage.
Les systèmes de fichiers Android (réels ou pseudo ; /system, /data, /proc etc.) sont également montés initialement dans l'espace de noms global. Tous les montages (y compris rootfs) de l'espace de nom d'une application sont définis comme suit slave de sorte que tout nouveau montage à l'intérieur de ceux-ci dans l'espace de noms Root, se propage dans l'espace de noms de l'application mais pas vice versa. Voir propagation des monts .

ESPACE DE NOMS OUTILS
Commande Linux lsns peut être utilisé pour afficher tous les espaces de noms. Un espace de noms de montage peut être créé par unshare -m . Pour entrer un espace de nom, nsenter est un wrapper SETNS facilement disponible. Dans la plupart des cas, ces commandes ne fonctionnent pas sans les privilèges de Root.

SUPER UTILISATEUR ET MONTER NS
Lorsque nous exécutons su dans une application émulateur de terminal, un nouveau processus (shell) est lancé avec des capacités élevées. Ce processus vit dans le même espace de noms de montage que celui de l'application Terminal. Ainsi, le mount est également exécutée dans le même espace de noms et le système de fichiers n'est donc visible que dans cet espace de noms. Une fois que nous exit ce shell, le point de montage ne montrera pas le contenu du système de fichiers. S'il n'y a pas de processus en cours d'exécution dans un espace de nom, il est automatiquement nettoyé.
Veuillez noter que une application est complètement tuée quand son processus Dalvik est tué par Force Stop ou par La gestion de la mémoire d'Android .
Si l'application Terminal n'a pas été complètement détruite, su peuvent entrer dans le même espace de noms, uniquement lorsque Inherited Namespace est activée dans Magisk. Isolated Namespace créera toujours un nouvel espace de nom de montage.

Venons-en maintenant à votre question :

Même lorsqu'il est monté, son contenu n'est pas visible dans les applications d'exploration de fichiers comme MiXplorer et ES Explorer, et n'est visible que dans le terminal.

Ceci est dû au fait que les explorateurs (applications) sont exécutés dans leurs propres espaces de noms de montage. Exécutez cette commande en tant que Root pour avoir une vue d'ensemble :

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

Vous pouvez utiliser Termux pour une version complète de ps .

Lorsque je configure cette commande pour qu'elle s'exécute au démarrage en la plaçant dans le répertoire init.d dans /etc, alors elle fonctionne normalement et la partition ext4 ne se démonte pas automatiquement.

C'est parce que ce script init.d est exécuté par init dans l'espace de noms global.

Alors, quel est le meilleur moyen de monter une partition ext4 dans Android de manière persistante et quelle est la raison d'un tel comportement ?

Pour échapper à toute cette énigme, montez toujours vos systèmes de fichiers fréquemment utilisés dans l'espace de noms de montage global. (bien qu'elle soit vulnérable aux failles de sécurité) sauf nécessité contraire. Une simple vérification si nous sommes dans un espace de nom global :

~# [ "$(readlink /proc/self/ns/mnt)" = "$(readlink /proc/1/ns/mnt)" ] && echo 'In Global NS.' || echo 'Not in Global NS.'

NOTE : Ce test ne fonctionne que dans le PID NS initial.

Une autre possibilité est de créer un espace de nom avec unshare -m --propagation shared . Maintenant, tout nouveau montage dans cet espace de nom se propagera à tous les espaces de nom. Mais ceci n'est pas applicable aux espaces de noms des applications déjà créées. mount --make-rshared / ne fonctionne pas (du moins pour moi) si l'espace de noms a été créé à l'origine avec la commande slave o private la propagation.

Ver ce fil de discussion pour plus de détails.

androidalle.com

AndroidAlle est une communauté de androiders où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X