En aquest xicotet article explique com he pogut solventar un problema que vaig tindre la setmana passada al meu servidor FreeBSD 13 en la Raspberry Pi 4.
Al servidor FreeBSD 13 de la Raspberry Pi 4 amb 8GB de RAM tinc uns quants projectes web amb Drupal corrent sobre bases de dades MariaDB i PHP 8.2. I per tal d'alliberar memòria tinc programat cada nit un reinici, i jo no sé perquè però entre el dijous i el divendres FreeBSD 13 no arrencava el servei SSH ni les webs.
Vaig connectar el cable HDMI a la Raspberry Pi 4 per a veure què passava i durant l'arranc el sistema em mostrava l'error WARNING: / was not properly dismounted i es quedava congelat.
Intentava trobar alguna alternativa des de l'arranc de U-BOOT, però no hi ha manera d'executar fsck per netejar el sistema de fitxer ni res:
Vaig llevar la microSD de la Raspberry i la vaig muntar en un altre ordinador amb FreeBSD per tal d'analitzar la tarjeta (que apareix en el dispositiu /dev/da0) i vaig veure dues particions, una de 50M i una altra gran amb tots els directoris que penjen de l'arrel del sistema opeartiu (/):
# gpart show /dev/da0
=> 63 244481985 da0 MBR (117G)
63 1985 - free - (993K)
2048 102400 1 fat32lba [active] (50M)
104448 124626944 2 freebsd (59G)
124731392 119750656 - free - (57G)
Com que tinc automount al FreeBSD de l'ordinador, em va muntar aquestes dues parcions a /media/da0s1 i la segona més gran a /media/da0s2a:
Si volem saber el tipus de sistema de fitxers de la partició, podem fer fstyp.
# fstyp /dev/da0s1
msdosfs
Doncs bé, com que pensava que el problema de corrupció del sistema de fitxers estaria en la partició gran on es trobaven totes les dades del sistema operatiu, les webs, les bases de dades, etc, vaig poder fer un fsck a la segona partició gran amb:
fsck -y /media/da0s2a
I es va fer ràpidament:
EL PROBLEMA
Però a la primera partició /dev/da0s1, la de 50Mb, em donava error. Podia muntar-la i escriure curiosament, però no arrencava FreeBSD a la Raspberry i al fer fsck em mostrava el següent error:
# fsck -y /dev/da0s1
** /dev/da0s1 (NO WRITE)
** Phase 1 - Read FAT and checking connectivity
** Phase 2 - Checking Directories
** Phase 3 - Checking for Lost Files
92 files, 25 MiB free (6508 clusters)
MARK FILE SYSTEM CLEAN? no
.
***** FILE SYSTEM IS LEFT MARKED AS DIRTY *****
Per si no tenia ben muntada aquesta partició i no estava en mode escriptura, la vaig desmuntar (perquè l'havia muntat automàticament automount) i la vaig muntar manualment en mode escriptura i lectura (-o rw) per tal de poder escriure canvis i fer un fdisk:
mount -t msdosfs -o rw /dev/da0s1 /media/da0s1
Però no, seguia dient-me que el sistema de fitxers no estava net.
Després vaig fer una còpia de seguretat de la partició en una imatge:
dd if=/dev/da0s1 of=/home/joan/particio_da0s1.img bs=1M conv=sync status=progress
També es podria fer més fàcilment amb la utilitat safecopy:
safecopy /dev/da0s1 /home/joan/particio.img
I ara em vaig crear un disc virtual amb mdconfig:
mdconfig -f /home/joan/particio.img -u 0
I ara el vaig muntar en /media/md0 per tal d'intentar netejar-ho amb fsck i veure si el problema estava en les dades o en la pròpia MicroSD:
mount -t msdosfs /dev/md0 /media/md0
Però al fer el fsck seguia dient-me que no estava net. Aleshores, estava clar que el problema estava en les dades, no en la MicroSD.
LA SOLUCIÓ
Aleshores estava convençut de que anava a perdre els canvis des del dijous i hauria de recuperar el sistema agafant una altra MicroSD que tinc clonada com a còpia de seguretat completa i refer manualment els canvis. Però vaig pensar un truquet. Vaig pensar en clonar nomès la primera partició de 50Mb de la Raspberry Pi 4 del mes passat funcionant en la partició de 50Mb d'aquesta nova MicroSD que per algun motiu no arrencava.
Vaig agafar la MicroSD de desembre 2023 en l'ordinador amb FreeBSD i vaig clonar /dev/da0s1 així:
dd if=/dev/da0s1 of=/home/joan/particio_da0s1.img bs=1M conv=sync status=progress
Ara vaig tornar a ficar la MicroSD amb el problema d'arranc i vaig cremar la imatge "particio_da0s1.img" en la partició /dev/da0s1 d'aquesta microSD:
dd if=/home/joan/particio_da0s1.img of=/dev/da0s1 bs=1M conv=sync status=progress
I ara vaig tornar a ficar aquesta MicroSD a la Raspberry Pi 4 i ja va arrencar sense problemes, va agafar la IP i va alçar tots els serveis amb normalitat (SSH, MariaDB, Nginx, etc..).