Question:
Comment lier monter un dossier dans / sdcard avec les autorisations correctes?
francesco
2019-10-18 19:37:06 UTC
view on stackexchange narkive permalink

J'utilise un Sony Xperia M4 Aqua. Comme on le sait, la mémoire interne est plutôt petite. En particulier, le répertoire Media de WhatsApp utilise beaucoup d'espace précieux, donc j'essaye de le déplacer sur la carte SD, j'utilise Android 6 et j'ai formaté la SD carte pour avoir une partition de stockage adoptée.

Le stockage adopté serait normalement utilisé pour migrer tous les / données vers celui-ci, comme indiqué ici. intéressé à déplacer uniquement le répertoire unique WhatsApp / Media ailleurs (éventuellement dans la partition de stockage adoptée), puis à le monter en liaison à son emplacement d'origine.

À cette fin, J'ai déplacé le répertoire WhatsApp / Media vers le stockage adopté. Puis, suite à cette discussion, j'ai modifié le script /system/etc/init.qcom.post_boot.sh en ajoutant les commandes mount suivantes ( le téléphone ne prend pas en charge les scripts init.d )

  mount -o bind / mnt / expand / 4fdb2500-9aa7-44bc-a2c4-80aeae28e764 / WhatsAppMedia / storage / émulé / 0 / WhatsApp / Mediamount -o bind / mnt / expand / 4fdb2500-9aa7-44bc-a2c4-80aeae28e764 / WhatsAppMedia / mnt / runtime / write / émulé / 0 / WhatsApp / Mediamount -o bind / mnt / expand / 4fdb2500 -9aa7-44bc-a2c4-80aeae28e764 / WhatsAppMedia / mnt / runtime / read / émulé / 0 / WhatsApp / Mediamount -o bind / mnt / expand / 4fdb2500-9aa7-44bc-a2c4-80aeae28e764 / WhatsAppMedia / default / mnt émulé / 0 / WhatsApp / Mediamount -o bind / mnt / expand / 4fdb2500-9aa7-44bc-a2c4-80aeae28e764 / WhatsAppMedia / data / media / 0 / WhatsApp / Media  

Remarque: / mnt / expand / 4fdb25 .... pointe vers la partition de stockage adoptée.

Cela ne fonctionne qu'en apparence: si j'ouvre un shell avec adb je peut cor vérifiez que le répertoire WhatsApp / Media contient le répertoire monté. De plus, je ne vois aucune vue supplémentaire contenant le répertoire WhatsApp, comme cela peut être vérifié en faisant, dans un adb shell

  find / -type d -name WhatsApp

Néanmoins, WhatsApp ne peut pas accéder à la galerie multimédia. Par exemple, dans le chat, je vois juste des images floues (comme un aperçu), et en cliquant dessus, je ne vois pas l'image complète. De plus, si quelqu'un m'envoie une photo, tout ce que je peux voir est un aperçu flou avec l'icône de téléchargement. Cliquer sur l'icône de téléchargement ne produit rien.

Les mauvaises permissions sont probablement la source de problèmes. Par exemple, certaines autorisations / propriété de groupe semblent incorrectes sur certaines vues:

  root @ E2303: / # ls -n / storage / emulated / 0 / WhatsAppdrwxrwx - x 0 1015 2019- 09-04 14:37 Backupsdrwxrwx - x 0 1015 2019-10-19 02:00 Bases de donnéesdrwxrwx - x 0 1015 2019-09-04 20:24 Mediaroot @ E2303: / # ls -n / mnt / runtime / write / émulé / 0 / WhatsAppdrwxrwx --- 0 9997 2019-09-04 14:37 Sauvegardesdrwxrwx --- 0 9997 2019-10-19 02:00 Bases de donnéesdrwxrwx - x 0 1015 2019-09-04 20:24 Mediaroot @ E2303: / # ls -n / mnt / runtime / read / emulated / 0 / WhatsAppdrwxr-x --- 0 9997 2019-09-04 14:37 Backupsdrwxr-x --- 0 9997 2019-10-19 02:00 Bases de donnéesdrwxrwx- -x 0 1015 2019-09-04 20:24 Mediaroot @ E2303: / # ls -n / mnt / runtime / default / emulated / 0 / WhatsAppdrwxrwx - x 0 1015 2019-09-04 14:37 Sauvegardesdrwxrwx - x 0 1015 19/10/2019 02:00 Bases de donnéesdrwxrwx - x 0 1015 2019-09-04 20:24 Mediaroot @ E2303: / # ls -n / data / media / 0 / WhatsApp / drwxrwxr-x 1023 1023 2019-09-04 14:37 Sauvegardesdrwxrwxr-x 1023 1023 2019-10-19 02:00 Bases de donnéesdrwxrwx - x 0 1015 2019-09-04 20:24 Médias  

