Comment puis-je monter une carte SD au format ext4 avec les autorisations correctes (avec root)?

9

Je vois ici quelques mentions de la création d'une carte SD au format ext4, mais pas de guide. Cette question étroitement liée suggère qu'il n'y a aucun moyen de le faire, mais ma question diffère en ce que mon téléphone est spécifiquement enraciné.

J'ai formaté ma carte en ext4 (table de partition GUID); mon téléphone CyanogenMod l'a monté à/mnt/fuse/sdcard1 . J'ai suivi les instructions ici pour monter la carte à /storage/sdcard1, en créant le script suivant à/data/local/userinit.sh

#!/system/bin/sh
REALMNT=/mnt/fuse/sdcard1_real
if ! [ -d "$REALMNT" ]; then
  mkdir "$REALMNT" || exit 1
fi
mount -t ext4 /dev/block/mmcblk1p1 "$REALMNT"
sdcard "$REALMNT" /storage/sdcard1 1023 1023 &

J'ai redémarré et tenté de copier un fichier (à l'aide de ES File Explorer) et de le coller dans son répertoire parent, ce qui a échoué:

/storage/sdcard1/foo/bar.mp3: open failed: EACCES (Permission denied).

Je peux effectivement lire le fichier correctement, donc je peux l' ouvrir. FWIW, lorsque j'essaie de copier à partir du point de montage d'origine ( /mnt/fuse/sdcard1), j'obtiens une erreur légèrement différente:

Failed to copy the file bar.mp3

J'utilise un Samsung Galaxy S3 avec Cyanogenmod 10.2.0-i9300.

== EDIT ==

su
ls -l /mnt/fuse
drwxrwxr-x media_rw media_rw   2014-03-04 22:08 sdcard1

C'était tout. Il n'y sdcard1_realen a pas dans ce répertoire, donc je suppose que le script échoue?

== EDIT2 ==

J'ai essayé de modifier le script pour dépanner. Le script commence bien, mais échoue ensuite mkdir "$REALMNT"avec l'erreur/data/local/userinit.sh[6]: : not found .

== EDIT3 ==

Je sais que le script ne fonctionne pas, donc le corriger pourrait résoudre ma question, mais je pensais que ce qui suit était intéressant. J'ai formaté ma carte SD dans mon ordinateur Linux et y ai transféré certains fichiers. Curieusement, les erreurs d'autorisation ne se produisent que dans les sous-répertoires que j'ai créés. À la racine de la partition (via /storage/sdcard1), j'ai déjà une autorisation d'écriture.

Sparhawk
la source
1
En tant que root, veuillez exécuter ls -l /mnt/fuse/et ls -l /mnt/fuse/sdcard1_real. Modifiez ensuite votre question pour inclure les résultats. Ma supposition est "de mauvaises autorisations de fichier" - soit pour le montage, soit pour le foo/répertoire sur la carte. N'oubliez pas, ext4 prend en charge les autorisations de fichier nix * complètes, y compris. utilisateur et groupes.
Izzy
Vous tapez suterminal pour obtenir root. Vous devrez peut-être confirmer l'octroi de l'autorisation par téléphone, si vous le faites pour la première fois.
Chahk
Soit le script échoue, soit il n'est pas exécuté du tout. Vous voudrez peut-être ajouter une sortie de débogage, par exemple echo Script executed > /mnt/fuse/sdcard1/test.log, et vérifier si elle est en cours d'exécution. Si c'est le cas, effectuez l'avant-dernière ligne mount -t ext4 /dev/block/mmcblk1p1 "$REALMNT" 2> /mnt/fuse/sdcard1/test.loget vérifiez le message d'erreur. Ou exécuter manuellement le script pour voir: su /data/local/userinit.sh.
Izzy
@Izzy touchmontre que le script est en cours d'exécution. J'ai essayé d'exécuter le script manuellement avec su /data/local/userinit.sh, mais cela a échoué. J'ai aussi essayé su echo foo, et obtenir une erreur semblable: Unknown id: echo.
Sparhawk
Quant à votre EDIT3, voir mon premier commentaire: ext4 prend en charge les autorisations de fichier complet * nix, incl. utilisateur et groupes . Vous avez créé ces répertoires avec un utilisateur qui n'existe pas sur votre appareil Android, ils appartiennent donc à "utilisateur inconnu / groupe inconnu". Si vous n'avez pas accordé l'accès en écriture à "world", seul root pourrait y écrire. Vous devriez vous familiariser avec ces bases de * nix lorsque vous utilisez un tel système de fichiers sur un support portable;) En ce qui concerne le script, je suggère à nouveau d'ajouter des informations de débogage supplémentaires, par exemple en utilisant echopour sortir chaque commande avant son exécution et rediriger la sortie d'erreur avec 2>>.
Izzy

