Cubietruck como servidor doméstico

Recientemente adquirí una placa Cubietruck (Cubieboard 3) para trastear un poco y ver con qué le podía sacar provecho. Tras dedicarle un tiempo la he convertido en un servidor doméstico con los siguientes servicios:

  • Compartición de archivos (SAMBA)
  • Servidor de impresión (CUPS)
  • Cliente de BitTorrent (Transmission)

Es un sistema de bajo consumo, con unas dimensiones muy reducidas, totalmente silencioso, dispone de conexión SATA para un disco de 2.5 pulgadas, y existe una carcasa económica (Ewell case) para albergar cómodamente todo el conjunto. En comparación con el PC convencional que tenía anteriormente funcionando las 24 horas, supone un cambio muy satisfactorio. Tras algunas semanas en funcionamiento, no le puedo reprochar nada en cuanto a rendimiento ni estabilidad, sin un solo fallo hasta ahora.

El único problema importante lo he encontrado con el grosor del disco duro, un Toshiba de 2TB de la serie MQ, que excede la altura del hueco dedicado a él en la caja, lo que me ha obligado a hacer un apaño para que no choque con la placa Cubietruck, y hace que no se pueda cerrar todo como es debido. Tenedlo en cuenta a la hora de comprar.

Para la instalación del sistema me he decantado por Debian Wheezy, partiendo de la fantástica imagen preparada por Igor Pečovnik. Nos ponemos manos a la obra…

Tras descargar la imagen y grabarla en la tarjeta SD, iniciamos el equipo con ella y transferimos la instalación a la memoria NAND del sistema:

sh ./nand-install.sh

Nos pedirá que reiniciemos y que volvamos a ejecutar de nuevo el mismo script, desde la SD. Tras esta segunda ejecución, ya podemos apagar el sistema y quitar la SD para iniciar de nuevo desde la NAND.

Eliminamos algunos archivos que ya no serán necesarios:

rm .install-exclude
rm nand1-cubietruck-debian-boot.tgz
rm nand_mbr.backup
rm .reboot-nand-install.pid
rm sata-install.sh

Actualizamos el sistema:

apt-get update
apt-get upgrade

Reconfiguramos el idioma, ejecutando dpkg-reconfigure locales. Añadimos es_ES.UTF-8, y seleccionamos «None» cuando nos pida el default locale.

Establecemos el idioma por defecto ejecutando:

echo ": ${LANG:=es_ES.utf8}; export LANG" >> /etc/profile

Reconfiguramos la zona horaria con dpkg-reconfigure tzdata.

Editamos el archivo /etc/network/interfaces, y cambiamos la siguiente línea:

iface eth0 inet dhcp

Por estas cuatro, sustituyendo la IP de la segunda línea por la que decidamos:

iface eth0 inet static
	address 192.168.1.11
	netmask 255.255.255.0
	gateway 192.168.1.1

Podemos reiniciar y a partir de ahora podremos trabajar vía SSH contra esta IP fija que hemos definido.

Lo siguiente es opcional, para deshabilitar los servicios correspondientes al receptor de infrarrojos y el bluetooth, si no vamos a utilizarlos:

mv /etc/rc0.d/K01lirc /etc/rc0.d/k01lirc
mv /etc/rc1.d/K01lirc /etc/rc1.d/k01lirc
mv /etc/rc2.d/S03lirc /etc/rc2.d/s03lirc
mv /etc/rc3.d/S03lirc /etc/rc3.d/s03lirc
mv /etc/rc4.d/S03lirc /etc/rc4.d/s03lirc
mv /etc/rc5.d/S03lirc /etc/rc5.d/s03lirc
mv /etc/rc6.d/K01lirc /etc/rc6.d/k01lirc</p>
<p style="text-align: justify;">mv /etc/rc0.d/K01bluetooth /etc/rc0.d/k01bluetooth
mv /etc/rc1.d/K01bluetooth /etc/rc1.d/k01bluetooth
mv /etc/rc2.d/S04bluetooth /etc/rc2.d/s04bluetooth
mv /etc/rc3.d/S04bluetooth /etc/rc3.d/s04bluetooth
mv /etc/rc4.d/S04bluetooth /etc/rc4.d/s04bluetooth
mv /etc/rc5.d/S04bluetooth /etc/rc5.d/s04bluetooth
mv /etc/rc6.d/K01bluetooth /etc/rc6.d/k01bluetooth

Teniendo ya el disco conectado al interfaz SATA, creamos una nueva partición primaria de todo el tamaño del disco:

fdisk /dev/sda

Formateamos la partición recién creada:

mkfs.ext4 -E lazy_itable_init=0,lazy_journal_init=0 /dev/sda1

