Compartir Google Drive con Samba

Muchos son los servicios en la nube que permiten la compartición de archivos. En Google Drive, es relativamente sencillo hacerlo. Basta con crear un directorio y con el botón derecho elegimos compartirlo con los usuarios que queramos (o público), y definimos sus permisos (lectura, edición, etc).
¿Y si queremos compartir la misma carpeta en nuestra red local? 
Bueno, también es sencillo. Si tenemos instalado el cliente de Google Drive para Windows, hacemos clic derecho sobre la carpeta en cuestión (compartida previamente en la nube de GDrive) y la compartimos con todos los usuarios de la red local, y así los cambios se sincronizan en la nube, teniendo a nuestra disposición lo mejor de ambos mundos.
¿Y en Linux?
Mmm... Como los que usamos Linux somos una parranda de desadaptados sociales, el Gran "G" se olvidó de nosotros (como muchas otras empresas de software) y a la fecha seguimos sin cliente oficial. Pero afortunadamente hay varias soluciones; una de ellas FUSE filesystem over Google Drive.
Para el siguiente ejemplo utilizaremos Ubuntu 18.04.x y Samba 4.7.6-Ubuntu, y crearemos una carpeta llamada "cloud" en Gdrive, que será la que compartiremos con los usuarios de internet y de nuestra red local. Reemplace username por el nombre de su cuenta de usuario (ejecute en el terminal: echo $USER).
Instalado Google Drive en Ubuntu
Abrimos el terminal y creamos la carpeta para Google Drive en Ubuntu y le damos permisos:
mkdir -p ~/gdrive
sudo chmod -R 777 ~/gdrive
Y el path al directorio "gdrive" (Google Drive) quedará, por ejemplo, en /home aunque podemos elegir cualquier punto de montaje:
/home/username/gdrive
Ahora instalamos Google Drive con FUSE filesystem over Google Drive (basado en el método de automontaje). Instalamos google-drive-ocamlfuse y lo ejecutamos:
sudo add-apt-repository ppa:alessandro-strada/ppa --yes
sudo apt -y install google-drive-ocamlfuse && google-drive-ocamlfuse
Y se abrirá nuestro navegador predeterminado y google-drive-ocamlfuse solicitará acceso a nuestra cuenta de Google Drive:
Autenticación Google Drive gdfuse
Ahora debemos realizar el montaje de la carpeta "gdrive" (Google Drive), la cual se puede hacer de varias maneras:
a. Con script gdfuse y fstab
Creamos un script llamado gdfuse con el siguiente contenido:
#!/bin/bash
su username -l -c "google-drive-ocamlfuse -label $1 $*"
exit 0
Nota: Si ejecuta el comando directamente en el terminal especifique en "label" el nombre de su carpeta de Google Drive
Y lo guardamos en /usr/bin y le damos permisos de ejecución:
sudo chmod +x /usr/bin/gdfuse
Ahora editamos /etc/fstab y agregamos la siguiente línea:
gdfuse#default /home/username/gdrive fuse uid=1000,gid=1000,allow_other,user,auto,_netdev 0  0
Nota: Puede reemplazar "auto" por "noauto" si no desea el automontaje en el inicio de su sistema. La opción "user" en la línea de fstab incluye "noexec, nosuid, nodev", entonces si quiere ejecutar scripts en la carpeta, agregue la opción "exec". Adicionalmente aclaramos que systemd detecta automáticamente los tipos fs que necesitan acceso a la red, por tanto, salvo algunas excepciones, puede prescindir del parámetro "_netdev".
Lo siguiente es editar /etc/fuse.conf y descomentar la línea "user_allow_other" para permitir que los usuarios "no root" especifiquen las opciones de montaje (consulte Mount Fuse para las opciones):
# Allow non-root users to specify the allow_other or allow_root mount options.
user_allow_other
Nota: Aclaramos que eventualmente esto puede representar un riesgo de seguridad
b. Agregar programa al inicio de sistema
También puede agregar el montaje al inicio de su sistema:
Nombre: google-drive-ocamlfuse
Comando: sh -c "google-drive-ocamlfuse ~/gdrive"
c. Montaje/Desmontaje manual
Para montar/desmontar la carpeta "gdrive" manualmente, ejecute:
sudo mount ~/gdrive
sudo umount ~/gdrive
Sin embargo puede generar el siguiente error durante el montaje:
fuse: mountpoint is not empty
fuse: if you are sure this is safe, use the 'nonempty' mount option
Para solucionarlo, ejecute el comando con la opción "-o nonempty":
sudo mount ~/gdrive -o nonempty
Por lo anterior, lo más recomendable para montar/desmontar la carpeta "gdrive" es utilizar:
# mount
google-drive-ocamlfuse ~/gdrive
# umount
fusermount -u ~/gdrive
Errores frecuentes de fusermount
Al ejecutar comando fusermount pueden aparecer los siguientes errores:
fusermount -u ~/gdrive
fusermount: entry for /home/username/gdrive not found in /etc/mtab
Este error se produce al intentar desmontar la carpeta de Google Drive sin estar previamente montada. Otro error frecuente es:
fusermount -u ~/gdrive
fusermount: failed to unmount /home/user/gdrive: Device or resource busy
Se produce cuando estamos accediendo a la carpeta de Google Drive al momento de desmontarla.
Para más opciones, ejecute:
google-drive-ocamlfuse --help
d. Montaje/Desmontaje con bash script
Consideramos que la mejor alternativa para realizar el montaje/desmontaje de la carpeta Google Drive es con un bash script, el cual llamaremos gdmu (Google Drive Mount and Umount), y con el contenido que se describe a continuación. Guárdelo en el path de su preferencia, dele permisos chmod (chmod +x gdmu), y ejecútelo en el terminal con su usuario:
#!/bin/sh
### BEGIN INIT INFO
# Provides:          gdrive
# Required-Start:    $local_fs $remote_fs $network
# Required-Stop:     $local_fs $remote_fs $network
# Should-Start:      $named
# Should-Stop:       $named
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Description:       Enable service provided by daemon
### END INIT INFO

