Wie kann ich eine ext4-formatierte SD-Karte mit den richtigen Berechtigungen (mit root) mounten?

Ich sehe hier einige Erwähnungen zum Erstellen einer ext4-formatierten SD-Karte, aber keine Anleitung. Diese eng verwandte Frage deutet darauf hin, dass es keine Möglichkeit gibt, aber meine Frage unterscheidet sich darin, dass mein Telefon speziell gerootet ist.

Ich habe meine Karte als ext4 (GUID-Partitionstabelle) formatiert; Mein Cyanogenmod-Telefon hat es unter installiert /mnt/fuse/sdcard1. Ich habe die Anweisungen hier befolgt , um die Karte unter zu mounten /storage/sdcard1, indem ich das folgende Skript unter erstellt habe/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 &

Ich habe neu gestartet und versucht, eine Datei (mit ES File Explorer) zu kopieren und in ihr übergeordnetes Verzeichnis einzufügen, was fehlgeschlagen ist:

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

Ich kann die Datei eigentlich gut abspielen, also kann ich sie öffnen. FWIW, wenn ich versuche, vom ursprünglichen Einhängepunkt ( /mnt/fuse/sdcard1) zu kopieren, erhalte ich einen etwas anderen Fehler:

Failed to copy the file bar.mp3

Ich verwende ein Samsung Galaxy S3 mit Cyanogenmod 10.2.0-i9300.

==BEARBEITEN==

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

Das war alles. Es gibt keine sdcard1_realin diesem Verzeichnis, also nehme ich an, dass das Skript fehlschlägt?

==BEARBEITEN2==

Ich habe versucht, das Skript zu ändern, um Fehler zu beheben. Das Skript beginnt einwandfrei, schlägt dann aber mkdir "$REALMNT"mit dem Fehler fehl /data/local/userinit.sh[6]: : not found.

==BEARBEITEN3==

Ich weiß, dass das Skript nicht funktioniert, also könnte das Reparieren meine Frage lösen, aber ich fand das Folgende interessant. Ich habe meine SD-Karte in meinem Linux-Computer formatiert und einige Dateien darauf übertragen. Seltsamerweise treten Berechtigungsfehler nur in den von mir erstellten Unterverzeichnissen auf. Im Stammverzeichnis der Partition (über /storage/sdcard1) habe ich bereits Schreibrechte.

Führen Sie als root bitte ls -l /mnt/fuse/und aus ls -l /mnt/fuse/sdcard1_real. Bearbeiten Sie dann Ihre Frage, um die Ergebnisse einzuschließen. Meine Vermutung ist "falsche Dateiberechtigungen" - entweder für den Mount oder für das foo/Verzeichnis auf der Karte. Denken Sie daran, dass ext4 volle *nix-Dateiberechtigungen unterstützt, inkl. Benutzer und Gruppen.
Sie geben suTerminal ein, um root zu werden. Möglicherweise müssen Sie die Erteilung der Berechtigung am Telefon bestätigen, wenn Sie dies zum ersten Mal tun.
Entweder schlägt das Skript fehl oder es wird überhaupt nicht ausgeführt. Vielleicht möchten Sie eine Debug-Ausgabe hinzufügen, z. B. echo Script executed > /mnt/fuse/sdcard1/test.log, und prüfen, ob sie überhaupt läuft. Wenn dies der Fall ist, erstellen Sie die vorletzte Zeile mount -t ext4 /dev/block/mmcblk1p1 "$REALMNT" 2> /mnt/fuse/sdcard1/test.logund überprüfen Sie die Fehlermeldung. Oder führen Sie das Skript manuell aus, um Folgendes anzuzeigen: su /data/local/userinit.sh.
@Izzy touchzeigt, dass das Skript ausgeführt wird. Ich habe versucht, das Skript manuell mit auszuführen su /data/local/userinit.sh, aber das ist fehlgeschlagen. Ich habe es auch versucht su echo foound erhalte einen ähnlichen Fehler: Unknown id: echo.
Was Ihr EDIT3 betrifft, siehe meinen ersten Kommentar: ext4 unterstützt vollständige * nix-Dateiberechtigungen, inkl. Benutzer und Gruppen . Sie haben diese Verzeichnisse mit einem Benutzer erstellt, der auf Ihrem Android-Gerät nicht existiert, daher gehören sie zu "unbekannter Benutzer/unbekannte Gruppe". Wenn Sie "world" keinen Schreibzugriff gewährt haben, kann nur root dort schreiben. Sie sollten sich mit diesen *nix-Grundlagen vertraut machen, wenn Sie ein solches Dateisystem auf tragbaren Medien verwenden ;) Was das Skript betrifft, schlage ich wieder vor, einige weitere Debug-Informationen hinzuzufügen, echoz 2>>.
@Izzy Wenn ich das richtig verstehe, besteht der Zweck des Skripts darin, diese Berechtigungsinkonsistenzen zu beheben? Ich habe mehr Debugging gemacht, aber vielleicht war EDIT2 nicht klar genug. Das Skript lief bis , exit 1schlug dann mit dem angegebenen Fehler fehl.
Könnte es sein, dass das Skript zu früh ausgeführt wird und /mnt/fusenicht da ist, wenn Sie es versuchen mkdir(versuchen Sie, ein ls /mntvor den mountBefehl zu setzen)? Wenn ja, mkdir -p "$REALMNT" || exit 1könnte man das umgehen – aber ich bin mir nicht sicher, ob es Nebenwirkungen gibt, wenn das System versucht, es /mnt/fusespäter zu erstellen, und es bereits existiert.
@IrfanLatif Ich habe kein Telefon mehr mit einer SD-Karte, aber im Gegensatz zu Ihrer Antwort im Link erinnere ich mich nicht an Probleme mit "Jede App erstellt Dateien mit ihrer eigenen UID", wie meine Antwort unten zeigt. Ich kann das aber leider nicht mehr genau überprüfen. Wie auch immer, hoffentlich ist Ihr Link für einige hier nützlich.