Creamos el usuario que utilizaremos para acceder a los archivos compartidos, en este caso le llamaremos «stuff»:

adduser stuff

Creamos el punto de montaje para la partición del disco duro:

mkdir /stuff

Y montamos la partición:

mount /dev/sda1 /stuff

Configuramos el fstab para que la partición se monte automáticamente con el inicio del sistema:

echo "/dev/sda1       /stuff  ext4    noatime    0       2" >> /etc/fstab

Establecemos los permisos necesarios:

chown stuff:stuff /stuff
chmod 700 /stuff

Configuramos el disco duro para que pase a modo «standby» tras 20 minutos de inactividad, añadiendo lo siguiente al final del archivo /etc/hdparm.conf:

/dev/sda {
	spindown_time = 240
}

Instalamos el servicio SAMBA:

apt-get install samba samba-common-bin

Editamos el archivo /etc/samba/smb.conf, descomentando en primer lugar la línea «security = user», y comentando completamente los apartados [homes], [printers] y [print$]. Después añadimos las siguientes líneas al final del archivo:

[stuff]
path = /stuff
valid users = stuff
guest ok = no
writable = yes
browsable = yes

Establecemos la contraseña del usuarios stuff para el servicio SAMBA:

smbpasswd -a stuff

Reiniciamos el servicio SAMBA y ya lo tendremos operativo:

/etc/init.d/samba restart

Instalamos el paquete de Transmission:

apt-get install transmission-daemon

Paramos el servicio para poder editar el archivo de configuración, ya que de lo contrario se perdería cualquier cambio que hagamos en él:

/etc/init.d/transmission-daemon stop

Editamos el archivo /etc/transmission-daemon/settings.json, donde configuraremos el directorio donde queremos que vayan las descargas (por ejemplo /stuff/download), la contraseña para acceder al interfaz web, y cualquier otro parámetro que consideremos. Uno de ellos es «umask», y debemos cambiarlo a 0.

Creamos el directorio de descargas que hemos configurado antes y establecemos los permisos necesarios:

mkdir /stuff/download
chmod a+x /stuff
chmod 777 /stuff/download

Ya podemos iniciar el servicio y comprobar el acceso vía web:

/etc/init.d/transmission-daemon start

Instalamos el servicio de gestión de impresoras:

apt-get install cups

Si vamos a conectar una impresora HP, como es mi caso, instalaríamos el siguiente paquete que proporciona todos los controladores necesarios:

apt-get install hplip

El sistema CUPS viene preparado para que lo configuremos desde el interfaz web, pero conectándonos localmente desde la propia máquina, no permitiendo conexiones externas. Para podernos conectar desde otro equipo, necesitaremos realizar un serie de cambios en el archivo /etc/cups/cupsd.conf.

En primer lugar cambiaremos la línea «Listen localhost:631» por «Port 631». Luego observaremos una serie de línea que aparecen así:

# Restrict access to the server...
<Location />
Order allow,deny
</Location>

# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
</Location>

Y deberemos dejarlas tal que así:

# Restrict access to the server...
<Location />
Order allow,deny
Allow 192.168.1.*
</Location>

# Restrict access to the admin pages...
<Location /admin>
Order allow,deny
Allow 192.168.1.*
</Location>

# Restrict access to configuration files...
<Location /admin/conf>
AuthType Default
Require user @SYSTEM
Order allow,deny
Allow 192.168.1.*
</Location>

Reiniciamos el servicio para que actualice la configuración:

/etc/init.d/cups restart

Ahora ya nos podemos conectar desde cualquier navegador a la dirección http://192.168.1.11:631/admin (cambiando la IP por la que hayamos definido). Desde la opción Administración -> Añadir impresora, podremos seguir fácilmente los pasos para crear y compartir la impresora.

Puesto que en algún momento puede que nos interese realizar un apagado controlado el sistema sin tener que conectarnos a él remotamente, vamos a configurarlo para que ocurra cuando pulsemos el botón de power. Para empezar instalamos el software de gestión ACPI:

apt-get install acpid

Creamos el archivo /etc/acpi/events/button-power con el siguiente contenido:

event=button/power
action=halt

Reiniciamos el servicio para que actualice la configuración y ya podemos hacer la prueba pulsando el power:

/etc/init.d/acpid restart

Configuramos el sistema de envío de correos electrónicos, instalando primero el software necesario:

sudo apt-get install ssmtp mailutils

Creamos el archivo /etc/ssmtp/ssmtp.conf con los datos del servidor SMTP que utilizaremos:

