1 votos

Hacer que el recurso compartido cifs/smb montado sea visible para el usuario normal en Android-x86

Como ya no se puede confiar en ES Explorer, necesitaba otra solución para acceder fácilmente a mis recursos compartidos de red SMB/CIFS. Montar un recurso compartido de red SMB/CIFS en Android-x86 (versión 9 R2) resultó ser mucho más fácil que cualquiera de las soluciones que encontré en StackExchange. No necesité instalar ningún software o aplicación, mount -t cifs funciona nada más sacarlo de la caja.

El problema es que no puedo hacer visible este montaje para el usuario normal. Sólo Root o superusuario, como se llame en Android, ve y puede utilizar el sistema de archivos montado, mientras que el usuario normal sigue viendo el punto de montaje como un directorio del propio sistema de archivos de Android.

Para aclararlo, echa un vistazo a esta sesión de terminal. En este ejemplo, Android se ejecuta en una VM de Virtual Box, la dirección IP es la del propio host. Hago un subdirectorio en /sdcard/Download/ para montarlo, con la intención de mover fácilmente los archivos de Download al recurso compartido montado en ese subdirectorio. Monto el recurso compartido como superusuario, con las opciones apropiadas, y luego, tanto como normal y como superusuario, lista el contenido del subdirectorio y estatus el subdirectorio :

$ cd "/$EXTERNAL_STORAGE"/Download/ # i.e. /sdcard/Download/
$ mkdir SERVER_SHARE
$ touch SERVER_SHARE/"NOT THE MOUNTED SHARE" # a marker for the base directory
$ su -c "mount -v -o username=guest,rw,noperm,iocharset=utf8 -t cifs //192.168.1.10/SHARE $PWD/SERVER_SHARE"
$ ls SERVER_SHARE/
'NOT THE MOUNTED SHARE'
$ su -c "ls SERVER_SHARE"
... lists all the files on the share ...
$ stat SERVER_SHARE
  Size: 4096        Blocks: 0          IO Block: 512   directory
Device: 1dh/29d Inode: 409629          Links: 2
Access: (0770/drwxrwx---)  Uid: ( 0/    root)   Gid: ( 9997/everybody)
...
$ su -c "stat SERVER_SHARE"
  Size: 0           Blocks: 0          IO Block: 512   directory
Device: 1eh/30d Inode: 217          Links: 2
Access: (0755/drwxr-xr-x)  Uid: ( 0/    root)   Gid: ( 0/    root)
...

Se ve la diferencia entre el usuario normal y el superusuario: ls muestra un contenido de directorio diferente porque stat dice que ven el subdirectorio en un dispositivo diferente. Una posible explicación podría ser que el usuario normal tiene el descriptor de archivo para el directorio abierto, y sigue utilizando ese descriptor de archivo y el contenido al que apunta, incluso después de que algún otro sistema de archivos se monte sobre él. Pero eso probablemente no explicaría por qué ocurre exactamente lo mismo si pongo el mkdir dentro del comando su para el mount .

Por el momento, sólo puedo acceder al recurso compartido samba montado del host de la VM desde el terminal, como superusuario, para copiar archivos entre el recurso compartido y la carpeta Download. He puesto el mkdir y mount en un script, y añadimos los comandos touch para montar el directorio bajo el punto de montaje como "no el recurso compartido de red".

Mi pregunta es la siguiente Cómo puedo hacer que el recurso compartido montado sea visible para el usuario normal, de modo que pueda utilizar las aplicaciones de Android como "Archivos" y otros gestores de archivos para acceder a él en una interfaz gráfica de usuario.

0 votos

0 votos

Gracias por el enlace. Tengo que estudiar un poco para entenderlo, pero para eso estamos.

0 votos

Con respecto al montaje invisible supongo que es causado por los espacios de nombres de montaje aislados (se puede desactivar dependiendo de la solución Root)

2voto

db-inf Puntos 131

Resumen de la gestión

  • Probablemente no lo necesites.
  • Existen aplicaciones gratuitas para acceder a los recursos compartidos de la red.
  • El montaje de recursos compartidos de red ni siquiera necesita estas aplicaciones; todo lo que necesita está incluido en Android-x86.