Les autorisations et la propriété de groupe du répertoire Media doivent être le même que les autres répertoires (non montés en liaison) Backups et Databases . Curieusement, une tentative de remonter les répertoires avec le bon gid

  root @ E2303: / # mount -o remount, gid = 9997 / mnt / runtime / write / emulated / 0 / WhatsApp / Mediaroot @ E2303: / # mount -o remount, gid = 9997 / mnt / runtime / read / emulated / 0 / WhatsApp / Mediaroot @ E2303: / # mount -o remount, gid = 1023 / data / media / 0 / WhatsApp / Le média  

ne produit aucun changement dans la propriété du groupe: ls -n comme ci-dessus donne des résultats identiques.

Encore plus étrange, mais peut-être sans rapport, l'omission de l'espace entre remount et gid = ... entraîne

  mount: argument non valide  

Comment lier le dossier de montage WhatsApp / Media à partir d'une carte SD externe avec les autorisations correctes?

Un répondre:
Irfan Latif
2019-10-25 01:10:06 UTC
view on stackexchange narkive permalink

J'ai utilisé deux approches différentes (en fait beaucoup avec de petites différences) sur mes anciennes versions d'Android pour monter tout le répertoire / sdcard / WhatsApp à partir d'une carte SD externe. J'ai testé, cela fonctionne également sur Android 9, mais les choses de stockage ont changé sur Android 10.