mailhub=host_servidor_smtp_externo:puerto
FromLineOverride=YES
AuthUser=usuario_smtp
AuthPass=password_smtp

Creamos el archivo /etc/ssmtp/revaliases especificando el usuario que va a hacer uso del sistema:

root:usuario@dominio.com:host_servidor_smtp_externo:puerto

Ahora viene la parte divertida. Creamos un script que controlará la activación y desactivación del parpadeo del led naranja de nuestro Cubietruck. Esto lo utilizaremos para activarlo en caso de que se produzca una alarma por temperatura del sistema o por un estado anómalo del disco duro. Este script se ubicará en /usr/local/bin/led_alarm.sh y tendrá el siguiente contenido:

#!/bin/bash
case "$1" in
	on)
		echo timer > /sys/class/leds/orange\:ph20\:led2/trigger
		;;
	off)
		echo 0 > /sys/class/leds/orange\:ph20\:led2/brightness
		;;
esac

Le damos permisos de ejecución:

chmod +x /usr/local/bin/led_alarm.sh

Creamos el script que se activará en caso de un problema con el disco duro en /usr/local/bin/smartdnotify:

#!/bin/bash
. /usr/local/bin/led_alarm.sh on
echo "$SMARTD_MESSAGE" | mail -s "$SMARTD_FAILTYPE" "$SMARTD_ADDRESS"

Y le damos también los permisos necesarios:

chmod +x /usr/local/bin/smartdnotify

Instalamos las herramientas de monitorización de disco, que utilizarán el sistema S.M.A.R.T.:

apt-get install smartmontools

Reconfiguramos el servicio para que se inicie automáticamente y realice las comprobaciones cada 30 minutos:

sed -i 's/#start_smartd=yes/start_smartd=yes/g' /etc/default/smartmontools
sed -i 's/#smartd_opts="--interval=1800"/smartd_opts="--interval=1800"/g' /etc/default/smartmontools
sed -i 's/^DEVICESCAN /#DEVICESCAN /g' /etc/smartd.conf

Le indicamos que compruebe nuestro disco duro, pero no lo haga cuando se encuentra en «standby» (a menos que hayan pasado 24 horas desde el último chequeo), y que en caso de encontrar un error nos envíe un correo electrónico utilizando el script que hemos creado anteriormente:

echo "/dev/sda -d ata -H -n standby,48,q -m usuario@dominio.com -M exec /usr/local/bin/smartdnotify" >> /etc/smartd.conf

Iniciamos el servicio:

/etc/init.d/smartmontools start

Definimos el script que activará la alarma en caso de que se superen los 50 grados de temperatura del sistema, y la desactivará automáticamente cuando descienda por debajo de dicho umbral. Lo ubicaremos en /usr/local/bin/temperature_monitor.sh:

if [ "$TEMP_TRUNC" -gt "50" ]; then
	if [ ! -f $FLAG ]; then
		. /usr/local/bin/led_alarm.sh on
		touch $FLAG
		echo "Temperatura: $TEMP°C" | mail -s "Alerta de temperatura" $DEST
	fi
else
	if [ -f $FLAG ]; then
		rm $FLAG
		. /usr/local/bin/led_alarm.sh off
		echo "Temperatura: $TEMP°C" | mail -s "Temperatura normalizada" $DEST
	fi
fi

Le asignamos los permisos necesarios:

chmod +x /usr/local/bin/temperature_monitor.sh

Y añadimos la siguiente línea al crontab del usuario «root» para que se ejecute la comprobación cada 15 minutos:

*/15 * * * * /usr/local/bin/temperature_monitor.sh

Recursos consultados:

https://wiki.debian.org/Locale
http://www.thomas-krenn.com/en/wiki/Ext4_Filesystem
https://wiki.debian.org/BitTorrent/Transmission
https://wiki.debian.org/SystemPrinting
http://thismightbehelpful.blogspot.com.es/2008/09/remote-access-to-cups-web-interface.html
https://groups.google.com/forum/#!topic/cubieboard/eNWzeyDSDYc
http://kevin.deldycke.com/2011/05/setting-hdds-smart-monitoring-debian-squeeze/
https://wiki.archlinux.org/index.php/S.M.A.R.T.
http://stackoverflow.com/questions/8356698/how-to-remove-decimal-from-a-variable
http://askubuntu.com/questions/221081/permission-denied-when-downloading-with-transmission-deamon
http://info4admins.com/tips-to-spindown-your-hard-disk-in-debian-or-ubuntu/

1 comentario en “Cubietruck como servidor doméstico”

  1. Gracias por el tutorial, ya que me ayudo a resolver el problema que tenia con Samba. Pero no consigo que me cambie el idioma. Que puede ser?

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *