lunes, 11 de abril de 2016

Instalar Subsonic en Raspberry Pi 2 (1 de 2: Instalación básica)

Subsonic es una alternativa libre a servicios como Spotify o Google Music, que permite escuchar música en streaming una vez configuremos un servidor donde tengamos almacenada nuestra música. Una vez instalado y funcionando, podremos acceder a nuestra música mediante una interfaz web o mediante un reproductor compatible que haga uso de su API. Podemos probar una demo para ver su funcionamiento en la página oficial.

Una advertencia antes de comenzar el tutorial: para habilitar todas las características de Subsonic, incluyendo su uso con reproductores externos, es necesario adquirir una licencia (Subsonic Premium). En mi caso compré una licencia vitalicia hace años, cuando no había planes mensuales. Ahora el precio de la licencia vitalicia ha subido bastante, aunque es comprensible dado que el proyecto lo mantiene una sola persona, y lleva años en activo y añadiendo características. Como es software libre, hay gente que ha hecho forks del proyecto sin el código de verificación de licencia, pero prefiero no enlazarlos por aquí.

Dicho esto, vamos a ver cómo instalar Subsonic desde cero en una Raspberry Pi 2*. Para ello voy a suponer que ya tenemos una tarjeta de memoria con espacio suficiente y con Raspbian o Raspbian Lite instalado. Yo recomendaría usar al menos una tarjeta de 8GB de buena velocidad (Clase 10) e instalar Raspbian Lite, que se puede descargar desde la página oficial. Para instalar Raspbian se puede consultar esta entrada.

1. Configuración inicial

Una vez tengamos Raspbian instalado, lo primero que haremos es cambiar la contraseña por defecto, para evitar problemas si en un futuro decidimos habilitar el acceso remoto a nuestra Raspberry. Para ello escribimos:

$: passwd

A continuación es recomendable habilitar SSH, para poder administrar nuestra Raspberry remotamente; y expandir la partición de sistema para que aproveche todo el espacio libre de nuestra tarjeta. Ejecutamos la herramienta raspi-config:

$: sudo raspi-config

Expandiendo la partición con raspi-config

Para expandir la partición seleccionamos la primera opción. Para habilitar SSH, seleccionamos advanced options y elegimos la opción SSH en el siguiente menú.

Habilitando SSH

Si vamos a usar nuestra raspberry como servidor headless (sin interfaz gráfica), podemos ganar algo de RAM seleccionando la opción Memory Split, justo encima de SSH, y cambiando la RAM dedicada a la GPU a 16MB, como se muestra a continuación.

Configuración de RAM para servidor headless

Una vez terminada esta configuración, seleccionamos Finish y reiniciamos nuestra Raspberry con:

$: sudo reboot

2. (Opcional) Configurar IP estática y redireccionar puertos del router.

Es conveniente establecer una IP estática para nuestra Raspberry para poder conectarnos a ella con mayor facilidad y para poder redireccionar las peticiones del router cuando nos conectemos desde fuera de nuestra red local. Para ello se puede consultar esta entrada.

En cuanto a la redirección de puertos del router, nos interesará redireccionar como mínimo el puerto que use Subsonic para su interfaz web, que en su configuración por defecto es el 4040. Las instrucciones para hacer esto varían dependiendo de cada router, por lo que no se van a tratar en este tutorial. En la mayoría de routers habrá un menú llamado port forwarding o virtual servers para ello. También podemos redireccionar el puerto de SSH, que por defecto es el 22.

Ejemplo de redirección de puertos en router TP-Link

Otra opción, aunque bastante más insegura, es incluir nuestra Raspberry como DMZ Host, lo que abre todos los puertos del router al exterior, pero no es recomendable, ya que dejamos nuestra red bastante más expuesta a posibles ataques.

3. Instalando Subsonic

El requisito principal de Subsonic es Java. En mi caso usaré Open JRE, aunque al parecer se puede conseguir un mejor rendimiento con Oracle Java 8. Si se opta por ésta última opción hay un tutorial aquí.

Si optamos por Open JRE, basta con instalar:

$: sudo apt install openjdk-7-jre

Una vez instalado, podemos descargar el paquete de Subsonic desde su página de descargas. Accedemos al enlace anterior, pulsamos en el enlace Debian/Ubuntu, y copiamos la ruta del enlace tal y como vemos a continuación.

Copiando la dirección de descarga de Subsonic en Firefox

A fecha de hoy, la última versión estable, es la 5.3, que podemos descargar en nuestra Raspberry directamente con:

