(Esta entrada ha sido publicada en DebianHackers)
Soy una persona que hace copias de seguridad. De todo. Siempre. No me vale lo de que no hacen falta, que soy un exagerado ni ninguna otra excusa. Backup y punto. Y cifrados. Y siguiendo la regla del 3-2-1. Y con un armario de comunicaciones adecuado.
Además, me encantan las Raspberry Pi, la idea y cómo la han llevado a cabo y tengo varias con las que experimento. Como también me gusta tener un montón de servicios alojados entre mi casa y los servidores dedicados, son un estupendo (y barato) medio con los que pasar horas. Así que creo que es justo advertir que esta entrada va sobre cómo des-complicarte la vida usando el software adecuado, una raspi y un par de discos duros.
El laberinto del backup
Hace ya unos años que expliqué cómo tener una NAS usando una raspberry pi y un disco mecánico de un tera y lo llamé ranas
(si, el chiste es bastante malo).
En ranas
terminaban los backups de todos los ordenadores de casa y estuvo funcionando hasta hace un par de meses, empleando un total de dos raspis porque la original de las fotos se quemó. También hacía backup de los datos de los servidores en otra raspi que tenía muchas tareas, algunas demasiado importantes como para estar pendiente de las copias de seguridad.
Hace unos meses me surgió la necesidad, nacida de la paranoia todo hay que decirlo, de hacer copia de los ficheros que tengo en la nube privada. Porque, por mucho que me repitiese que había copia de los ficheros en más de un sitio, la realidad es que es muy sencillo perderlo todo por un fallo en el servidor que se propague a los clientes. Ya contaba con backup de la base de datos y de la configuración pero, sólo yo tengo casi 30 gigas de datos y de haberlo enviado a ranas
habría llenado el disco.
También teníamos otro disco compartido por samba
donde dejaba películas y videos para poder verlos tranquilamente en el proyector. Este volumen llegué a conectarlo al router en un intento de darle mayor velocidad porque a veces se desincronizaba todo y no había forma de ver series y hasta hace no mucho no me di cuenta de que el problema era el acceso, estaba usando el protocolo equivocado.
Los backups via NAS se hacían usando samba
, lo mismo que el volumen compartido mientras que las copias de los datos de servidores van por rsync
sobre ssh
. Usaba un total de dos raspberrys, dos discos duros mecánicos, varios scripts propios y un puñado de usuarios desperdigados por los servidores (no me bajaréis de esta burra). Al final, tenía una mezcla heterogenea (por decirlo suavemente) de discos, protocolos y raspis que lo hacía todo complicado de entender y gestionar y, entonces, algo fantástico sucedió…
El plan
Decidí dejar mis scripts y configuraciones a medida, de reinventar la rueda, y me propuse pasar a usar una solución NAS más completa. Buscaba una solución que me permitiera almacenar los backups, tanto de servidores como de la nube privada, servir de NAS para los equipos de casa y algún otro servicio alternativo como resultó ser DNLA.
Tras dar unas cuantas vueltas llegué a Open Media Vault, una solución open source basada en Debian GNU/Linux y que se puede instalar en raspis. Me animé a probarla en una Raspberry 3B que tenía ociosa y me encantó. Me daba un punto centralizado de gestión (adiós varios usuarios distribuidos por las raspis), una interfaz sencilla y todos los protocolos que usaba en un mismo lugar y, además, me recordó que si quieres hacer streaming de video lo mejor no es samba
sino DNLA
. En apenas un par de días tenía todos los backups y el volumen compartido en una única raspi con un disco SSD de 720 GB funcionando rápido y bien. Y las series ahora ya no se trababan :D.
Con la llegada de las navidades y las ofertas en informática que les acompañan, me decidí a comprar un kit de iniciación a las raspis con una 4B de 4 GB y un par de discos duros SSD de 1TB, provenientes de China. Entre las raspis 3B y las 4B hay una diferencia crucial si estás pensando en montar un servidor NAS y es que en la primera los puertos USB y la tarjeta de red (de 100Mb) comparten interrupción, esto es, que se pisan cuando se hace un uso intensivo de ambos. Como la idea de las NAS es coger por red lo que guardas en el disco duro externo, la tragedia se masca y el proceso es más lento. Las 4B tienen interrupciones independientes para los puertos USB y la tarjeta de red Gigabit y, dos de los cuatro puertos USB son 3.0. En ranas
tenía un cable con doble entrada USB para alimentar al disco mecánico y no comenzase con la musiquita del tic-tic-tic-tic, que indicaba que no tenía suficiente alimentación. Ahora ya no es necesario para ninguno de los dos discos SSD. Es más, si me da el aire puede que le añada un tercer disco con el cable doble en los puertos 2.0.
Mi plan maligno era montar un nuevo servidor de almacenamiento usando la nueva raspi y los dos discos SSD y que diese soporte a los backups, al NAS y al volumen compartido. Es decir, iba a montar OpenMediaVault usando un hardware significativamente mejor y más rápido.
Era la hora de dar vida a fritz
.
Securización
Habitualmente suelo configurar las raspis como si fuese un servidor más, porque lo son, y les aplico unas configuraciones estrictas que garanticen un mínimo de seguridad. Cuando monté OpenMediaVault (OMV a partir de ahora) por primera vez me di cuenta que no puedo aplicar mis configuraciones porque espera precisamente que sea una raspi sin modificaciones.
Así que, con esta limitación en mente, me propuse conseguir la configuración más segura posible, con los siguientes puntos:
- utilizar sólo usuarios creados en OMV
- el acceso por ssh se hará sólo con clave pública y sólo para los usuarios seleccionados. Root ni siquiera debería ser una opción.
- dejar al usuario
pi
vacío, sin ninguna modificación salvo la contraseña. Ni clave pública ni acceso a ningún servicio - usar sólo los servicios que necesito, el resto anularlos o quitarlos
- todos los backups deben estar cifrados. El resto del contenido ya tal
- los usuarios accederán a su directorio y a nada más. Nada de usuarios para varios servicios y con acceso a todo
La configuración en OMV
- cambiar contraseña de
admin
a una muy compleja. - crear un certificado y aplicarlo al sitio:
- usar certificado nuevo y forzar ssl
- habilitar monitorización
- discos ssd
- conectar, detectar y formatear los dos discos de 1TB
- montarlos y salvar la configuración para hacer el cambio perdurable.
- smart
- activar smart para ssd1TBmedia
- activar smart para ssd1TBbackup
- nfs: desactivar
- ftp: desactivar
- rsync: desactivar
- usuarios y grupos
- crear usuarios virtuales
- añadir clave pública
- dar acceso por ssh
- crear usuarios virtuales
- ssh
- sólo autenticación por clave pública.
- añadir opción
Match Address 192.168.1.*
- directorios home de usuarios
- activar
- carpetas compartidas
- permisos: 700
- accesible sólo por usuario
El script
Aquí dejo el script que he utilizado para la clonación de raspbios, instalación y la configuración de OMV. ¡OJO!! Se trata de un script personal, casero y perfectamente falible. Declino toda responsabilidad si, por ejemplo, lo aplicas a tu raspi y formateas algo que no debas xD.
export HOST='raspi'
export DOMN='example.com'
export FQDN="$HOST.$DOMN"
cd ~/descargas
unalias ls
if [ ! `ls *raspios*lite*img` ] ; then
unzip *raspios*lite*zip
fi
IMG=`ls *raspios*lite*img`
SD="/dev/XXXXX" # ¡¡ojo!! esto puede ser una tarjeta SD
SD1="${SD}1"
SD2="${SD}2"
sudo umount /mnt/*
sudo umount /media/diego/*
sudo dd if=$IMG of=$SD bs=4M status=progress
sudo mkdir -p /mnt/boot /mnt/rootfs
sudo mount "$SD1" /mnt/boot/
sudo mount "$SD2" /mnt/rootfs/
# activo ssh desde el inicio
sudo touch /mnt/boot/ssh
cd /mnt/rootfs
# uso tmpfs para ciertos directorios
echo "
tmpfs /tmp tmpfs defaults,noatime,mode=1777,size=50m 0 0
tmpfs /var/tmp tmpfs defaults,noatime,mode=1777,size=50m 0 0
tmpfs /run tmpfs defaults,noatime,mode=1777,size=50m 0 0
" | sudo tee --append etc/fstab
echo "127.0.0.1 $FQDN $HOST
127.0.0.1 localhost.localdomain localhost
:1 localhost ip6-localhost ip6-loopback
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters" | sudo tee etc/hosts
echo $HOST | sudo tee etc/hostname
figlet $FQDN | sudo tee etc/motd
# evito que se pida contraseña a los usuarios del grupo sudo
sudo sed -i 's|^%sudo\tALL=(ALL:ALL) ALL|%sudo\tALL=(ALL) NOPASSWD:ALL|g' etc/sudoers
cd
sudo umount /mnt/boot
sudo umount /mnt/rootfs
sudo rmdir /mnt/boot /mnt/rootfs
Hay que conectarse vía SSH una vez más, ssh pi@raspi
.
sudo passwd pi # imprescindible poner una contraseña MUY segura
# elimina el mensaje que aparece si la wlan no está configurada
sudo rfkill unblock `rfkill | grep wlan | awk '{print $1}'`
# limpieza de sources.list
sudo sed -i '/^#/d' /etc/apt/sources.list
sudo sed -i '/^$/d' /etc/apt/sources.list
sudo sed -i '/deb-src/d' /etc/apt/sources.list
#sudo sed -i 's/$/contrib non-free/' /etc/apt/sources.list
sudo sed -i '/^#/d' /etc/apt/sources.list.d/raspi.list
sudo sed -i '/^$/d' /etc/apt/sources.list.d/raspi.list
sudo sed -i '/deb-src/d' /etc/apt/sources.list.d/raspi.list
# quito paquetes que no necesito
sudo apt purge -y alsa-utils triggerhappy wpasupplicant pi-bluetooth bluez bluez-firmware cpp* dmidecode g++* gcc-[4567]* gdb* geoip-database build-essential tcc* dpkg-dev luajit libluajit-5.1-common nano ncdu patch plymouth libplymouth4 tasksel tasksel-data traceroute rpcbind samba-common v4l-utils xdg-user-dirs cifs-utils dbus libdbus-*
# actualizo e instalo imprescindibles
sudo apt update
sudo apt full-upgrade -y
sudo apt install -y bash-completion vim ntp htop
sudo apt purge -y `dpkg -l | grep ^rc | awk '{print $2}'`
sudo apt autoremove -y
sudo apt clean
# núcleo de 64 bits
sudo rpi-update
echo -e "\n# 64 bits\narm_64bit=1" | sudo tee -a /boot/config.txt
# OpenMediaVault prerequisitos
sudo rm -f /etc/systemd/network/99-default.link
sudo reboot && exit
# OpenMediaVault instalación
sudo mkdir -p /var/log/nginx # normalemente no es necesario pero por si acaso
sudo mkdir -p /var/log/samba # normalemente no es necesario pero por si acaso
wget -O - https://github.com/OpenMediaVault-Plugin-Developers/installScript/raw/master/install | sudo bash
# detengo nfs y portmap
sudo systemctl stop nfs-server.service
sudo systemctl disable nfs-server.service
sudo systemctl stop portmap.service
sudo systemctl disable portmap.service
Conclusiones
Esta nueva raspi es considerablemente más rápida y no sólo a nivel de red sino que los 4 GB de RAM se notan y mucho. El cambiar los discos mecánicos por otros SSD y usar puertos USB 3.0 en vez de los 2.0 también le añaden un buen montón de rendimiento y potencia al conjunto.
En cuanto a OpenMediaVault me parece una verdadera joya que funciona muy bien a pesar de no tener debajo un servidor propiamente dicho. Me encantaría verlo funcionar en un hardware potente, con varios discos y un buen puñado de CPU y RAM, tiene que ser una delicia. En mi caso, primaba el bajo consumo y la ausencia de ruido.
Algo que sí me gustaría poder hacer en OMV es desactivar los servicios que no se usan, al igual que sucede con los plugins. Pero vienen metidos en el core de la aplicación y no he encontrado la forma (aún). Es púramente estético porque los servicios no están funcionando ni escuchando en ningún puerto pero es lo que siempre hago y la cabra tira al monte.
4 ideas sobre “Raspberry pi como servidor de almacenamiento”
Efectivamente el script está mal… nano aparece en el listado que no necesitas y vim está en imprescindibles. No te lo perdonaré jamás
jajajajajjajaja
me alegra ver que estás bien y que no has perdido el sentido del humor. Porque… nano como imprescindible es broma, ¿verdad?
Un abrazo Dani!
Dicha la tonteria… yo tuve que dejar de lado la acumulación de raspberrys.. hay proyectos que lo requerían obligatoriamente (la recreativa, el magic mirror), pero también empecé cruzada de usar cualquier software como servicio y alojar yo mismo el servicio. Al final o bien tenía varias raspberrys infrautilizadas, o estaban pasadas de rosca. Ahora dejo las raspberrys (que creo que en esta casa me he plantado el la número 8) y me he pasado a un microserver de hp que tira por dockers como si sus 4GB de ram fuesen infinitos.
Hablando de backups… estoy procrastrinando tomar una decisión por culpa de las fotos… que después de años de escaneados y de cámaras digitales, la tontería va por los 5 TB y pico (que ahora los tengo en raid, ok, pero solo una copia) Acepto consejos y recomendaciones que no entren conflicto con mi diógenes digital
supongo que yo tenderé a un miniserver con contenedores cuando sepa cómo manejarlos pero, hasta entonces, raspis por el bajo consumo. Las 4b son la caña xD.
En cuanto a los backups… deja el raid como hasta ahora y coge una de esas raspis y conéctale un disco externo con todos los teras que puedas encontrar y sincronízalo con tu raid. Así mantendrás tu diógenes y tendrás una copia de tu copia de seguridad.
Si te quieres complicar la vida, pilla otro miniserver con chorrocientos teras y métele OMV, ponle raid, zfs, sincroniza el raid viejo y comienza a hacer backup ahí. Ponerle NAS también ayudaría para tu diógenes xD