Cómo acceder a sus recursos compartidos de red como usuario de Android-x86

  • Hay muchas aplicaciones de gestión de archivos que te permiten copiar archivos entre los directorios de tu Android y tus recursos compartidos de red. Una de las que me parece especialmente adecuada para esto es una aplicación gratuita llamada X-Plore File Manager, porque en ella puedes configurar accesos directos a tus recursos compartidos de red, y tiene una vista de doble panel, para que puedas abrir los directorios de origen y destino cada uno en su propio panel.

  • Sin embargo, para acceder directamente a los recursos compartidos de red desde las aplicaciones, sin la intermediación de un gestor de archivos, es útil montar esos recursos compartidos de red en las carpetas visibles para el usuario de Android como Descargas, Películas, Música o Imágenes.

  • Aunque no es realmente linux, una de las cosas linuxeras que Android-x86 utiliza para complicar la vida al usuario desprevenido, por su propio bien, es Linux mejorado en seguridad o SELinux. Es sencillo montar un recurso compartido de red, no hay nada que instalar. Pero necesitas el contexto de seguridad apropiado para montar un recurso compartido de red para que sea visible para ti como usuario.

  • Para que las cosas sean reproducibles, se puede programar el procedimiento de montaje. Android-x86 viene con un shell MirBSD Korn despojado. Puedes leer su página de manual en línea.

  • Puedes usar mi script como ejemplo; lo he aclarado con comentarios. En este script, rellena tu propio nombre de servidor y la dirección ip del servidor, y quizás el nombre del recurso compartido que más utilices; el mío se llama RAMDISK, que es... un ramdisk.

  • Como mi dispositivo Androix-x86 no es accesible para otros, codifiqué mi nombre de usuario y contraseña. Espero que no puedas recuperar mi respuesta original después de haberla modificado para ocultar mi nombre de usuario y mi contraseña. Probablemente prefieras no codificar tus credenciales en un script; puedes utilizar el comando de lectura incorporado en el shell para introducirlas en el símbolo del sistema.

    !/bin/sh

    main() {

    default to my preferred share

    typeset share="${1:-RAMDISK}"

    MY SERVER

    typeset servername=MYSRV typeset serverip=192.168.1.10

    SELinux context for the virtual filesystem sdcardfs:

    typeset context="context=u:object_r:sdcardfs:s0,iocharset=utf8"

    mount (from root mount namespace) to /mnt/runtime/write/emulated which is

    # propagated to all apps' mount namespaces.

    typeset mntpt=/mnt/runtime/write/emulated/0/Download/"$servername"_"$share"

    make mountpoint and add file as warning: if you see that file,

    # you do not see the network share

    [ -d "$mntpt" ] || su -c "mkdir -p \"$mntpt\" ; \ touch \"$mntpt\"/\" @=# NOT A MOUNTED NETWORK SHARE #=@. \""

    first try to mount with my credentials, used as file ownership on server, else as guest

    # su not needed when already running as su, but does no harm either

    su -c "mount -v -o username=myuser,password=mypassword,rw,noperm,$context \ -t cifs //$serverip/\"$share\" \"$mntpt\" || \ mount -v -o username=guest,ro,noperm,$context \ -t cifs //$serverip/\"$share\" \"$mntpt\" || \ echo mount of \"<$share>\" failed" unset -f main } main "$@"

  • He guardado este script en mi dispositivo Android-x86 como /sdcard/mounty . SELinux hace que sea difícil hacerlo ejecutable, pero no es necesario: puedes dejar que los comandos incorporados del shell source o . ejecutarlo. Desde una aplicación de terminal, o después de pulsar Alt-F1 para ir al tty1 terminal (Alt-F7 te devuelve a la GUI), sólo tienes que introducir

    . /sdcard/mounty MYSHARENAME

  • En lugar de un punto de montaje en .../Download/ podría montar sus películas compartidas en /mnt/runtime/write/emulated/0/Movies/ y la red de intercambio con su álbum familiar en /mnt/runtime/write/emulated/0/Pictures/ Por supuesto.

Detalles técnicos

  • Puedes leer la razón por la que necesitas un contexto SELinux en esta respuesta a "¿Cómo enlazar el montaje de una carpeta dentro de /sdcard con los permisos correctos?" . Sólo entiendo la mitad, pero lo esencial es que en Android no sólo los usuarios, sino también las aplicaciones necesitan derechos de acceso.

  • Para ello, se utiliza un sistema de archivos especial llamado sdcardfs se utiliza. Expone las carpetas que un usuario ve bajo /sdcard El sistema de gestión de la información de las aplicaciones en 3 puntos de montaje diferentes, dependiendo de los derechos de acceso de una aplicación, y en 1 punto de montaje adicional para el acceso del usuario. Este es un extracto de lo que el mount informes de comandos :

    /data/media on /mnt/runtime/default/emulated type sdcardfs (rw,...,gid=1015,multiuser,mask=6) /data/media on /mnt/runtime/read/emulated type sdcardfs (rw,...,gid=9997,multiuser,mask=23) /data/media on /mnt/runtime/write/emulated type sdcardfs (rw,...,gid=9997,multiuser,mask=7) /data/media on /storage/emulated type sdcardfs (rw,...,gid=1015,multiuser,mask=6)

  • El /read/ y /write/ Los puntos de montaje hablan por sí mismos.

  • Supongo que el /default/ mountpoint es para navegar a través de los directorios solamente, para aplicaciones sin acceso de lectura o escritura.

  • Explorar el árbol de directorios con el comando ls -l , se encuentra el directorio /storage/emulated/ que contiene un subdirectorio para cada usuario. En las instalaciones de un solo usuario, éste será el usuario 0 donde se encuentran los directorios de los usuarios Download , Movies etc. Cuando el usuario 0 se conecta, su /storage/emulated/0/ se refleja en /storage/self/primary/ .

  • Directorio /sdcard/ finalmente es, de hecho, un enlace simbólico a ese /storage/self/primary/ y voilà, por eso el usuario ve sus directorios de usuario bajo /sdcard/ que es todo lo que un usuario no root puede ver de su sistema de archivos.

  • Montar el recurso compartido de red, con el contexto SELinux adecuado, en un directorio bajo /mnt/runtime/write/emulated/0/ (nota el write ), como en mi script, hace que la acción sea visible en algún lugar bajo los mismos 4 directorios:

    //192.168.1.10/RAMDISK on /mnt/runtime/default/emulated/0/Download/FRT_RAMDISK type cifs (rw,... //192.168.1.10/RAMDISK on /mnt/runtime/read/emulated/0/Download/FRT_RAMDISK type cifs (rw,... //192.168.1.10/RAMDISK on /mnt/runtime/write/emulated/0/Download/FRT_RAMDISK type cifs (rw,... //192.168.1.10/RAMDISK on /storage/emulated/0/Download/FRT_RAMDISK type cifs (rw,...

PreguntAndroid.com

PreguntAndroid es una comunidad de usuarios de Android en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X