$: wget http://subsonic.org/download/subsonic-5.3.deb

Una vez descargado el paquete, lo instalamos con:

$: sudo dpkg -i subsonic-5.3.deb

Si hemos descargado una versión diferente, ponemos el nombre de archivo que corresponda.

4. Añadiendo un usuario sin privilegios para Subsonic

Por defecto, Subsonic se ejecuta con el usuario root. Esto puede venir muy bien para evitar problemas de permisos, pero es un riesgo de seguridad; especialmente si vamos a permitir el acceso desde el exterior de nuestra red local. Por ello es recomendable ejecutar Subsonic mediante un usuario que no tenga privilegios de administrador. El usuario por defecto de Raspbian, pi, también tiene privilegios de administrador, así que crearemos un usuario nuevo que se encargue exclusivamente de ejecutar Subsonic. En mi caso lo voy a llamar pisubsonic:

$: sudo adduser pisubsonic

Se nos pedirá una contraseña, que tendremos que introducir dos veces, y algunos datos más que podemos dejar con sus parámetros por defecto pulsando Intro.

Una vez creado el usuario, editaremos el fichero /etc/default/subsonic

$: sudo nano /etc/default/subsonic

Y sustituiremos la línea SUBSONIC_USER por el usuario que hemos creado, como muestra el recuadro rojo en la siguiente imagen:



Opcionalmente, he aumentado el máximo de memoria que puede usar Subsonic de 150 a 500 MB, y me he asegurado de que levante la interfaz web en el puerto 4040, como se puede ver en el recuadro verde.

Una vez modificado todo, guardamos el fichero y reiniciamos el servicio de Subsonic:

$: sudo service restart subsonic

Si todo ha ido bien, podremos acceder a Subsonic abriendo un navegador en la misma red que nuestra Raspberry y accediendo a la IP de la Raspberry y al puerto 4040:



A partir de aquí podremos entrar a con Username: admin, Password: admin, y empezar a configurarlo todo.

En la segunda entrada de este tutorial veremos cómo compilar ffmpeg para permitir que nuestra Raspberry haga transcoding de nuestra música y permita reproducir todo tipo de música ahorrando ancho de banda.

Nota: Si queremos usar un disco duro externo para almacenar nuestra música, algo recomendable para tener más espacio de almacenamiento y para aumentar la vida de la tarjeta de memoria, podéis seguir este tutorial.

* Subsonic está programado en Java, y usa ffmpeg para hacer transcoding. Por ello, es posible que una Raspberry Pi 1 o 1+ sea demasiado lenta para que todo funcione fluidamente, tanto por RAM como por ser monocore (ffmpeg ocupa prácticamente un núcleo cuando está haciendo transcoding).


domingo, 10 de abril de 2016

Montar disco duro externo automáticamente en Raspbian

Si queremos usar nuestra Raspberry para cosas que requieran espacio de almacenamiento, como streaming de música o servidor de descargas, resulta útil conectarle un disco duro para tener espacio suficiente. Montar ese disco duro automáticamente permite que podamos gestionar la Raspberry remotamente, y reiniciarla ante cualquer eventualidad.

En mi caso tengo un disco duro de 2TB que voy a utilizar como almacenamiento. Este disco tiene una única partición formateada en ntfs. Veamos cómo montarlo en Raspbian:

1. Preparando el directorio destino y configurando permisos

En la mayoría de distribuciones Linux suele existir un directorio que se usa para montar unidades externas (discos duros, pendrives, etc). Este directorio normalmente es /mnt o /media. En mi caso voy a usar /mnt.

Lo primero que haremos será crear un nuevo directorio dentro de /mnt para montar ahí nuestro disco duro. De este modo, si posteriormente quisiéramos montar otra unidad, podremos crear otro directorio y tendremos todo más organizado.

$: sudo mkdir /mnt/midisco

Ahora toca configurar los permisos para que nuestro usuario pueda leer, escribir y ejecutar archivos en ese directorio. Si estamos usando el usuario por defecto (pi), podemos escribir:

$: sudo chown -R pi:pi /mnt/midisco
$: sudo chmod -R 775 /mnt/midisco

2. Determinando el sistema de archivos de nuestro disco y probando el montaje

Como he dicho, en mi caso voy a usar un disco duro formateado en ntfs que ya contiene datos que me interesan. Podemos mostrar las particiones que reconoce el sistema con:

$: sudo fdisk -l

Que mostrará algo parecido a la siguiente imagen:


