Mi Raspberry Pi (IV): NAS y seedbox
mié 04 marzo 2015, por Soulchainer
Índice de contenido
Aún me faltan por documentar unos cuantos ajustes de mi entorno de consola, pero démonos un pequeño respiro y abordemos algo con un uso práctico más «inmediato»: vamos a apañar nuestra Raspberry Pi [1] para que haga las veces de NAS [2] y de seedbox [3] (a pequeña escala).
NFS
NFS es un protocolo de sistema de archivos en red: nos permite acceder a los archivos almacenados en un equipo remoto como si estuvieran almacenados localmente.
Lo usaremos para acceder y trabajar cómodamente con nuestro disco externo.
Instalación
Tanto el cliente como el servidor NFS requieren únicamente la instalación
del paquete nfs-utils
:
$ yaourt -S nfs-utils
Configuración del servidor NFS
Es decir, la parte de la configuración de la Raspberry.
Sistema de archivos
Conviene crear un directorio root específico (chroot) para el contenido que compartiremos con NFS: así, el acceso de los usuarios se limitará a este.
Para ello, definiremos en /etc/exports
los directorios que deseamos
compartir, con una ruta relativa al directorio chroot. En mi caso, el
directorio raíz de NFS será /srv/nfs
.
$ sudo mkdir -p /srv/nfs/media # creamos el directorio de montaje chroot
Ahora montamos el directorio real que compartiremos,
/mnt/Pandorica/Multimedia
, en el directorio recién creado para NFS:
$ sudo mount --bind /mnt/Pandorica/Multimedia /srv/nfs/media
Añadimos una línea a /ect/fstab
, para que se monte automáticamente al inicio:
$ sudo nano /etc/fstab
------------------------
...
/mnt/Pandorica/Multimedia /srv/nfs/media none bind 0 0
Permisos de acceso a mi /mnt/Pandorica/Multimedia
:
- lectura, escritura y ejecución, para el propietario y los miembros del grupo users;
- lectura y ejecución, para el resto de usuarios.
Del grupo users podrán ser miembros, por ejemplo, un cliente de BitTorrent, o mi usuario, una vez montado el directorio remoto en mi equipo. Y ambos necesitan escribir, para descargar, borrar o copiar archivos. Este directorio contendrá archivos multimedia y es el que Kodi revisará para mantener actualizada su colección.
Exports
Una vez establecidos los puntos de montaje, tenemos que indicar en
/etc/exports
los directorios compartidos y los clientes (con su IP o
nombre de máquina) autorizados.
$ sudo nano /etc/exports
-------------------------------------
/srv/nfs/ 192.168.1.0/24(rw,fsid=root,no_subtree_check)
/srv/nfs/media 192.168.1.0/24(rw,insecure,no_subtree_check,nohide)
Garantizamos a todos los equipos en nuestra red local (IP en
192.168.1.0/24
) el acceso a /srv/nfs/media
, pudiendo leer y
escribir (rw
), si tienen permiso previo, desde un puerto no reservado
(insecure
, 1024 en adelante). Dado que el disco compartido sufrirá
escrituras frecuentes, se activa también la opción no_subtree_check
.
Podemos ver todas las opciones disponibles para este fichero ejecutando:
$ man 5 exports
Iniciar el servidor
Hecho esto, ya podemos activar e iniciar el servidor NFS.
sudo systemctl enable rpcbind nfs-server
sudo systemctl start rpcbind nfs-server
Configuración del cliente
En cuanto al cliente se refiere, lo que a mí me interesa es que se monte el directorio sólo y no tener que preocuparme de montarlo, desmontarlo, subir o bajar el servicio cada vez que quiera hacer uso de él. Así que eso es lo que me voy a limitar a documentar ;).
Antes de nada, creamos el directorio donde queremos montar las carpetas compartidas por NFS:
$ mkdir /mnt/nfs/mediacenter
Después, activamos e iniciamos rpcbind.service
y
nfs-client.target
usando systemd.
$ sudo systemctl enable rpcbind nfs-client.target
$ sudo systemctl start rpcbind nfs-client.target
Y ya podemos montarlo con:
$ sudo mount nami.local:/media /mnt/nfs/mediacenter
Se pueden comprobar los dispositivos montados con df
:
S.ficheros Tamaño Usados Disp Uso% Montado en
/dev/sda3 60G 6,5G 53G 11% /
...
nami.local:/media 917G 67G 804G 8% /mnt/nfs/mediacenter
...
O, para más detalles, con mount
:
...
/dev/sdb5 on /home type ext4 (rw,noatime,data=ordered)
...
nami.local:/media on /mnt/nfs/mediacenter type nfs4 (rw,relatime,vers=4.0,rsize=65536,wsize=65536,namlen=255,hard,proto=tcp,port=0,timeo=600,retrans=2,sec=sys,clientaddr=192.168.1.5,local_lock=none,addr=192.168.1.11)
Comprobado que no hay ningún problema, añadimos a /etc/fstab
una línea
con la información necesaria para su automontaje.
Al parecer, la mejor manera de hacerlo es usando el servicio
automount
, de systemd. Este método remonta el dispositivo
rápidamente en caso de altibajos en la conexión.
$ sudo nano /etc/fstab
---------------------------------------
nombre_servidor:/home /punto/de/montaje/en/cliente nfs users,noauto,x-systemd.automount,x-systemd.device-timeout=10,timeo=14,noatime 0 0
Nota: la opción noauto
no monta la carpeta compartida hasta que se
intenta acceder a ella. Para que se monte de forma inmediata tenemos que usar
la opción auto
.
Si tenemos problemas con el montaje de las carpetas, por la indisponibilidad
puntual de la red, podemos activar el servicio
NetworkManager-wait-online
: se asegura de que la unit
network.target
tiene todos los enlaces disponibles antes de intentarlo.
$ sudo systemctl enable NetworkManager-wait-online
$ sudo systemctl start NetworkManager-wait-online
Apunte: error parejo a la instalación de NFS
Una vez instalado NFS, sufro un error muy molesto durante la secuencia de arranque:
$ sudo journalctl
-------------------------------------
ene 28 22:52:09 serenity kernel: EXT4-fs (sda3): mounted filesystem with ordered data mode. Opts: (null)
ene 28 22:52:09 serenity systemd[1]: Cannot add dependency job for unit display-manager.service, ignoring: Unit display-manager.service failed to load: No such file or directory.
ene 28 22:52:09 serenity systemd[1]: Dependency failed for pNFS block layout mapping daemon.
ene 28 22:52:09 serenity systemd[1]: Job nfs-blkmap.service/start failed with result 'dependency'.
ene 28 22:52:09 serenity kernel: FS-Cache: Loaded
ene 28 22:52:09 serenity kernel: EXT4-fs (sda3): re-mounted. Opts: (null)
Un mensaje amarillo que ataca a la vista, ralentiza el arranque y aparece resaltado en rojo en los registros.
Después de mucho buscar, doy con un reporte de error sobre este tema: resulta que esto «no es un error» de systemd y lo que pasa es que «falla porque no lo necesitas». ¡Toma castaña!
Pues bien, la «solución» que nos proponen es el enmascaramiento del servicio:
se reemplaza el servicio (/etc/systemd/system/nombreservicio.service
)
con un enlace simbólico a /dev/null
y así systemd no puede
invocarlo. Si sólo lo desactiváramos, aún podría reactivarlo si lo considerara oportuno.
Procedemos pues a enmascarar el servicio problemático,
nfs-blkmap.service
:
$ sudo systemctl mask nfs-blkmap.service
Si en algún momento necesitamos desenmascararlo, lo haremos con:
$ sudo systemctl unmask nfs-blkmap.service
Una vez hecho esto, reiniciamos y comprobamos que, efectivamente, ya no molesta más este «no error».
Uso habitual
Ya sabéis lo que es una carpeta compartida: podéis acceder a ella como si estuviera en vuestro equipo.
Puede usarse para el intercambio de archivos, pero para lo que más la uso yo es para reproducir archivos desde mi equipo. Y no noto diferencia alguna con respecto a la reproducción de archivos locales. Va muy bien :). Y eso que mi Raspberry está conectada por wifi, ¿eh?
Transmission
Vamos a ver ahora como instalar y configurar un cliente de BitTorrent en nuestra Raspberry, de forma que lo podamos controlar remotamente desde nuestro equipo (ordenador o Android) y que no sea necesario mantener el PC encendido sólo por las descargas.
He sopesado diversas alternativas disponibles, y me quedo con Transmission. Un motivo de mucho peso es que es el cliente que uso a diario y, quieras que no, eso tira.
Instalación en la Raspberry
Instalamos el daemon (‘servicio’) de Transmission en la Raspberry.
$ yaourt -S transmission-cli
Este paquete contiene el daemon de Transmission, así como herramientas de consola y un cliente web. Nosotros sólo vamos a usar el daemon.
Por defecto, Transmission crea el usuario transmission y ubica su archivo
de configuración en
/var/lib/transmission/.config/transmission-daemon/settings.json
.
La configuración se genera con la primera ejecución del programa:
$ sudo systemctl enable transmission # y, de paso, que arranque al inicio
$ sudo systemctl start transmission
$ sudo systemctl stop transmission
Como se puede apreciar arriba, justo tras iniciar el servicio, lo detengo: es porque prefiero editar manualmente la configuración (se podría editar a través de un cliente). La editamos con:
$ sudo nano /var/lib/transmission/.config/transmission-daemon/settings.json
En la wiki de Transmission se puede encontrar la explicación de todas las opciones de configuración. Yo cambio lo siguiente:
...
# lista de hosts a bloquear (por seguridad)
"blocklist-enabled": true,
"blocklist-url": "http://list.iblocklist.com/?list=bt_level1&fileformat=p2p&archiveformat=gz",
# desactivo dht
"dht-enabled": false,
# establezco el directorio donde se guardarán los archivos descargados
"download-dir": "/srv/nfs/media/torrents/terminados",
# establezco que sólo acepte conexiones cifradas
"encryption": 2,
# establezco el directorio donde se guardarán los archivos descargándose
"incomplete-dir": "/srv/nfs/media/torrents/descargando",
"incomplete-dir-enabled": true,
# cambio el puerto de conexiones entrantes (hay que configurar en el
# router un virtual server)
"peer-port": 51416,
# activar lista blanca (sólo se pueden conectar las IPs citadas)
# doy permiso únicamente para mi red local
"rpc-whitelist": "127.0.0.1,192.168.1.*",
# limitar velocidad de subida y bajada, en KB/s.
# puedes probar tu velocidad con, p. ej., http://www.testdevelocidad.es/
# es importante si vas a ofrecer algún servicio de red en la raspberry
"speed-limit-down": 1750,
"speed-limit-down-enabled": true,
"speed-limit-up": 175,
"speed-limit-up-enabled": true,
# máscara de permisos. json sólo acepta números en base 10, por lo que
# hemos de convertir de octal a decimal. Por defecto se establece a 18,
# que es 022 (755). Yo establezco 2, que corresponde a 002 (775)
"umask": 2,
...
Tras esto, sólo nos queda crear los directorios de descarga de torrents y darles los permisos adecuados:
$ sudo mkdir -p /srv/nfs/media/torrents/descargando /srv/nfs/media/torrents/terminados
$ sudo chown -R miusuario.transmission /srv/nfs/media/torrents
$ sudo chmod -R 775 /srv/nfs/media/torrents
Volvemos a lanzar el daemon de Transmission:
$ sudo systemctl start transmission
Y ya hemos terminado la configuración en la Raspberry.
Instalación en el equipo
El cliente GTK de Transmission no puede conectarse al daemon, por lo que instalo el cliente Qt:
$ yaourt -S transmission-qt
Lanzamos el programa y conectamos con el daemon corriendo en la Raspberry.
nami.local
) si
configuramos anteriormente Avahi, para conectarnos.Si revisamos las preferencias de transmission-qt
, comprobamos que,
en efecto, son las que establecimos en el servicio.
Podemos cambiarlas desde aquí siempre que queramos. Además, es recomendable
pasarnos por la pestaña de privacidad y actualizar la lista negra de IP.
Si se marca Enable automatic updates, las próximas actualizaciones se aplicarán automáticamente.
Hemos de realizar también unos ajustes en el apartado de configuración de red.
Ya podemos iniciar torrents en nuestra Raspberry a través de
transmission-qt
y cerrar el programa sin miedo después, ya que la
descarga se realiza desde la Raspberry.
Para poder manejar cómodamente los archivos descargados, agrego a mi usuario
local al grupo transmission
:
$ sudo gpasswd -a mi_usuario transmission
Ajuste del cortafuegos
Si aún queremos usar transmission-qt para descargar cosillas en el equipo, es importante no fijar el mismo puerto de conexiones entrantes que en la Raspberry (5146 en este caso), ya que las conexiones a este puerto se dirigirán a la Raspberry. Tenemos que definir otro puerto para el equipo y permitirle el paso en nuestro cortafuegos, de tener uno configurado (recomendable).
Como podemos ver, hemos establecido el puerto 5143 como el puerto de conexiones bittorrent entrantes para nuestro equipo. Ya hablé antes sobre sobre cómo configurar el cortafuegos.
Abrir puertos en el router
Definimos un par de reglas Virtual Server en nuestro router, una para el daemon en la Raspberry y otra para la sesión local de Transmission en nuestro equipo. Esto es necesario para que el router sepa a qué máquina debe dirigir las peticiones realizadas a cada puerto.
NOTA: este procedimiento puede ser distinto en tu router. Si no lo tienes claro, consulta la documentación.
Instalación en Android
Añadir torrents, revisar su estado, pausarlos… suelo hacer todas estas tareas desde mi android.
Para ello, uso la aplicación Transdroid. Yo tengo una versión de Android muy desfasada (2.3.5), pero la última versión compatible con ella (Transdroid 2.14) funciona estupendamente. Aparte de esto, la mayor ventaja de Transdroid sobre otras alternativas es su complemento para búsquedas, Transdroid Torrent Search, que se actualiza periódicamente con más sitios de torrents.
Para la instalación de ambos, basta acceder a los enlaces anteriores desde
nuestro Android y descargar el archivo .apk
correspondiente.
Configuración
Su configuración es lo más sencillo que puedas echarte a la cara.
Una vez configurada, pulsamos el botón Atrás de Android hasta volver a la pantalla principal de la aplicación. Debería avisar entonces de que intenta conectarse al servidor y, pasados unos instantes, listar los torrents en el servidor o bien mostrar un mensaje informando de que no hay ningún torrent activo (similar al que se muestra en el GIF anterior, ya que tomé las capturas con una conexión ya establecida).
Volviendo a las Preferencias, conviene Establecer sitio predeterminado en el apartado Sitios de búsqueda (sólo disponible si se instaló el complemento Transdroid Torrent Search).
En cada búsqueda se consultará primero el sitio predeterminado, pero después, desde la pantalla de resultados, se podrá escoger repetirla en otro sitio.
Esto es un seedbox
Y ya tenéis un pequeño seedbox instalado.
¿Que ya he dicho esto antes? Ya lo sé.
¿Que por qué lo repito entonces? Pues para dejar claro que el objetivo del protocolo BitTorrent es compartir archivos, no sólo descargar archivos. La Raspberry consume poquísimo y está enchufada todo el día: no pasa nada si dejáis los torrents compartiendo varios días ;).
La red no se mantiene sola: son las personas quienes la alimentan.
Fuentes: Wiki de Arch Linux y Transdroid.org.
Anotaciones:
[1] | Raspberry Pi es una marca registrada de la Raspberry Pi Foundation. El presente blog no tiene conexión alguna con la Raspberry Pi Foundation. |
[2] | Un NAS es un dispositivo dedicado a compartir su capacidad de almacenamiento a través de la red. |
[3] | Un seedbox es un servidor privado dedicado a la subida y descarga de archivos, normalmente de redes P2P (como BitTorrent). |