7 votes

Comment monter des répertoires avec "mount --bind" dans Android 4.4?

Je me demande s'il est possible de lier un dossier interne /sdcard à un autre dossier interne /sdcard pour les versions d'Android depuis 4.4?

J'ai un dossier nommé ./MyPics dans le /sdcard interne. Je souhaite le lier à ./DCIM/Camera, ./Pictures/Screenshots, ./Movies/Screencasts. La carte SD est montée dans /mnt/shell/emulated/0 en tant que sdcardfs, et elle est liée symboliquement à /storage/emulated/legacy. De plus, il y a un répertoire /storage/emulated/0, qui n'est ni un point de montage ni un lien symbolique. C'est un répertoire très étrange.

  1. J'ai essayé ce qui suit:

    mount -o bind,dmask=0000,fmask=0000 /mnt/shell/emulated/0/MyPics /mnt/shell/emulated/0/DCIM/Camera  
    mount -o bind,dmask=0000,fmask=0000 /mnt/shell/emulated/0/MyPics /mnt/shell/emulated/0/Pictures/Screenshots  
    mount -o bind,dmask=0000,fmask=0000 /mnt/shell/emulated/0/MyPics /mnt/shell/emulated/0/Movies/Screencasts  

    mais cela ne donne rien : les applications comme Camera ne parviennent pas à écrire dans /DCIM/Camera

  2. J'ai essayé ce qui suit:

    mount -o bind,dmask=0000,fmask=0000 /storage/emulated/legacy/MyPics /mnt/shell/emulated/0/...
    ....

    mais cela ne sert à rien non plus

  3. J'ai essayé ce qui suit:

    mount -o bind,dmask=0000,fmask=0000 /data/media/0/MyPics /data/media/0/...
    ....

    Si un fichier nommé a.jpg se trouve dans /MyPics, il apparaît dans /data/media/0/DCIM/Camera, mais il n'apparaît pas dans /storage/emulated/legacy/DCIM/Camera

  4. J'ai essayé d'utiliser des applications comme LuckPatcher pour faire le travail, mais cela a échoué à nouveau

0 votes

Avez-vous essayé d'utiliser ln -s? ln -s /sdcard/MyPics /sdcard/DCIM/Camera. Vous devrez d'abord déplacer le dossier Camera.

1voto

slugster Points 27178

Malheureusement, depuis Android 4.2, il n'est plus possible sur la plupart des appareils de monter un dossier et de le rendre disponible pour d'autres applications également. Les détails sur le fonctionnement de cela et pourquoi cela a été modifié peuvent être trouvés ici : Correctif pour les répertoires montés vides (CifsManager, etc.) dans Android 4.2.

La page mentionnée ci-dessus dit ceci :

Initialement posté par le message de commit du correctif Zygote

Zygote : Restreindre l'espace de montage esclave afin que les applications Dalvik puissent monter des volumes à l'échelle du système Android 4.2 met en œuvre le stockage multi-utilisateur en utilisant des espaces de noms de montage par processus. Initialement, tout sous "/" (toute la hiérarchie du système de fichiers) est marqué comme un espace de montage esclave récursif pour toutes les instances de zygote. Cela est fait pour que les montages en bac à sable de stockage utilisateur sous /storage/emulated soient cachés des autres applications et utilisateurs. Malheureusement, cela signifie que toute application Dalvik (en fait, tout programme dont l'ascendance de clonage/bifurcation inclut une zygote Dalvik, c'est-à-dire tout sauf les services lancés directement depuis init) ne peut pas monter des volumes à l'échelle du système. Ainsi, des applications comme CifsManager sont effectivement inutilisables dans Android 4.2, car ses montages cifs ne sont visibles que pour l'application CifsManager elle-même. Toutes les autres applications voient des points de montage vides au lieu du volume monté. De plus, Linux ne prévoit aucune disposition pour qu'un processus "échappe" à un espace de montage esclave récursif dans des versions antérieures à Linux 3.8 (appel sys_setns).

Ici, nous restreignons l'espace de montage esclave à /storage (et, en raison d'un possible bogue du noyau, /mnt/shell/emulated) afin que les applications Dalvik puissent monter des volumes à l'échelle du système ailleurs (avec les autorisations appropriées, comme dans les versions précédentes d'Android), tout en conservant une compatibilité complète avec le stockage multi-utilisateur. Ce changement nécessite qu'un volume tmpfs soit monté en tant que /storage dans init.rc. Si ce volume n'est pas disponible, alors Zygote revient au comportement précédent de marquer toute la hiérarchie du système de fichiers comme esclave. Il nécessite également implicitement que EMULATED_STORAGE_TARGET soit préfixé par le chemin (partie de la sous-hiérarchie) ANDROID_STORAGE, ce qui est le cas typique.

En fin de compte, si les applications montent un répertoire ou un périphérique de blocs, le répertoire monté ne devrait être visible que pour les applications qui ont effectué le montage, sauf si l'application a des autorisations spéciales, qui ne sont généralement pas disponibles pour les applications non système. Et même si vous parvenez à monter le répertoire de manière globale, les autorisations Linux seront toujours un obstacle.

Par conséquent, le montage n'est probablement pas la solution la plus simple à votre problème, mais si vous souhaitez vraiment utiliser des montages, vous devriez pouvoir ajouter les commandes à /system/bin/debuggerd et ensuite (en tant que superutilisateur) saisir start debuggerd pour exécuter votre propre script avec des privilèges système.

Il y a cependant un moyen plus simple de contourner les problèmes de lecture seule, soit en installant cette application ou en ajoutant manuellement le groupe media_rw à WRITE_EXTERNAL_STORAGE dans le fichier de permissions. Cela permet aux applications ayant l'autorisation d'écrire sur la carte SD émulée d'écrire également sur la carte SD "externe".

Après avoir rendu votre stockage externe inscriptible, vous devriez pouvoir utiliser des liens symboliques (ln -s /sdcard/MyPics /sdcard/DCIM/Camera) pour permettre un accès rapide à ces répertoires.

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