Vemos que tenemos una tarjeta de memoria con dos particiones (recuadro verde), y un disco duro (recuadro azul) con una partición (recuadro rojo). Ésta última es la que me interesa montar, así que apuntamos la línea que hay debajo de "Device" (/dev/sda1), y comprobamos el tipo de sistema de archivos debajo de "Type". En mi caso HPFS/NTFS/exFAT.

Si el sistema de archivos es NTFS, como en este ejemplo, me toca instalar los drivers ntfs-3g:

$: sudo apt install ntfs-3g

Si el sistema de archivos que queremos montar fuese exFAT, también nos toca instalar los drivers en Raspbian:

$: sudo apt insatall exfat-utils

Si el sistema de archivos fuese ext4 o alguno que soporte Raspbian de serie, no tendríamos que instalar nada.

Una vez llegados aquí, podemos probar a montar el disco duro con:

$: sudo mount /dev/sda1 /mnt/midisco

Donde /dev/sda1 es la partición que quería montar, y /mnt/midisco el directorio de montaje que he creado en el paso 1.

Si todo ha ido bien podremos acceder a /mnt/midisco y ver los archivos.

3. Editando el fichero fstab para que el disco se monte automáticamente

Lo último que nos queda es conseguir que el proceso de montaje se haga automáticamente al iniciar el sistema. Para ello toca editar el fichero /etc/fstab:

$: sudo nano /etc/fstab

Y añadir una línea parecida a la siguiente:

 
Lo primero (recuadro rojo) es la dirección de la partición que queremos montar, que encontramos al inicio del paso 2. En el recuadro verde escribimos el directorio de montaje, que en mi caso es /mnt/K2TB, (en el ejemplo que hemos usado en esta entrada sería /mnt/midisco). en el recuadro azul escribimos el sistema de archivos de la partición, en el recuadro naranja dejamos los parámetros por defecto (es posible que se pueda mejorar el rendimiento añadiendo algún parámetro extra), y los dos últimos ceros especifican que no se tenga en cuenta esa unidad en posibles copias de seguridad y que fsck no compruebe errores en esa unidad. Si queremos que fsck compruebe errores en nuestro disco duro, habría que cambiar el cero del recuadro blanco por un 2.

Si todo ha ido bien, una vez reiniciemos el sistema, tendríamos que poder leer y escribir los archivos de nuestro disco duro accediendo a la carpeta /etc/midisco

Configurar IP estática en Raspbian Jessie

Para usar una Raspberry como servidor casero y acceder a él desde el exterior, resulta conveniente que tenga una IP estática para redireccionar las peticiones que llegan a nuestro router.

Con Raspbian Jessie, el método tradicional para configurar una IP (modificando /etc/network/interfaces) no funciona. Sin embargo, bastan un par de pasos para tener una IP estática:

1. Obteniendo la información necesaria

Necesitamos obtener al menos tres direcciones: la IP estática que queremos en la Raspberry, que debe estar en la misma subred, la dirección del router y la dirección (o direcciones) de los DNS. Para obtenerlas escribimos:

$: ifconfig

Obtendremos algo similar a la siguente imagen:


En el recuadro rojo podemos ver nuestra IP actual, en mi caso 192.168.1.100. En el recuadro verde podemos ver nuestra máscara de subred (255.255.255.0). Estos dos datos nos indican que nuestra subred es 192.168.1.X, donde X será un valor entre 0 y 255. Es decir, todos los equipos de nuestra red doméstica tendrán una IP local con el formato 192.168.1.X. En este ejemplo, voy a usar 192.168.1.100 como IP estática para mi Raspberry.

Sólo nos queda averiguar la IP del router. Para ello podemos escribir:

$: route -ne


Nos interesa fijarnos en la puerta de enlace (Gateway) que esté en la fila donde Destination es 0.0.0.0 (recuadro verde). En mi caso, la dirección es 192.168.1.1 (recuadro rojo). Básicamente lo que nos dice esa línea es que, en nuestra red local, todo el tráfico que tenga como destino Internet (0.0.0.0) se redirecciona al dispositivo con IP 192.168.1.1, es decir, nuestro router.

Ya que tenemos esos dos datos apuntados, podemos configurar nuestra IP estática.

2. Configurando la IP estática

Para establecer la IP estática en nuestra Raspberry, vamos a añadir la información anterior al fichero /etc/dhcpcd.conf. Es necesario editarlo como root, por lo que no olvidéis usar sudo:

$sudo nano /etc/dhcpcd.conf

Sólo es necesario añadir algunas líneas al final del fichero, sin modificar nada más:




