¿Cómo puedo montar una tarjeta SD con formato ext4 con los permisos correctos (con root)?

Veo algunas menciones aquí sobre la creación de una tarjeta SD con formato ext4, pero ninguna guía. Esta pregunta estrechamente relacionada sugiere que no hay forma de hacerlo, pero mi pregunta difiere en que mi teléfono está específicamente rooteado.

Formateé mi tarjeta como ext4 (tabla de particiones GUID); mi teléfono Cyanogenmod lo montó en /mnt/fuse/sdcard1. Seguí las instrucciones aquí para montar la tarjeta en /storage/sdcard1, creando el siguiente script en/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 &

Reinicié e intenté copiar un archivo (usando ES File Explorer) y pegarlo en su directorio principal, que falló:

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

De hecho, puedo reproducir bien el archivo, así que puedo abrirlo. FWIW, cuando intento copiar desde el punto de montaje original ( /mnt/fuse/sdcard1), aparece un error ligeramente diferente:

Failed to copy the file bar.mp3

Estoy usando un Samsung Galaxy S3 con Cyanogenmod 10.2.0-i9300.

==EDITAR==

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

Eso fue todo. No hay sdcard1_realen este directorio, así que supongo que el script está fallando.

==EDITAR2==

Intenté modificar el script para solucionar problemas. El script comienza bien, pero luego falla mkdir "$REALMNT"con el error /data/local/userinit.sh[6]: : not found.

==EDITAR3==

Sé que el script no funciona, por lo que arreglarlo podría resolver mi pregunta, pero pensé que lo siguiente era interesante. Formateé mi tarjeta SD en mi computadora con Linux y le transfirí algunos archivos. Curiosamente, los errores de permisos solo ocurren en los subdirectorios que creé. En la raíz de la partición (vía /storage/sdcard1), ya tengo permiso de escritura.

Como root, ejecute ls -l /mnt/fuse/y ls -l /mnt/fuse/sdcard1_real. Luego edite su pregunta para incluir los resultados. Mi conjetura es "permisos de archivo incorrectos", ya sea para el montaje o para el foo/directorio en la tarjeta. Recuerde, ext4 admite permisos completos de archivos *nix, incl. usuario y grupos.
Escribes suen la terminal para obtener root. Es posible que deba confirmar la concesión del permiso en el teléfono, si lo está haciendo por primera vez.
O el script está fallando o no se ejecuta en absoluto. Es posible que desee agregar alguna salida de depuración, por ejemplo echo Script executed > /mnt/fuse/sdcard1/test.log, y verificar si se está ejecutando. Si es así, haga la línea anterior a la última mount -t ext4 /dev/block/mmcblk1p1 "$REALMNT" 2> /mnt/fuse/sdcard1/test.logy verifique el mensaje de error. O ejecute el script manualmente para ver: su /data/local/userinit.sh.
@Izzy touchmuestra que el script se está ejecutando. Intenté ejecutar el script manualmente con su /data/local/userinit.sh, pero falló. También probé su echo fooy obtuve un error similar: Unknown id: echo.
En cuanto a su EDIT3, vea mi primer comentario: ext4 admite permisos completos de archivos * nix, incl. usuario y grupos . Ha creado esos directorios con un usuario que no existe en su dispositivo Android, por lo que pertenecen a "usuario desconocido/grupo desconocido". Si no otorgó acceso de escritura a "mundo", solo la raíz podría escribir allí. Debe familiarizarse con esos conceptos básicos * nix cuando use un sistema de archivos de este tipo en medios portátiles;) En cuanto al script, sugiero nuevamente agregar más información de depuración, por ejemplo, usar echopara generar cada comando antes de que se ejecute, y redirigir la salida de error con 2>>.
@Izzy Si entiendo correctamente, ¿el propósito del script es corregir estas inconsistencias de permisos? Hice más depuración, pero quizás EDIT2 no fue lo suficientemente claro. El script se ejecutó hasta exit 1, luego falló con el error indicado.
¿Podría ser que la secuencia de comandos se ejecuta demasiado pronto y /mnt/fuseno aparece cuando lo intenta mkdir(intente poner un ls /mntantes del mountcomando)? Si es así, mkdir -p "$REALMNT" || exit 1podría solucionarlo, pero no estoy seguro de los efectos secundarios cuando el sistema intente crear /mnt/fusemás tarde y ya exista.
@IrfanLatif Ya no tengo un teléfono con una tarjeta SD, pero a diferencia de su respuesta en el enlace, no recuerdo ningún problema con "cada aplicación creará archivos con su propio UID", según mi respuesta a continuación. Desafortunadamente, ya no puedo verificar esto. De todos modos, espero que su enlace sea útil para algunos aquí.

