rootfs sobre NFS con tu raspberry con Ubuntu 20.04 o Raspberry Pi OS

En este procedimiento voy a desarrollar es para instalar Ubuntu 20.04 / Raspberry Pi OS en una Raspberry en forma híbrida, el /boot en la MicroSD y el / (rootfs) va a ser accedido desde un NFS.

Esto tiene como ventaja evitar usar la MicroSD como / acortando la vida útil de la misma o evitarnos el trastorno de poner un disco USB que incrementa el tamaño de la solución.

Esta claro que en este caso necesitamos disponer de un servidor o nas que nos provea el servicio de NFS para el rootfs.

Preparación de entorno:

Lo primera acción a realizar es bajar la imagen de Ubuntu 20.04 para Raspberry desde la página oficial (recomiendo al versión de 64bit link) o Raspberry Pi OS (en este momento la versión 32bit es la única estable link). y una vez finalizada la misma, procedemos a descomprimirla.

En el ejemplo la descarga la hice en el /tmp

cd /tmp

Descomprimir Ubuntu 20.04:

unxz ubuntu-20.04-preinstalled-server-arm64+raspi.img.xz

Descomprimir Raspberry Pi OS:

unzip 2020-05-27-raspios-buster-lite-armhf.zip

En cada caso adecuar el nombre del archivo ne base a la versión que se haya descargado.

Y una vez finalizada la descompresión voy a proceder a montar la imagen para copiar y armar el boot y el / que vamos a utilizar.

Para eso utilizamos la utilidad losetup que nos crea una unidad /dev/loop0 (si ya hay una unidad montada en el loopX lo hará con el siguiente disponible, lo muestra en la salida del comando) con dos particiones, /dev/loop0p1 y /dev/loop0p2 que corresponden al boot y al / respectivamente.

sudo losetup -P -f --show ./ubuntu-20.04-preinstalled-server-arm64+raspi.img
Captura de pantalla de la ejecución del comando losetup.

Creando el FS de Origen:

El siguiente paso es montar la partición / de la imagen para copiarla a la ubicación donde va a ser provista por el servidor NFS.

Acá algunas observaciones:

  • El /mnt/storage es una unidad de un nas que me va a proveer el servicio de NFS. Voy a documentar el procedimiento de como configurar un servidor NFS en Ubuntu en breve.
  • Como voy a tener varias raspberries funcionando así, quiero tener una copia del Ubuntu Base y una imagen para pegar el boot en la MicroSD, con esto voy a tener un punto de partida para futuras instalaciones.
mkdir -p /tmp/imgP2
sudo mount /dev/loop0p2 /tmp/imgP2/
sudo mkdir -p /mnt/storage/rbpi-nfs/base-ub-2004-rootfs
sudo rsync -avz ./imgP2/ /mnt/storage/rbpi-nfs/base-ub-2004-rootfs

El comando rsync va a demandar unos minutos. En caso de que no lo tengas instalado en esta página tenes el set de aplicaciones/utilidades que considero «obligatorias».

Yo arme un directorio con rootfs para Ubuntu 20.04 y otro para Raspberry Pi OS, como tengo varios dispositivos y los uso como laboratorio opte por conservar estos directorios y conservarlos para no tener que repetir todos estos pasos para cada instalación.

Finalizada la copia voy a proceder a desmontar la partición y desacoplar la imagen del sistema.

sudo umount /tmp/imgP2
sudo losetup -d /dev/loop0

Creando la imagen para la MicroSD:

El siguiente paso es crear una imagen para volcar a la MicroSD que solo tenga el /boot. Para ejecutar esta acción primero vamos a utilizar el comando «parted» a fin de obtener información de las particiones de la imagen original.

sudo parted ./ubuntu-20.04-preinstalled-server-arm64+raspi.img

En la consola de «parted» ejecutar los comandos delante del #

u     #cambiar tipo de unidad de medida
b     #Configurar unidad en bytes
p     #Listar particiones
rm 2  #Borrar partición 2 (ya habíamos copiado el contenido).
quit  #Salir de parted
Captura de pantalla de la ejecución del comando «parted» sobre la imagen de Ubuntu 20.04 para Raspberry 4

El valor que tomamos es donde termina la primer partición. En este caso «269484031», procedemos a continuación a generar el archivo img del boot en forma estricta. Si estas haciendo el procedimiento para Raspberry Pi OS debes adecuar los nombres y el tamaño del bloque que vamos a tomar.

sudo dd if=./ubuntu-20.04-preinstalled-server-arm64+raspi.img of=./base-ub-2004-boot.img bs=269484031 count=1

Finalizado esto procedo a hacer una copia a la carpeta donde deje los directorios con las fuentes para las nuevas instalaciones.