Réponses:

6

Ce problème aurait été résolu il y a plusieurs mois, mais les gens signalent toujours des problèmes. Je peux lire les éléments sur la carte, mais je n'ai pas la permission d'écrire. Pour y remédier, j'ai combiné des stratégies à partir de quelques sources .

  1. Carte de partition avec table de partition MS-DOS et système de fichiers ext4. J'ai utilisé GParted sur mon ordinateur de bureau (Linux).
  2. Insérez la carte dans votre téléphone. (Vous n'aurez probablement pas accès en écriture maintenant.)
  3. Ouvrez l' émulateur de terminal , installé par défaut dans CyanogenMod.
  4. Tapez ce qui suit (je recommande le clavier WiFi pour les gros blocs de texte). Accordez à l'émulateur des privilèges root lorsqu'il les demande.

Les invites $et #indiquent, alors ne les saisissez pas.

$ su
# chown media_rw:media_rw /mnt/media_rw/sdcard1
# chmod g+w /mnt/media_rw/sdcard1

Cela modifie les autorisations de la carte SD. Le propriétaire et le groupe passent de systemà media_rw, et cela donne également au groupe un accès en écriture.

Sparhawk
la source
besoin -R pour chown récursif -R media_rw: media_rw / mnt / media_rw / sdcard1
m3asmi
1

Vous ne savez pas s'il s'agit d'une aide, mais le problème est peut-être que vous essayez de monter au mauvais endroit? Voici mon script de travail qui fonctionne sur un mini S3 avec CM11:

#!/system/bin/sh
REALMNT=/mnt/media_rw/sdcard1
if ! [ -d "$REALMNT" ]; then
mkdir "$REALMNT" || exit 1
fi
mount -t ext4 -o rw,noatime /dev/block/mmcblk1p1 "$REALMNT"
sdcard "$REALMNT" /storage/sdcard1 1023 1023 

L'emplacement REALMNT existait déjà, donc bien sûr le mkdir n'a jamais été appelé. Et media_rw / sdcard1 appartient déjà à media_rw

J'ai également dû mettre à jour /etc/permissions/platform.xml pour inclure: <group id="media_rw"/> dans: <permission name="android.permission.WRITE_EXTERNAL_STORAGE">

user59177
la source
Merci. J'avais quelque peu abandonné cela, car j'avais également une utilisation élevée de la batterie avec mon script. Puisqu'il est fixé dans le coffre, je ne m'embêterai plus avec une solution de contournement. Merci cependant, et +1.
Sparhawk
@Sparhawk: Je ne sais pas quelle version CYM vous utilisez, mais ma carte SD n'est pas montée automatiquement.
Luis A. Florit
@ LuisA.Florit Je ne sais pas si vous vouliez répondre à cette réponse . Quoi qu'il en soit, j'utilise 11-20140804-SNAPSHOT-M9-i9300. J'ai publié plus d'informations dans une autre réponse .
Sparhawk
@Sparhawk: Ma carte n'est même pas montée et la procédure de montage dans Paramètres échoue. Peut-être que le problème est lié à ma question ici ( sune parvient pas à monter ): android.stackexchange.com/questions/82089/… `J'utilise cm-11-20140804-SNAPSHOT-M9-mondrianwifi.zip.
Luis A. Florit
@ LuisA.Florit Pas vraiment sûr. Peut-être poser une nouvelle question?
Sparhawk
0

Il y avait une réponse postée par adasdadasd que je voulais accepter, mais a depuis été supprimée. Je vais le reproduire ci-dessous et accepter ma réponse, mais si adasdadasd refait surface, veuillez le republier et je le supprimerai et accepterai le vôtre.

https://jira.cyanogenmod.org/browse/CYAN-332

https://github.com/CyanogenMod/android_packages_providers_MediaProvider/commit/faf3f77b9222554227740aed8127714ea9e3f407

Fixé par défaut? Nouveau changement dans github.

Sparhawk
la source