Antworten (4)

Dies wurde angeblich vor einigen Monaten behoben, aber die Leute melden immer noch Probleme. Ich kann Artikel auf der Karte lesen, habe aber keine Schreibberechtigung. Um es zu beheben, habe ich Strategien aus einigen Quellen kombiniert .

  1. Partitionskarte mit MS-DOS-Partitionstabelle und ext4-Dateisystem. Ich habe GParted auf meinem (Linux-)Desktop-Computer verwendet.
  2. Legen Sie die Karte in Ihr Telefon ein. (Wahrscheinlich haben Sie jetzt keinen Schreibzugriff.)
  3. Öffnen Sie den Terminal-Emulator , der standardmäßig in Cyanogenmod installiert ist.
  4. Geben Sie Folgendes ein (ich empfehle die WiFi-Tastatur für große Textblöcke). Geben Sie dem Emulator Root-Rechte, wenn er sie anfordert.

Die $und #zeigen Eingabeaufforderungen an, geben Sie sie also nicht ein.

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

Dadurch ändern sich die Berechtigungen der SD-Karte. Der Eigentümer und die Gruppe ändern sich von systemin media_rwund geben der Gruppe auch Schreibzugriff.

Benötige -R für rekursives chown -R media_rw:media_rw /mnt/media_rw/sdcard1

Ich bin mir nicht sicher, ob es hilfreich ist, aber möglicherweise liegt das Problem darin, dass Sie versuchen, an der falschen Stelle zu montieren? Dies ist mein Arbeitsskript, das auf einem S3 mini mit CM11 funktioniert:

#!/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 

Der REALMNT-Speicherort existierte bereits, daher wurde mkdir natürlich nie aufgerufen. Und media_rw/sdcard1 gehört bereits media_rw

Ich musste auch /etc/permissions/platform.xml aktualisieren, um Folgendes einzuschließen: <group id="media_rw"/>in:<permission name="android.permission.WRITE_EXTERNAL_STORAGE">

Vielen Dank. Ich hatte das etwas aufgegeben, da ich mit meinem Skript auch einen hohen Akkuverbrauch hatte. Da es im Trunk behoben ist, werde ich mich nicht mehr um eine Problemumgehung kümmern. Danke aber und +1.
@Sparhawk: Ich bin mir nicht sicher, welche CYM-Version Sie verwenden, aber meine SD-Karte wird nicht automatisch gemountet.
@LuisA.Florit Ich bin mir nicht sicher, ob Sie auf diese Antwort antworten wollten . Wie auch immer, ich verwende 11-20140804-SNAPSHOT-M9-i9300. Ich habe weitere Informationen in einer anderen Antwort gepostet .
@Sparhawk: Meine Karte ist nicht einmal gemountet und der Mount-Vorgang in den Einstellungen schlägt fehl. Vielleicht hängt das Problem mit meiner Frage hier zusammen ( android.stackexchange.com/questions/82089/…su kann nicht gemountet werden ` Ich verwende cm-11-20140804-SNAPSHOT-M9-mondrianwifi.zip . ):
@LuisA.Florit Nicht ganz sicher. Vielleicht eine neue Frage stellen?
@Sparhawk: Ich habe mehrere Fragen zu CYM gestellt und keine einzige Antwort erhalten. Ohne CYM viel zu verwenden, bin ich auf mehrere Fehler gestoßen (wie diesen), und niemand konnte einen Hinweis auf einen von ihnen geben (weder im Stackexchange noch im CYM-Forum). Ich denke, ich werde ein anderes benutzerdefiniertes ROM installieren, ein solideres. Das funktioniert bei mir einfach nicht richtig.
Ich habe dieses Skript in Stock Android 4.4.4 (Galaxy Note 4) verwendet, aber die Dateien in /storage/sdcard1/ werden mit dem Besitz 0.1015 anstelle von 1023.1023 angezeigt, was natürlich zu vielen Fehlern mit „Zugriff verweigert“ führt. Irgendeine Idee warum?

Es gab eine Antwort von adasdadasd , die ich akzeptieren wollte, die aber inzwischen gelöscht wurde. Ich werde es unten reproduzieren und meine Antwort akzeptieren, aber wenn adasdadasd wieder auftaucht, posten Sie bitte erneut und ich werde dies löschen und Ihre akzeptieren.

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

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

Standardmäßig behoben? Neue Änderung in github.

Hier die Einfachheit

#!/system/bin/sh
REALMNT="/mnt/media_rw/extSdCard"
mount -t ext4 -o rw,noatime /dev/block/mmcblk1p1     "$REALMNT"
sdcard "$REALMNT" /storage/extSdCard 1023 1023 &

Und hier beschreibbar ext4 auf externe SD

#!/system/bin/sh
chown media_rw:media_rw /mnt/media_rw/extSdCard
chmod g+w /mnt/media_rw/extSdCard

Sie können "extSdCard" wie "sdcard1" ändern, wo Ihre externe SD-Karte montiert ist

Ich habe Stockrom mit Kingroot verwendet, aber ich versuche, Supersu seine Probleme mit dem Mounten des Dateisystems zu lösen