15 votes

Comment puis-je faire un lien symbolique (ou équivalent) à l'intérieur de /storage/emulated/0 ?

Donc, j'ai enraciné mon téléphone (GT-i9505 avec Android 5.0.1) et je voudrais déplacer mon dossier WhatsApp vers ma carte SD externe pour économiser 3 Go sur le stockage interne. Voici ce que j'ai essayé jusqu'à présent.

EDIT : solution trouvée

Donc, après tout, l'option 2 semblait être la bonne, mais elle nécessitait quelques ajustements pour fonctionner. Comme suggéré par Irfan Latif Le problème est que le point de montage doit être créé dans un espace de nom de montage global, sinon les autres applications ne le verront pas :

su -mm
mount -o bind /data/sdext2/AppData/WhatsAppMedia /sdcard/WhatsApp/Media

Mais cela peut ne pas être suffisant ! Cela ne fonctionnait toujours pas jusqu'à ce que je m'assure que l'espace de nom de Root était global. Pour cela, je ne connais pas de méthode universelle, mais ce qui a fonctionné pour moi, c'est d'aller dans les paramètres de l'application SuperSU et de décocher l'option mount namespace separation .

Cela dépend vraiment de l'application SU que vous avez installée.

Option 1 : lien symbolique

La première chose à laquelle j'ai pensé est de faire un lien symbolique, c'est donc la commande que j'ai utilisée :

ln -s "/data/sdext2/AppData/WhatsAppMedia" "/sdcard/WhatsApp/Media"

J'avais déjà créé une deuxième partition sur ma carte SD externe (ext4) qui est montée dans /data/sdext2

Cependant, ce retour operation not permitted en utilisant l'émulateur de terminal (oui j'ai fait su ) et une erreur avec toutes les applications de gestion de fichiers racine que j'ai essayées.

Après quelques recherches, j'ai compris que pour une raison quelconque, bien que /storage/emulator/0 est dans une partition ext, elle est traitée différemment et ne supporte pas les liens symboliques à l'intérieur (corrigez-moi si je me trompe).

Alors, passons à la chose suivante

Option 2 : monter

Según cette question la commande suivante devrait monter le dossier de la carte SD externe dans un autre dossier de la carte SD interne, sans avoir besoin d'un lien symbolique.

mount -o bind "/data/sdext2/AppData/WhatsAppMedia" "/sdcard/WhatsApp/Media"

Cependant, alors que l'exécution de la commande ne renvoie aucune erreur le dossier dans /sdcard/WhatsApp/Media est toujours vide, donc je ne sais pas vraiment comment gérer cela.

Option 3 : lien symbolique dans /data/media/

J'ai suivi les instructions sur ce poste et fait le lien symbolique dans /data/media/0 au lieu du stockage, donc en utilisant cette commande :

ln -s "/data/sdext2/AppData/WhatsAppMedia" "/data/media/0/WhatsApp/Media"

Cette fois, le lien est créé ! Cependant...

Bien qu'un ls sur /data/media/0/WhatsApp/Media a révélé que la liaison a réussi, cd /sdcard/WhatsApp/Media renvoie un très irritant no such file or directory et cela est confirmé par l'explorateur de fichiers qui montre un dossier vide avec une icône de fichier vide.

Mes réflexions

Tout d'abord, je viens de découvrir que je déteste vraiment Android. Maintenant, énoncé cela, voici ce que je pense pourrait aider à faire :

  • en déplaçant mes fichiers de carte SD ailleurs : si le reste du système de fichiers Root supporte les liens symboliques (ce qui semble être le cas), je pourrais même déplacer le dossier /storage/emulated/0 ailleurs et faire un nouveau lien vers lui, mais je ne sais pas si cela résoudrait le problème

C'est tout pour le moment, je mettrai à jour avec d'autres options quand j'y penserai...

14voto

Irfan Latif Points 16863

Android STORAGE :

Sur Android 5 :

/sdcard >S> /storage/emulated/legacy >S> /mnt/shell/emulated/0
/mnt/shell/emulated >E> /data/media

Sur Androïd 6+. :

# USER-ID of current user in case of multiple users, normally "0"

# for apps
# VIEW is one of "read" or "write" and /storage to VIEW bind mount is inside a separate mount namespace for every app
/sdcard >S> /storage/self/primary
/storage/self >B> /mnt/user/USER-ID
/mnt/user/USER-ID/primary >S> /storage/emulated/USER-ID
/storage/emulated >B> /mnt/runtime/VIEW/emulated
/mnt/runtime/VIEW/emulated >E> /data/media

# for services/daemons/processes in root namespace
/sdcard >S> /storage/self/primary
/storage >B> /mnt/runtime/default
/mnt/runtime/default/self/primary >S> mnt/user/0/primary
/mnt/user/0/primary >S> /storage/emulated/0
/storage/emulated >B> /mnt/runtime/default/emulated
/mnt/runtime/default/emulated >E> /data/media

>S> pour le lien symbolique, >E> pour l'émulation et >B> pour le montage de bind

En bref, /sdcard Les points suivants /data/media/0 par le biais de FUSE o sdcardfs émulation. Il s'agit de limiter l'accès non autorisé des applications/processus aux supports privés de la carte SD. Lire Le parcours de stockage d'Android .

SYMLINKS :

Maintenant /sdcard n'est pas un stockage réel mais émulé qui représente un système de fichiers FAT/vFAT/FAT32 (pour la rétrocompatibilité et la gestion des permissions) qui ne prend pas en charge les liens symboliques (et d'autres choses, notamment les autorisations *NIX et les ioctls como FS_IOC_FIEMAP ). Ainsi, vos options 1 et 3 ne fonctionneront pas, que vous créiez un lien symbolique directement sur le stockage émulé ou que vous essayiez d'émuler le lien symbolique déjà créé sur ext4.

BIND MOUNT :

Il s'agit de l'alternative communément utilisée pour les liens symboliques dans les systèmes de fichiers de la famille FAT. Ce que vous avez essayé dans l'option 2 devrait fonctionner. C'est ce que des applications comme Apps2SD faire. Mais il y a à nouveau une contrainte : mount namespace . Vous devez lier le montage dans l'espace de nom global/Root mount pour que le montage soit visible par toutes les applications :

su -mm -c 'mount -o bind "/data/sdext2/AppData/WhatsApp Media" "/sdcard/WhatsApp/Media"'

Sur Android 6+, cela doit être monté en bind sur chaque VIEW (par défaut, lecture, écriture) séparément pour que toutes les applications fonctionnent.

Vous pouvez le rendre permanent en définissant Mode de montage de l'espace de nom a Global dans Magisk ou en désactivant Séparation de l'espace de nom de la montagne dans SuperSU. Pour plus de détails, voir ceci réponse .


RELATION :

1voto

Installer MiXplorer à partir de ce fil de discussion XDA aquí → naviguer jusqu'au chemin d'accès à l'aide de MiXplorer → cliquer sur + en bas → choisissez "Créer un lien symbolique".

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