iTank ideas

Raspberry Pi 4 model B como servidor LAMP con Ubuntu Server 18.04 LTS

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:

  1. Descargar Ubuntu Server como imagen preconfigurada para Raspberry Pi
  2. Volcarla en la micro SD empleando por ejemplo Win32 Disk Imager
  3. Introducir la micro SD en la ranura de la Raspberry Pi.
  4. Para conectar con la consola de la Raspberry Pi usé un adaptador de USB a puerto serie
  5. Por fin arrancamos el sistema.
  6. Si tenemos acceso al servidor DHCP para conocer la IP asignada podemos saltarnos el paso 4 y conectar mediante SSH.
  7. 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:

  1. .bash_profile
  2. .bash_login
  3. .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:

# nano /var/www/html/info.php

<?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

Más info https://wiki.ubuntu.com/UserDirectoryPHP
info.php
<?php
phpinfo();
?>

 


Instalar el firewall

Uncomplicated Firewall Ubuntu

Nada más sencillo de instalar

# 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