mv *boot.img /mnt/storage/rbpi-nfs/

En el estado final mi unidad quedo con dos archivos .img y dos directorios con los rootsfs uno de cada para distribución.

Listado de archivos con los elementos creados como base para las próximas instalaciones.

Configurando la microsd y el entorno para tener el rootfs en el NFS.

Ahora nos falta poner una MicroSD y volcar la información del /boot en la tarjeta. En este caso mi MicroSD es el dispositivo /dev/sdb (revisar y estar seguro que es el mismo en el caso de ustedes, caso contrario adecuar porque sino van a romper algo).

sudo dd if=/mnt/storage/rbpi-nfs/base-ub-2004-boot.img of=/dev/sdb bs=4M status=progress

Adecuar la ruta al origen donde estén las imágenes de ustedes, en este caso volqué la imagen de Ubuntu 20.04 que habíamos creado.

Como el /boot que volcamos es original, ahora debemos adecuarlo para que tome el rootfs (/) del compartido NFS. Para eso lo montamos y editamos el archivo «cmdline.txt».

mkdir -p /tmp/sdb1
sudo mount /dev/sdb1 /tmp/sdb1
cd /tmp/sdb1
sudo vi cmdline.txt

Y modificar la única linea el sector en negrita, este paso difiere un poco en caso de que estemos trabajando con Ubuntu o Raspberry Pi OS, así que abro el procedimiento según lo que estemos haciendo.

UBUNTU configurando cmdline.txt:

Antes:

net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=LABEL=writable rootfstype=ext4 elevator=deadline rootwait fixrtc

Después:

net.ifnames=0 dwc_otg.lpm_enable=0 console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=10.0.0.9:/rbpi4-001-ub-2004 rw ip=dhcp rootfstype=nfs elevator=deadline rootwait fixrtc

Donde 10.0.0.9 es la ip de mi nas y /rbpi4-001-ub-2004 la ruta que configuré del recurso NFS.

Raspberry Pi OS CONFIGURANDO CMDLINE.TXT:

Antes:

console=serial0,115200 console=tty1 root=PARTUUID=2fed7fee-02 rootfstype=ext4 elevator=deadline fsck.repair=yes rootwait quiet init=/usr/lib/raspi-config/init_resize.sh

Después:

console=serial0,115200 console=tty1 root=/dev/nfs nfsroot=10.0.0.9:/rbpi3-001-raspios-buster rw ip=dhcp rootfstype=nfs elevator=deadline rootwait

En este caso es mi Raspberry PI 3 001, entonces la imagen que arme para la misma se llama rbpi3-001-raspios-buster.

Ubuntu y Raspberry Pi OS:

Si queremos que el ssh este activo cuando inicie el sistema debemos crear el archivo ssh en la partición de nuestra MicroSD.

sudo touch /tmp/sdb1/ssh

Ahora procedo a crear el rootfs para la raspberry en el storage del nas que provee el NFS. Esto lo hago clonando la estructura que había copiado de la partición 2 de la imagen (recuerden que quiero conservar la instalación base). A

sudo rsync -avz /mnt/storage/rbpi-nfs/base-ub-2004-root/ /mnt/storage/rbpi-nfs/rbpi4-001-ub-2004

Ahora debemos adecuar el archivo fstab que va a montar. En mi infraestructura todos los directorios con rootfs estan en ‘/mnt/storage/rbpi-nfs/’, en el ejemplo configuro para mi rbpi4-001

sudo vi /mnt/storage/rbpi-nfs/rbpi4-001-ub-2004/etc/fstab

EN UBUNTU 20.04:

Antes:

LABEL=writable / ext4 defaults 0 0
LABEL=system-boot /boot/firmware vfat defaults 0 1

Después:

#LABEL=writable / ext4 defaults 0 0
LABEL=system-boot /boot/firmware vfat defaults 0 1
none /tmp tmpfs defaults 0 0
none /var/run tmpfs defaults 0 0
none /var/lock tmpfs defaults 0 0
none /var/tmp tmpfs defaults 0 0

EN RASPBERRY PI OS:

Antes:

proc /proc proc defaults 0 0
PARTUUID=2fed7fee-01 /boot vfat defaults 0 2
PARTUUID=2fed7fee-02 / ext4 defaults,noatime 0 1

Después:

proc /proc proc defaults 0 0
PARTUUID=2fed7fee-01 /boot vfat defaults 0 2
#PARTUUID=2fed7fee-02 / ext4 defaults,noatime 0 1
none /tmp tmpfs defaults 0 0
none /var/run tmpfs defaults 0 0
none /var/lock tmpfs defaults 0 0
none /var/tmp tmpfs defaults 0 0

UBUNTU Y RASPBERRY PI OS:

Para poder ingresar por ssh en forma remota incorporo la llave de mi usuario en equipo en el autorized_keys del root. De esta forma puedo borrar el usuario por defecto en forma remota.

cat ~/.ssh/id_rsa.pub | sudo tee -a /mnt/storage/rbpi-nfs/rbpi4-001-ub-2004/root/.ssh/authorized_keys

Finalizado este paso podemos desmontar la MicroSD y armar la Raspberry.

Si tenemos mouse y teclado en la raspberry:

Ponemos ingresar a la Raspberry con el usuario y contraseña por defecto de la instalación ( ubuntu:ubuntu).

El siguiente paso es definir una contraseña del usuario root para poder reemplazar el usuario por defecto y usar uno personalizado:

sudo su -
passwd

Si estamos haciendo una instalación «headless»:

Para podes descubrir que dispositivos están conectados en la red se puede ejecutar el siguiente comando y obtener la lista de elementos conectados a la red. Donde la red 10.0.0.0/24 es la red de mi casa.

sudo nmap -sP 10.0.0.0/24
Captura de pantalla de la ejecución de nmap

Ubicada la ip de la instalación debemos ingresar al equipo, como root al (solo vamos a poder ingresar desde el equipo donde copiamos la llave pública de ssh).

ssh root@10.0.0.121

Una vez dentro del equipo, lo primero que vamos a hacer es desinstalar snapd porque falla al estar el root montado por NFS.

Ahora seguimos con los pasos en común.

Renombre de usuario por defecto:

Ya que entramos como root, vamos a cambiar el usuario «ubuntu» / «pi» por uno de uso personal. Esto lo hacemos ejecutando los siguientes comandos:

usermod -md /home/NuevoUsuario -l NuevoUsuario ubuntu
usermod -c "Nuevo nombre apellido" NuevoUsuario
groupmod -n NuevoUsuario ubuntu

También podemos proceder a cambiar al contraseña del nuevo usuario, esto se realiza ejecutando el comando:

pwd NuevoUsuario

Salimos del sistema e ingresamos con el nuevo usuario definido en el paso anterior.

En Ubuntu, Remoción de snapd

Le dediqué varias horas de trabajo y no pude resolver el problema ni documentación para el esquema en el que lo quiero usar, por ahora no encontré nada crítico que no esté empaquetado como .deb.

sudo apt remove snapd

Necesitamos configurar el perfil base de apparmor para que permita que los servicios accedan a unidades de red donde se encuentran ahora todos los elementos

echo ' network inet,' | sudo tee -a /etc/apparmor.d/abstractions/base
echo ' network inet6,' | sudo tee -a /etc/apparmor.d/abstractions/base
sudo systemctl restart apparmor.service
sudo systemctl status apparmor.service
Captura de pantalla con el estado de servicio de apparmor post configuración.

En Raspberry PI OS, remoción de swap:

Raspberry PI OS viene preconfigurado por defecto con una swap en un archivo virtual. No es recomendable la utilización del mismo sobre NFS y el proceso de creación del archivo falla. Tome la determinación de remover la swap directamente.

sudo dphys-swapfile swapoff && \
sudo dphys-swapfile uninstall && \
sudo systemctl disable dphys-swapfile && \
sudo apt purge dphys-swapfile

En Raspberry PI OS

Tenemos que deshabilitar el proceso que quiere ampliar el tamaño del rootfs para que ocupe toda la MicroSD, como estamos usando NFS este proceso da error.

sudo systemctl disable resize2fs_once

Instalación de cliente ntp

Esto nos permite tener el equipo siempre en hora sincronizado con el pool de servidores de «ntp.ubuntu.com»

sudo apt install ntpsec

CONFIGURACIÓN DE ZONA HORARIA:

Por defecto Ubuntu / RaspiOS vienen configurados en GTM 0. Esto discrepa con la configuración regional de mi residencia.

sudo dpkg-reconfigure tzdata
Configuración tzdata para uso horario pantalla 1 de 2.
Configuración tzdata para uso horario pantalla 2 de 2.

Con estos paso ya tenemos el sistema en fecha y mostrando la hora local.

Configuración de hostname / nombre de servidor:

Para que nos muestre el prompt el nombre que le asignamos al equipo. Para que impacte el cambio debemos salir y volver a entrar al equipo.

hostnamectl set-hostname rbpi4-001

Verificación de configuración del rootfs sobre NFS:

Ejecutando el comando «mount» y la sentencia «cat /etc/fstab» podemos verificar que el sistema montó el sistema de archivos root sobre el servicio de NFS.

Captura de pantalla de la salida del comando «mount» y la salida del «cat /etc/fstab» donde se muestra la configuración de los puntos de montaje del sistema.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.