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
.