Sigo atentamente la evolución del pequeño Raspberry Pi desde sus orígenes y finalmente lo voy a poner a prueba migrando algunos de mis servicios a él.
Planificar los roles de servidor
- Servidor LAMP (Linux + Apache + MySQL/MariaDB + PHP)
- Servidor web para mis dominios
- Servidor de base de datos (local)
- Servidor de ficheros con OwnCloud o su alternativa
- Monitor de recursos
- Cliente de correo para una cuenta hosteada por GMail
- Servidor para aplicaciones autohosteadas
- Magicpacket
- Servidor DNS para red local
- Sistema de Backup
El hardware: Raspberry Pi 4 Model B
La inversión total fue de 107€ en los siguientes elementos:
- Raspberry Pi 4 Model B 4GB SDRAM (65€) con unas prestaciones magníficas:
Procesador | ARM Cortex-A72 |
---|---|
Frecuencia de reloj | 1,5 GHz |
GPU | VideoCore VI (con soporte para OpenGL ES 3.x) |
Memoria | 4 GB LPDDR4 SDRAM |
Conectividad | Bluetooth 5.0, Wi-Fi 802.11ac, Gigabit Ethernet |
Puertos | GPIO 40 pines, 2 x micro HDMI 4K, 2 x USB 2.0, 2 x USB 3.0, CSI (cámara Raspberry Pi), DSI (pantalla tácil), Micro SD, Conector de audio y jack USB-C para alimentación. |
- Tarjeta de memoria SanDisk Extreme micro SDXC 64 GB hasta 160 MB/s, Class 10, U3 y V30 (17€)
- GeeekPi caja acrilico con ventilador y 4 disipadores (11€)
- Fuente de alimentación 5.1V 3A USB-C (10€)
- Adaptador Hiletgo USB 2.0 TTL CP2102v serial converter (4€)
La caja incluye disipadores de aluminio y un ventilador y es importante porque reduce la temperatura de la CPU de 80ºC al entorno de 48ºC lo que beneficia indiscutiblemente al rendimiento.
Instalar el sistema operativo
Ubuntu Server 18.08 LTS para procesador ARM
Ubuntu es mi sistema operativo preferido para servidor y ya ofrece una imagen compilada con drivers preinstalados para el hardware de arquitectura ARM. En lugar de una instalación tradicional que nos guía pantalla a pantalla por el particionado, nombre de equipo, usuario, configuración de red, paquetes… volcaremos una imagen del sistema a la tarjeta microSD para arrancar directamente con ella. Los pasos:
- Descargar Ubuntu Server como imagen preconfigurada para Raspberry Pi
- Volcarla en la micro SD empleando por ejemplo Win32 Disk Imager
- Introducir la micro SD en la ranura de la Raspberry Pi.
- Para conectar con la consola de la Raspberry Pi usé un adaptador de USB a puerto serie
- Por fin arrancamos el sistema.
- Si tenemos acceso al servidor DHCP para conocer la IP asignada podemos saltarnos el paso 4 y conectar mediante SSH.
- Para el primer login el par usuario/contraseña predeterminado es ubuntu/ubuntu y el sistema solicitará un cambio de contraseña inmediato.
Los primeros comandos siempre están orientados a actualizar el sistema:
# apt update
# apt full-upgrade
# reboot
A continuación la configuración básica incluye:
Reemplazar el usuario predeterminado por el nuestro
# adduser nuevousuario
y lo añadimos al grupo de sudoers, con derecho a ejecutar ocmandos con privilegios de root
# adduser nuevousuario sudo
Hace logout (Ctrl + D) y login con el nuevo usuario para eliminar el predeterminado
# deluser ubuntu
Establecer el nombre del equipo
# hostnamectl set-hostname host.domain.com
Monitorizando el sistema
Algo que me preocupó desde el principio por la multitud de artículos que lo mencionaban es el incremento de temperatura de los nuevos modelos de Raspberry Pi 4, así que busqué cómo medir la temperatura de la CPU desde la línea de comandos y veo que en condiciones normales se mantiene alrededor de los 48ºC
Mostrar la temperatura de la CPU al inicio de sesión
Cuando se ejecuta una sesión interactiva de la shell bash, esta ejecuta comandos del directorio /etc/profile
para a continuación buscar y ejecutar sólo el primero que encuentre de estos scripts en este orden:
.bash_profile
.bash_login
.profile
Como ya existía edité .profile
y añadí al final:
cpu=$(</sys/class/thermal/thermal_zone0/temp) echo "CPU temperature is $((cpu/1000))'C"
Medir el rendimiento
Velocidad de la tarjeta micro SD
Partiendo de que la CPU y la RAM en una Raspberry Pi ya son de frecuencia limitada -aunque suficientes para un modesto servidor web- lo que más me preocupa es el cuello de botella que más limita: el disco. En esta caso el sistema operativo está montado en una ranura micro sd, así que medimos su rendimiento:
# hdparm -tT /dev/mmcblk0p2 Timing cached reads: 1822 MB in 2.00 seconds = 911.88 MB/sec Timing buffered disk reads: 130 MB in 3.01 seconds = 43.17 MB/sec
hay mucho que mejorar si comparamos con una medición sobre otro equipo que virtualiza con KVM sobre un ssd de gama media conectado por un bus SATA 2
# hdparm -tT /dev/vda1 Timing cached reads: 8012 MB in 2.00 seconds = 4009.17 MB/sec Timing buffered disk reads: 478 MB in 3.02 seconds = 158.43 MB/sec
Configurar la red en Ubuntu con netplan
Tras más de 20 años configurando la red en Linux editando el fichero /etc/network/interfaces desde Ubuntu 17.10 se debe usar netplan con ficheros en formato YAML.
Empezamos por editar el fichero:
# nano /etc/netplan/50-cloud-init.yaml
Para una red con IP dinámica adquirida por DHCP
network: version: 2 ethernets: eth0: optional: t rue dhcp4: true # add wifi setup information here ... wifis: wlan0:
dhcp4: true
optional: true access-points: your-wifi-ssid: password: your-wifi-password
Para establecer una IP fija
network: version: 2 ethernets: eth0: dhcp4: false addresses: [192.168.0.24/24] gateway4: 192.168.0.1 nameservers: addresses: [192.168.0.1]
Probar la configuración
# netplan --debug try
y si no hay errores la fijamos
# netplan --debug generate
Otra forma es aplicar la configuración directamente:
# netplan apply
Aunque los comandos de red bajo Linux se han modernizado, son muchos años fiel a ifconfig
, del paquete clásico de las net-tools que han obsoletizado
# apt install net-tools
además apunto una tabla de equivalencias con los comandos de iproute2 para ir acostumbrándome:
net-tools | iproute2 | |
---|---|---|
ifconfig | ip -s link, ip -s address | |
route | ip route | |
arp | ip neigh | |
nameif | ip link | |
ipmaddr | ip maddress | |
iptunnel | ip tunnel | |
netstat | ss, nstat |
Configurar un mail relay de Gmail con Postfix
Para que tu servidor pueda enviar correos desde la línea de comandos, la estrategia reside en configurar un mail ralay contra un servidor SMTP ya existente. Yo usaré una cuenta de GMail
# apt-get install -y mailutils
# nano /etc/postfix/main.cf
# nano /etc/postfix/sasl_passwd
# postmap /etc/postfix/sasl_passwd
# chown root:root /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
# chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
# cat /etc/ssl/certs/thawte_Primary_Root_CA.pem | sudo tee -a /etc/postfix/cacert.pem
$ echo "Mail de prueba" | mail -s "probando" user@domain.com
Instalar el servidor DNS dnsmasq
El servidor DNS preferido por las últimas versiones de Ubuntu es bind9, es muy completo pero complejo de configurar, sib embargo dnsmasq es un viejo conocido mio que se configura rápidamente.
# apt install dnsmasq
Para configurar los hosts mi LAN basta con declararlos sin jerarquías de dominios, editando
# nano /etc/hosts
y muy importante para usar desde las máuinas de la LAN es abrir en el firewall el puerto 53 por TCP y UDP
# ufw allow 53/tcp
# ufw allow 53/udp
Instalar servidor web Apache
# apt install apache2
# ufw allow http
# ufw allow https
Activamos los directorios de usuario, para que http://server/~user sirva páginas web por /home/user/public_html
# a2enmod userdir
Activamos el módulo de reescritura de URL y los que sean necesarios.
# a2enmod rewrite
y reiniciar el servicio
# systemctl restart apache2
Instalar MySQL server
# apt install mysql-server
# mysql_secure_installation
Instalar PHP
# apt install php libapache2-mod-php php-mysql
Con esto quedan habilitados los scripts PHP en el root del webserver. Probamos:
<?php
phpinfo();
?>
Desde el navegador web: http://servidor/index.php pero de forma predeterminada PHP está deshabilitado en los directorios de usuario sudo a2enmod userdir
Así que hay que editarel archivo de configuración web de PHP
# nano /etc/apache2/mods-available/php7.3.conf
comentar las líneas
# Running PHP scripts in user directories is disabled by default
#
# To re-enable PHP in user directories comment the following lines
# (from <IfModule ...> to </IfModule>.) Do NOT set it to On as it
# prevents .htaccess files from disabling it.
# <IfModule mod_userdir.c>
# <Directory /home/*/public_html>
# php_admin_flag engine Off
# </Directory>
# </IfModule>
y reiniciar el servicio de Apache
# service apache2 restart
<?php
phpinfo();
?>
Instalar el firewall
Uncomplicated Firewall Ubuntu
# apt install ufw
Activarlo # ufw enable
Abrir puertos conocidos # ufw allow ssh
Abrir puertos específicos (tcp o udp deben estibirse en minúsculas)
# ufw allow 1010/tcp
Permitir acceso sólo desde la LAN # ufw allow from 192.168.0.0/24
Comprobar el estado # ufw status numbered
Status: active
To Action From
-- ------ ----
[ 1] 80/tcp ALLOW IN Anywhere
[ 2] 22/tcp ALLOW IN Anywhere
[ 3] 53/udp ALLOW IN Anywhere
[ 4] 80/tcp (v6) ALLOW Anywhere (v6)
[ 5] 22/tcp (v6) ALLOW Anywhere (v6)
Y para eliminar reglas innecesarias debe hacerse por id
# ufw delete 5
Para más información sobre el firewall de Ubuntu y en help.ubuntu.com/community/UFW
Montar un disco SSD externo por USB 3.0
1. Localizar el disco recién conectado: # lshw -C disk
*-disk description: SCSI Disk vendor: SABRENT physical id: 0.0.0 bus info: scsi@0:0.0.0 logical name: /dev/sda version: 0204 serial: DB9876123456E size: 232GiB (250GB) capabilities: partitioned partitioned:dos configuration: ansiversion=6 logicalsectorsize=512 sectorsize=4096 signature=27e7f8ed
2. inicializar y particionar:
# fdisk /dev/sda
n (add a new partition)
p (primary)
1 (partition number)
w (write changes)
3. Formatear la partición:
# mkfs -t ext4 /dev/sda1
4. Eliminar el espacio reservado para el usuario root
# tune2fs -m 0 /dev/sda1
5. Crear el punto de montaje y montar la nueva partición
# mkdir /media/ssd250gb
# mount /dev/sdc1 /media/ssd250gb
Durante alguna de esta operaciones experimenté tiempos de espera exagerados y la consola mostraba un mensaje
SG_IO: bad/missing sense data, sb[]: 70 00 0b 00 00 00 00 0a 00
Que solucioné con el comando
# hdparm –security-disable NULL /dev/sda
6. Medir el rendimiento # sudo hdparm -tT /dev/sda1
Timing cached reads: 1866 MB in 2.00 seconds = 934.16 MB/sec Timing buffered disk reads: 672 MB in 3.01 seconds = 223.50 MB/
7. Registrarlo en fstab para que se monte al inicio del sistema
Averiguar el UUID del nuevo disco # blkid
/dev/sda1: UUID="11111111-ddddd-4444-fffff-333333333" TYPE="ext4" PARTUUID="27eeee1-01"
# nano /etc/fstab
podemos encontrarnos dos formatos de línea, si se apunta a la partición
UUID=11111111-ddddd-4444-fffff-333333333 /dev/sda1 ext4 defaults
Para más info sobre cómo utilizar fstab
8. Probamos la nueva configuración sin reiniciar # mount -a
9. El disco se montará al inicio del sistema