En la línea que comienza por interface establecemos la interfaz de red que vamos a configurar. En mi caso es eth0 (cableada), pero podéis usar wlan0 o similar si os conectáis por wifi (con ifconfig podéis ver la interfaz que os interesa configurar)

En la siguiente línea (static ip_address) escribimos la IP estática que podemos establecer. El /24 no es necesario, pero no está de más ponerlo si vuestra máscara de subred (ver paso 1) era 255.255.255.0.

En la línea static routers, escribimos la IP de nuestro router (el gateway que obtuvimos al final del paso 1)

Por último, en la línea static domain_name_servers escribimos la IP (o IPs, separadas por un espacio) de los servidores DNS. Como mi router proporciona las DNS de mi proveedor de Internet, he optado por poner la dirección de mi router. También podríais poner otras DNS, como las de Google, sustituyendo esa última línea por algo como:

static domain_name_servers=8.8.8.8 8.8.4.4

Ya sólo queda guardar el fichero (Ctrl+X) y reiniciar con un:

$: sudo reboot

Y comprobar que nuestra IP es la que queríamos.


Nota: Si el router tiene habilitado el DHCP, cosa muy común, asignará automáticamente direcciones IP a los distintos dispositivos que se conecten a él. Nos interesa que no asigne automáticamente nuestra IP estática (192.168.1.100) a otro dispositivo, para evitar un conflicto IP, que seguramente nos dejaría sin conexión a Internet en la Raspberry. Esto se puede solucionar de dos maneras:

1. Muchos routers tienen la posibilidad de reservar una IP a un dispositivo dada su dirección MAC (que podéis encontrar con el comando ifconfig)

2. Podéis configurar el servidor DNS para que empiece a repartir direcciones IP automáticas en un rango, así que otra posibilidad es restringir ese rango y asignar nuestra IP estática fuera de ese rango. Por ejemplo, en mi caso tengo configurado el servidor DNS para que reparta IPs desde 192.168.1.128 a 192.168.1.255, por lo que si mi IP estática es 192.168.1.100 no habrá problemas de conflictos IP.

miércoles, 10 de febrero de 2016

lunes, 7 de septiembre de 2015

Usando Meld con Git en Linux

Cuando usamos Git, podemos ver los cambios entre dos commits con el comando diff:

git diff master development

Sin embargo la salida del diff puede llegar a ser confusa, especialmente si hay muchos cambios entre las versiones. Uno de los programas gráficos más conocidos para visualizar estos diffs es Meld. Para que Git utilice Meld a la hora de visualizar las diferencias basta con escribir:

git config --global diff.tool meld

El --global sirve para que el cambio se aplique a todos los repositorios Git del sistema. A partir de ahora, bastará con hacer:

git difftool master development

O, si se quiere comparar a nivel de directorios, en lugar de entre archivos individuales:

git difftool -d master development


lunes, 31 de agosto de 2015

Solaar: Usando Logitech Unifying en Linux

Hace algunos años, Logitech unificó la gran mayoría de sus dispositivos inalámbricos bajo un mismo receptor. Esta tecnología se llamó Unifying y permitía, entre otras cosas, utilizar un mismo receptor para emparejar hasta 6 dispositivos, con el consiguiente ahorro de puertos USB. Además, si no se instalaba ningún driver, el sistema operativo reconocía el enlace inalámbrico como el de un dispositivo normal y corriente, aunque la instalación del software de Logitech permitía funciones adicionales, como ver el estado de la batería, activar teclas de función, cambiar el DPI en los ratones, etc.

Como suele suceder, este software sólo esta disponible de forma oficial para Windows/MacOS. Afortunadamente, la comunidad pudo descifrar el protocolo HID++ de Logitech y desarrolló Solaar, un gestor de dispositivos compatibles con Unifying para Linux.

Solaar, además del código fuente, dispone de paquetes para Debian, Ubuntu, OpenSuse y Arch. Para instalarlo en Ubuntu, basta con añadir el siguiente PPA:

sudo add-apt-repository ppa:daniel.pavel/solaar

E instalar el programa:

sudo apt-get update 
sudo apt-get install solaar

Yo lo he instalado en Ubuntu y funciona de maravilla. Permite emparejar y desemparejar dispositivos al receptor, ver la carga de los periféricos, incluso activar las teclas de función por defecto en mi teclado:




jueves, 25 de junio de 2015

Eliminar archivos recursivamente con wilcards en Linux

Por ejemplo, para borrar todos los archivos terminados en exe en el directorio actual recursivamente, bastaría con escribir:

find . -name '*.exe' -exec rm -f {} \;