Servidor NAS con SAMBA
======================

.. image:: _images/sambalogo.png
   :align: right
   :width: 250px

.. contents:: Tabla de contenidos

Introducción
------------

Antes de tener la Raspberry Pi probablemente tuvieras un ordenador donde almacenabas todo tu contenido multimedia. Ahora lo ideal sería transferir todo ese material al disco duro USB conectado a la RPi. Ya que tenemos SSH podríamos utilizar el protocolo SFTP para transferir los ficheros, pero también podemos tener una carpeta compartida en la red mediante **samba** y así transformar nuestra RasPi en un servidor NAS.

Instalar Samba
--------------

Lo primero es instalar los dos paquetes necesarios para lo que queremos:

.. code:: shell

    $ sudo apt-get install samba samba-common-bin

El primero es el samba en sí mismo y el segundo nos sirve para poder asignar una contraseña a nuestro usuario de samba. Hasta aquí fácil. Ahora viene lo más crítico, que es configurarlo apropiadamente. El 90% de los fallos vienen de aquí.

Configurar samba
----------------

Vamos a tocar lo básico, el fichero de configuración está muy bien comentado y explicado, por si te apetece toquetear y adaptarlo a tus necesidades, pero para el común de los mortales habrá que cambiar muy pocas cosas.

.. code:: shell

    $ sudo nano /etc/samba/smb.conf

Toda línea que empiece por # (almohadilla) es un comentario y no tiene efecto en la configuración del samba. Nosotros nos tenemos que fijar en 2 parámetros fundamentalmente:

.. code-block:: shell
    
    workgroup = WORKGROUP <- Es mi red local
    wins support = yes

El primero es **workgroup** y da nombre al grupo de trabajo de tu red, por defecto viene el que le pone Windows de serie a sus redes. Normalmente no es necesario cambiarlo. El segundo, **wins support**, aparecerá comentado, con una almohadilla delante. Es muy importante que descomentes esa línea (quita la #). Da igual si vas a utilizarlo o no, eso ya lo decides tú poniendo yes o no, pero la configuración del samba debe leer ese parámetro para que todo funcione correctamente.

Compartir carpetas
------------------

Una vez puestos correctamente esos 2 parámetros del principio del fichero nos iremos al final del todo y en líneas nuevas escribiremos esto:

.. code-block:: shell

    [DiscoUSB]
    comment=Disco USB en la RPi
    path=/media/discousb
    browseable=yes
    writeable=yes
    create mask=0775
    directory mask=0775
    only guest=no

- Donde la primera línea define el nombre que tendrá nuestra carpeta compartida en la red, en mi caso ``DiscoUSB``.

- ``comment`` puede ser cualquier cosa que quieras que defina a la carpeta.

- ``path`` es la ruta de la carpeta que quieres compartir, como yo comparto todo el disco duro USB especifico dónde está montado.

- ``browseable`` para que se pueda navegar por los subdirectorios.

- ``writeable`` para poder leer y escribir.

- ``create mask`` y ``directory mask`` definen los permisos que se aplican a los ficheros y directorios nuevos.

- ``only guest`` permite acceder como usuario anónimo o no.

No creo que sea difícil de entender. Si quieres compartir más carpetas, debajo de estas líneas pondrías otras similares para cada carpeta, por ejemplo:

.. code-block:: shell

    [MusicaRPi]
    comment=Musica en la RPi
    path=/media/discousb/musica
    browseable=yes
    writeable=yes
    create mask=0775
    directory mask=0775
    only guest=no

    [Torrents]
    comment=Torrents para Transmission
    path=/media/discousb/torrents
    browseable=yes
    writeable=yes
    create mask=0775
    directory mask=0775
    only guest=no
    Mi ejemplo que funciona 100%:

    [TOSHIBA2TB]
    comment = HDD Externo
    path = /media/2TB
    writeable = YES
    create mask = 0777
    directory mask = 0777
    browseable = Yes
    force user = pi
    valid users @users

Y así con todas y cada una de las carpetas que desees compartir en tu red. Yo prefiero compartir directamente el directorio donde está montado el disco duro USB y así tengo acceso a todo, pero cada uno que se lo monte como le convenga. Ahora guardamos y cerramos el fichero de configuración: Ctrl+O, Intro, Ctrl+X.

Establecer contraseña
---------------------

Por último, vamos a darle una contraseña a nuestro usuario pi, la lógica diría que es la misma que para acceder al sistema, pero no, samba tiene su propia gestión de contraseñas así que hay asignarle una a cada usuario, puedes utilizar la misma para no liarte u otra diferente por seguridad:

.. code:: shell

    $ sudo smbpasswd -a pi

Nos pide que pongamos una contraseña dos veces y fin. Esa será la contraseña que debemos poner cuando queramos acceder a alguna de las carpetas compartidas que definimos antes en el fichero de configuración.

Para terminar vamos a reiniciar el servicio para que todos los cambios surtan efecto:

.. code-block:: shell

    $ sudo /etc/init.d/samba restart

.. warning::

    EVITAR COMPARTIR LA CARPETA DE USUARIO

Normalmente, cuando instalamos el servidor Samba se comparte por defecto la carpeta del usuario, es decir, ``/home/pi`` en nuestro caso. Si queremos evitar esto, podemos añadir al fichero de configuración de Samba los datos necesarios para que no comparta esa carpeta. Lo haremos así, haciendo referencia al directorio o carpeta del usuario:

.. code-block:: shell

    [pi] 
    comment = directorio del usuario 
    path = /home/pi 
    browseable = no 
    writeable = no 
    read only = yes 
    guest ok = no 
    public = no

La clave está en la línea ``browseable = no``, que es la que realmente impide que se muestre la carpeta.

Ahora volvemos a reiniciar el servidor para que Samba se ponga en funcionamiento:

.. code:: shell

    sudo /etc/init.d/samba restart

Con este último paso, ya podemos compartir ficheros entre la Raspberry Pi y cualquier otro dispositivo que tengamos en casa sin necesidad de utilizar un software de FTP, ya sea un PC con Windows o con Linux, un Mac o un dispositivo móvil. En Android yo utilizo ES File Explorer para acceder a mis carpetas compartidas por LAN.