Respuestas (4)

Esto supuestamente se solucionó hace varios meses, pero la gente todavía informa problemas. Puedo leer elementos en la tarjeta, pero no tengo permiso de escritura. Para solucionarlo, combiné estrategias de algunas fuentes .

  1. Tarjeta de partición con tabla de partición MS-DOS y sistema de archivos ext4. Usé GParted en mi computadora de escritorio (Linux).
  2. Inserte la tarjeta en su teléfono. (Probablemente no tendrá acceso de escritura ahora).
  3. Abre el emulador de terminal , instalado por defecto en Cyanogenmod.
  4. Escriba lo siguiente (recomiendo WiFi Keyboard para grandes bloques de texto). Otorgue al emulador privilegios de root cuando los solicite.

Las indicaciones $e #indican, así que no las escriba.

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

Esto cambia los permisos de la tarjeta SD. El propietario y el grupo cambian de systema media_rw, y también otorga acceso de escritura al grupo.

necesita -R para recurrir si chown -R media_rw:media_rw /mnt/media_rw/sdcard1

No estoy seguro de si es de alguna ayuda, pero posiblemente el problema es que está tratando de montarlo en el lugar equivocado. Este es mi script de trabajo que funciona en un S3 mini con 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 

La ubicación REALMNT ya existía, por lo que, por supuesto, nunca se llamó a mkdir. Y media_rw/sdcard1 ya es propiedad de media_rw

También tuve que actualizar /etc/permissions/platform.xml para incluir: <group id="media_rw"/>en:<permission name="android.permission.WRITE_EXTERNAL_STORAGE">

Gracias. Me había dado por vencido en esto, ya que también tenía un alto uso de batería con mi script. Como está arreglado en el maletero, ya no me molestaré con una solución alternativa. Gracias de todos modos, y +1.
@Sparhawk: No estoy seguro de qué versión de CYM usa, pero mi tarjeta SD no se monta automáticamente.
@LuisA.Florit No estoy seguro de si querías responder a esta respuesta . De todos modos, estoy usando 11-20140804-SNAPSHOT-M9-i9300. He publicado más información en otra respuesta .
@Sparhawk: mi tarjeta ni siquiera está montada y el procedimiento de montaje en Configuración falla. Tal vez el problema esté relacionado con mi pregunta aquí ( suno se puede montar ): android.stackexchange.com/questions/82089/… `Uso cm-11-20140804-SNAPSHOT-M9-mondrianwifi.zip.
@LuisA.Florit No estoy muy seguro. ¿Quizás hacer una nueva pregunta?
@Sparhawk: Hice varias preguntas sobre CYM y no obtuve una sola respuesta. Sin siquiera usar CYM mucho, me he enfrentado a varios errores (como este), y nadie ha podido dar una pista sobre ninguno de ellos (ni en stackexchange, ni en el foro de CYM). Creo que instalaré otra ROM personalizada, una más sólida. Esto simplemente no funciona correctamente para mí.
Utilicé este script en Stock Android 4.4.4 (Galaxy Note 4), pero los archivos en /storage/sdcard1/ se muestran con propiedad 0.1015 en lugar de 1023.1023, dando muchos errores de 'permiso denegado' por supuesto. ¿Alguna idea de por qué?

Había una respuesta publicada por adasdadasd que quería aceptar, pero desde entonces ha sido eliminada. Lo reproduciré a continuación y aceptaré mi respuesta, pero si vuelve a aparecer adasdadasd, vuelva a publicarlo, lo eliminaré y aceptaré la suya.

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

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

¿Arreglado por defecto? Nuevo cambio en github.

Aquí la línea simple

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

Y aquí ext4 grabable en sd externa

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

Puede cambiar "extSdCard" como "sdcard1" donde se montó su tarjeta SD externa

Utilizo stockrom con Kingroot, pero intento con Supersu su problema con el montaje del sistema de archivos