Avant d'entrer dans les détails pratiques, nous devons garder à l'esprit quelques points:

  • / sdcard n'est pas un système de fichiers réel mais un système de fichiers émulé . Android utilise sdcardfs (ou FUSE ) pour émuler le stockage réel sur / sdcard . Voir Qu'est-ce que / storage / emulated / 0 /?
  • Les deux systèmes de fichiers ci-dessus ont un contexte SELinux fixe : u: object_r: sdcardfs: s0 (ou u:object_r:fuse:s0).
  • Normalement / data / media est émulé sur / sdcard , mais dans le cas du stockage adoptable lors de la migration des données, /mnt/expand/[UUIDITED/media est émulé. Voir Comment libérer du stockage interne en déplaçant des données ou en utilisant un lien symbolique / bind-mount avec Adoptable Storage?
  • Fichiers et répertoires sur / sdcard ont la propriété et les autorisations fixes qui dépendent de si l'application a l'autorisation android.permission. [READ | WRITE] _EXTERNAL_STORAGE accordée ou non. Les fichiers n'ont jamais d'autorisation exécutable. Les répertoires de données des applications dans / sdcard / Android / data / ont la propriété définie sur l'UID de l'application respective. Pour plus de détails, voir Qu'est-ce que l'UID "u # _everybody"?

    Nous supposons ici que chaque application est autorisée à écrire dans / sdcard en définissant la propriété 0 / 9997 (utilisateur / groupe) et autorisations 0771 / 0660 (répertoires / fichiers).

  • Pour atteindre ledit comportement ci-dessus, depuis Android 6, chaque application est exécutée dans un espace de noms de montage isolé et / stockage / émulé est monté en liaison sur un autre AFFICHER : / mnt / runtime / [default | read | write] / émulé avec propagation de montage privé / esclave. Ainsi, le montage directement sur / storage / emulated n'apparaîtra pas dans les espaces de noms de montage des applications, sauf si vous entrez explicitement l'espace de noms de montage de chaque application. La même chose est vraie si vous montez à partir de l'espace de noms de montage isolé d'une application. Voir La partition est démontée automatiquement dans Android Oreo.

    Nous allons monter à partir de l'espace de noms de montage racine vers / mnt / runtime / write / émulé qui est propagées à tous les espaces de noms de montage des applications.

  • Les vues read et default ont des autorisations différentes de celles de write ( 1) , mais le montage sur les deux n'est généralement pas nécessaire. Les autorisations READ_EXTERNAL_STORAGE et WRITE_EXTERNAL_STORAGE appartiennent au même groupe d'autorisations. Ainsi, en octroyer un à une application via l'interface graphique accorde également l'autre, et toutes les applications avec l'autorisation de stockage ne verront que la vue écriture . par défaut permet uniquement aux applications (qui n'ont pas l'autorisation de stockage READ / WRITE) de traverser les répertoires / sdcard / Android / data . Donc, monter sur default permettra à ces applications de simplement passer par les sous-répertoires sur / sdcard / , aucun fichier ne sera visible.

    Aussi au moins avec l'émulation sdcardfs , read et write sont montés en liaison ( 2) à partir de par défaut et le montage sur l'un se monte également sur les deux autres. Il n'est donc pas possible de monter les trois avec des autorisations différentes.

  • / sdcard ne prend pas en charge les attributs étendus ( xattr ) et l'heure d'accès ( atime ). Les autres options de montage incluent nosuid , nodev et noexec . Consultez la page de manuel mount pour plus de détails.

Tout d'abord, assurez-vous que vous êtes dans l'espace de noms de montage racine comme expliqué dans le lien ci-dessus. Ou utilisez nsenter pour obtenir un shell racine dans l'espace de noms global:

  ~ # [$ (readlink / proc / 1 / ns / mnt) = $ (readlink / proc / self / ns / mnt)] || busybox nsenter -t 1 -m / system / bin / sh  

1. MONTAGE MANUELLE DE LA CARTE SD:

Le moyen le plus simple est de formater la carte SD externe en tant que stockage portable avec exFAT ou FAT32 . Étant donné que ces systèmes de fichiers ne sont pas natifs de Linux, leurs implémentations de pilotes dans le noyau prennent en charge uid , gid , fmask et dmask options de montage. Vous pouvez utiliser les pilotes exfat ou sdfat avec exFAT et vfat avec FAT32 . Former a également une implémentation de l'espace utilisateur mount.exfat-fuse qui ne nécessite que le support FUSE du noyau. Vérifiez avec grep fuse /proc/filesystems.

Disons que / dev / block / sda1 est votre partition exFAT :

  ~ # mount -t exfat -o nosuid, nodev, noexec, noatime, context = u: object_r: sdcardfs: s0, uid = 0, gid = 9997, fmask = 0117, dmask = 0006 / dev / block / sda1 / mnt / runtime / write / emulated / 0 / WhatsApp ~ # mv / data / media / 0 / WhatsApp / * / sdcard / WhatsApp /  

* Remplacez u: object_r: sdcardfs: s0 par u: object_r: fuse: s0 ou quel que soit le libellé de votre / sdcard . Sup >

Vous pouvez également créer plusieurs partitions sur la carte SD. Ou après le montage avec les options de montage requises, vous pouvez également lier le montage d'un répertoire au lieu de la partition entière. Disons que vous montez d'abord la carte SD sur / mnt / my_sdcard , puis liez le répertoire de montage WhatsApp:

  ~ # mount -o bind / mnt / ma_sdcard / WhatsApp / mnt / runtime / write / émulé / 0 / WhatsApp  

Inconvénient avec cette approche est que vold monte la carte SD externe au démarrage, vous devez donc d'abord démonter.
Deuxièmement, les données sur la carte SD ne sont pas cryptées, bien qu'il existe plusieurs façons de crypter manuellement . Voir Décrypter la carte microSD sur un autre appareil Android ou ordinateur de bureau.

2. STOCKAGE ADOPTABLE:

Un moyen simple de contrer les inconvénients mentionnés ci-dessus est d'utiliser le FDE intégré du noyau en formatant la carte SD comme stockage adoptable, mais seulement si vous ne le souhaitez pas migrer tous les / data / media / vers une carte SD externe. Une fois formatée, la carte SD externe sera montée sur / mnt / expand / [UUID] (le système de fichiers UUID est un nombre de 16 octets). Mais nous ne pouvons pas simplement lier le montage d'un répertoire à partir de là à / sdcard car le système de fichiers sur Adoptable Storage est ext4 , qui suit le modèle d'autorisations UNIX mais les applications ne peuvent pas gérer ceux comme expliqué ci-dessus. Même si vous le faites fonctionner d'une manière ou d'une autre (en utilisant chown , chmod etc.), chaque application créera des fichiers avec son propre UID qui ne sera pas accessible à d'autres applications, par exemple La galerie peut ne pas pouvoir voir les images téléchargées par WhatsApp.

Pour que cette méthode fonctionne, votre noyau doit prendre en charge sdcardfs (vérifiez avec grep sdcardfs / proc / filesystems ). Créez un répertoire sur la carte SD adoptée et émulez-le sur /sdcard/WhatsApp:

  ~ # mkdir / mnt / expand / [UUID] / media / 0 / WhatsApp ~ # mv / sdcard / WhatsApp / * / mnt / expand / [UUID] / media / 0 / WhatsApp / ~ # restorecon -rv / mnt / expand / [UUID] / media / ~ # mount -t sdcardfs -o nosuid, nodev, noexec, noatime, mask = 7, gid = 9997 / mnt / expand / [UUID] / media / 0 / WhatsApp / mnt / runtime / write / émulé / 0 / Whatsapp  

Veuillez noter que nous devons nécessairement utiliser le chemin / mnt / expand / [UUID] / media / car il est étiqueté comme media_rw_data_file ( 3) (comme / data / media ( 4) ) qui est autorisé par la politique SELinux à être consulté par applications ( 5) . Si vous utilisez un chemin différent, vous devez modifier la stratégie SELinux. Contrairement à d'autres systèmes de fichiers, sdcardfs ne change pas le contexte SELinux lors de l'accès au système de fichiers sous-jacent.

3. STOCKAGE PORTABLE / ADOPTABLE:

Cette méthode est la plus flexible, elle fonctionne si vous souhaitez utiliser:

  • Stockage portable mais ne voulez pas monter la partition entière, à la place un répertoire.
  • Stockage adaptable mais votre noyau ne prend pas en charge sdcardfs .
  • Stockage adoptable mais ne souhaite pas utiliser / mnt / expand / [UUID] / media / chemin nécessairement.

Utilisez un outil tiers nommé bindfs (qui utilise FUSE) pour simuler le comportement du système de fichiers émulé. En fait, l'outil intégré d'Android / system / bin / sdcard fait exactement cela sur les versions pré- sdcardfs mais il a des chemins fixes et d'autres inutiles choses, donc son code source doit être modifié pour atteindre ce que nous voulons. Vous pouvez créer des bindfs vous-même ou essayer celui-ci celui-ci.

  ~ # DIR = / mnt / media_rw / [UUID] # pour le stockage portable ~ # DIR = / mnt / expand / [UUID] # pour le stockage adoptable ~ # mkdir $ DIR / WhatsApp ~ # mv / sdcard / WhatsApp / * $ DIR / WhatsApp / ~ # bindfs -o nosuid, nodev, noexec, noatime, context = u: object_r: sdcardfs: s0 -u 0 -g 9997 -p a-rwx, ug + rw, ugo + X --create-with-perms = a-rwx, ug + rw, ugo + X --xattr-none --chown-ignore --chgrp-ignore --chmod-ignore $ DIR / WhatsApp / mnt / runtime / write / émulé / 0 / WhatsApp  

Notes complémentaires:

  • sdcardfs fonctionne également partiellement avec cette méthode sauf qu'elle ne prend pas en charge l'option SELinux context = (jusqu'à présent). Cela dépend donc de l’étiquette SELinux du répertoire de sauvegarde sur la carte SD.
  • Autres outils comme rclone , encfs , sshfs etc. qui utilisent FUSE peut également être monté à l'intérieur de / sdcard de la même manière. En relation: Comment monter rclone sur Android?
  • Les options -u et -g nécessitent / etc / passwd et / etc / group pour exister sur bindfs < v 1.14.2.

Vous pouvez donc choisir la méthode qui vous convient. En général, les pilotes dans le noyau fonctionnent mieux que les solutions en espace utilisateur, et les méthodes natives du noyau Linux sont plus robustes et stables. FUSE (over FUSE) peut parfois affecter les performances, par ex. si la carte SD elle-même prend en charge les transferts de données à grande vitesse.

Vous pouvez placer les commandes de montage requises dans un script init.d ou définir un service init . Voir Comment exécuter un exécutable au démarrage et le maintenir en cours d'exécution?

  • Applications qui ne sont pas t scannez le système de fichiers / sdcard eux-mêmes, mais comptez sur le MediaProvider d'Android pour toute modification, il peut être nécessaire de procéder à une analyse forcée des médias pour que les nouveaux fichiers sur le système de fichiers monté apparaissent immédiatement.
  • Si vous utilisez plusieurs utilisateurs ou profils, vous devez monter un nouveau système de fichiers pour chaque User_ID . Pour le propriétaire de l'appareil, il s'agit de 0 .

Salut Irfan.En passant par votre réponse méticuleuse ... (et merci pour la même chose) ... Ma situation est une carte multi `partitionnée ext4` où même la partition principale est `ext4`.Ma ROM est une ROM Stock qui, contrairement à `lineage`, ne supportera pas` ext4 mount` hors de la boîte.Je peux «monter» mes «partitions» avec une approche similaire à «init.d» et elles sont visibles pour les applications «TC enracinées» mais elles ne sont pas RW.Je voudrais «partition» large «RW» pour certaines applications.Pas seulement des répertoires privés.J'ai essayé `vold-posix` il n'aime pas mon OS et mon arch.n` pas exécutable: fichier ELF 64 bits` J'obtiens cette erreur pour `bindfs`.Tout autre ?
`getprop ro.product.cpu.abilist donne armeabi-v7a, armeabi`.Toute autre approche pour que je puisse obtenir un `montage` de large` partition RW` pour des applications `enracinées` et non enracinées spécifiques (l'application non enracinée est le gestionnaire de fichiers de la ROM stock qui est appelé par défaut par toutes les applications pour traverser les répertoires).Si je comprends bien, Android «désapprouve cela, mais je l'apprécierais», si vous pouvez ajouter vos 2 cents!
Si cette approche `` à l'échelle de la partition '' n'est pas faisable, au moment du montage, vous souhaitez donner des ID d'application spécifiques RW.dans le cadre du montage.Comment puis-je faire ceci ?
@user1874594 nous avons eu des discussions similaires sur vos questions précédentes et ne pouvions guère conclure quoi que ce soit.Je ne pense donc pas pouvoir expliquer quoi que ce soit de plus récent que ce que j'ai déjà fait.Je n'ai pas de binaire ARM `bindfs` 32 bits, vous devez construire à partir des sources.Si vous ne pouvez pas, faites-le moi savoir et je vous en construirai un quand j'aurai le temps.En ce qui concerne vos autres requêtes, elles ne peuvent pas (encore) être expliquées dans les commentaires.Vous pouvez poser une question précise et unique avec toutes les informations nécessaires et je peux essayer de vous expliquer brièvement les étapes spécifiques à votre situation.
https://stackoverflow.com/q/60770589/1874594
oui cela a été discuté dans un contexte différent après cela, j'ai pu gérer la pièce de montage, mais en faire RW, c'est là que je suis coincé et j'espère que je suis clair maintenant désolé je m'excuse si je n'ai pas été assez clair pour articuler ma situation et mon objectif
https://android.stackexchange.com/questions/222205/making-manually-mounted-partition-folders-write-accessible-to-all-apps désolé je l'ai déplacé vers Android Stack à partir de la `` pile régulière '' ci-dessus est le bon lien


Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 4.0 sous laquelle il est distribué.
Loading...