# username
MYUSER="user"
# path to GoogleDrive
GD="/home/$MYUSER/gdrive"

case "$1" in
  start)
    echo 'Mount Google Drive...'
    # Optional (If the folder does not exist)
    # if [ ! -d $GD ]; then mkdir -p $GD && chmod 777 $GD; fi
    google-drive-ocamlfuse $GD
    echo "OK"
 exit
 ;;
  stop)
    echo 'Umount Google Drive...'
    fusermount -u $GD
    echo "OK"
 exit
 ;;
  *)
    echo "Usage: ./gdmu {start|stop}"
 exit 1
    ;;
esac
exit 0
El script inicia o detiene el montaje de Google Drive, en dependencia de la manera en que lo haya ejecutado ( ./gdmu start o ./gdmu stop). La variable MYUSER es su usuario de sistema y GD es el path hacia su carpeta de Google Drive.
También podemos programarlo en el cron para un inicio automático con el sistema o para el inicio y apagado en horas específicas y así evitar la sincronización permanente. Para mayor información sobre este problema, visite el post Programando sincronización en la nube.
Y una vez montada, verificamos los permisos:
ls -l /home/username/gdrive
drwxrwxr-x 2 username username 4096 nov  3 17:23 cloud
Compartiendo Google Drive en Samba
Asumiendo que tenemos instalado y configurado Samba con todos los "juguetes":
sudo apt -y install samba samba-common smbclient system-config-samba winbind nfs-common cifs-utils exfat-fuse exfat-utils ntfs-config ntfs-3g python-glade2
if [ ! -d /var/lib/samba/usershares ]; then sudo mkdir -p /var/lib/samba/usershares; fi
sudo chmod 1775 /var/lib/samba/usershares/
sudo chmod +t /var/lib/samba/usershares/
Lo siguiente es editar el archivo de configuración de samba (/etc/samba/smb.conf) y agregar los parámetros de configuración de nuestra carpeta compartida "cloud" que está dentro de gdrive:
[cloud
 comment = Public Cloud
 path = /home/username/gdrive/cloud
 public = yes
 read only = no
 writeable = yes
 browseable = yes
 valid users = nobody
 guest ok = yes
 available = yes
 printable = no
 create mask = 0777
 directory mask = 0777
Nota: Algunos parámetros pueden ser cambiados en dependencia de sus necesidades en la compartición. Puede que requiera contraseña de acceso o no, etc. Para mayor información visite el post Compartición de archivos.
Problemas Frecuentes de Samba
Hay escenarios donde se presentan problemas con los permisos de las carpetas compartidas y otros relacionados. Para evitarlos puede modificar los siguientes parámetros:
map to guest = bad password
security = user
guest account = nobody
usershare allow guests = yes
usershare path =
También puede "liberar" la propiedad de la carpeta:
sudo chown -R nobody.nogroup ~/gdrive/cloud
Y se recomienda revisar la configuración de su firewall para cerciorarse que estén abiertos los puertos necesarios (reemplace enp2s0 por el nombre de la interfaz LAN):
# Abriendo puertos NetBIOS y Samba
/sbin/iptables -A INPUT -i enp2s0 -p tcp -m multiport --dports 137:139,445 -j ACCEPT
/sbin/iptables -A INPUT -i enp2s0 -p udp -m multiport --dports 137:139,445 -j ACCEPT
Al finalizar los cambios, reinicie.
Importante
  1. Lo negativo de google-drive-ocamlfuse es su extremada lentitud, al punto que no se recomienda el montaje de la carpeta en el inicio del sistema, porque podría generar errores a la hora de acceder a los archivos.
  2. Para modificar los parámetros (sincronización, etc) vea el apartado Configuración y para otros métodos de instalación consulte AQUI.
  3. Google Drive tiene reglas específicas (diferentes a las reglas de las carpetas compartidas públicas con Samba) referente a la creación y eliminación de archivos, así como de sus propietarios, por tanto eliminar o crear archivos en la carpeta "cloud" desde la red local, tendrá un comportamiento diferente a si lo hacemos desde la Web de Google Drive. Por ejemplo, en la Web de GDrive se elimina el archivo y va a la papelera (Samba también permite crear una papelera de reciclaje y vetar ciertos archivos), y si eres el propietario, las personas con las que lo hayas compartido podrán hacer una copia y si no eres el propietario, al quitarlo de Drive, solo se eliminará de tu unidad. Para mayor información sobre este comportamiento en Google Drive pulse AQUI
Y mientras tanto, seguimos en la eterna espera de un cliente oficial de Google Drive para Linux.

Con la tecnología de Blogger.