====== GNU/Linux Bare Metal Restore ======
Appunti vari su come recuperare un host che sia andato completamente perso a partire da un backup, cioè come effettuare un **//bare metal restore//**.
===== Partizionamento del disco =====
In generale si dovrà avere una macchina nuova con un disco vuoto su cui effettuare il restore. È possibile contestualmente aggiornare una macchina con disco partizionato col metodo obsoleto **DOS/MBR** e un **BIOS legacy** ad una installazione con disco partizionato **GPT** e boot **EFI**.
Dopo aver avviato la macchina con una distribuzione live moderna (es. **[[https://grml.org/|GRML 2022]]**), si esegue il partizionamento con **parted**:
parted /dev/sda
Uno schema standard con partizioni per GRUB, una per le immagini EFI e partizioni separate per **rootfs**, **swap**, **var** e **home** viene realizzato come segue:
mklabel gpt
mkpart primary 1.0MB 10.0MB
mkpart primary 10.0MB 100.0MB
mkpart primary 100.0MB 60.0GB
mkpart primary 60.0GB 68.0GB
mkpart primary 68.0GB 200.0GB
mkpart primary 200.0GB 100%
set 1 bios_grub on
set 2 boot on
set 2 esp on
name 3 rootfs
name 4 swap
name 5 var
name 6 home
La partizione **bios_grub** deve contenere solo il secondo stadio di GRUB, quindi 1 Mb sarebbe già sufficiente, ma si allocano **10 Mb** per consentire a ''parted'' di calcolare un corretto allineamento della partizione. La partizione **boot esp** contiene invece il codice EFI per i vari sistemi operativi installati (in caso di sistemi multiboot); un solo sistema operativo GNU/Linux Debian 11 richiede un BIOS EFI di circa 6 Mb, ma con i moderni dischi da più di un Gigabyte si consiglia di allocare **100 Mb**.
===== Restore da Borg Backup =====
Se si utilizza **Borg backup** per effettuare le copie di sicurezza è necessario eseguire il restore dell'ultima versione disponibile.
FIXME
===== Copiare una directory da host remoto =====
Se i file originali sono contenuti semplicemente in una directory di un host remoto è possibile copiarli, ma si devono avere alcune accortezze. Ad esempio **scp** non va bene perché segue i link simbolici (cioè copia i file e non ricrea i link).
Se si desidera copiare una directory da un host remoto **mantenendo i symlink** si può ricorrere ad un trucco che utilizza **tar**. In questo esempio si esegue ssh dalla macchina vuota verso l'host che contiene i dati, quindi è possibile trasferire con tar una intera cartella:
cd /
ssh root@backup.server.org 'cd /home/backups/restore/; tar cf - bin' | tar xvf - --numeric-owner
Vedere come si può usare **rsync** FIXME
===== MySQL =====
Si deve creare la data directory, assegnare i permessi opportuni e inizializzarla (testato con MariaDB 10.5 su Debian 11 Bullseye):
mkdir /var/lib/mysql
chown mysql.mysql /var/lib/mysql/
chmod 700 /var/lib/mysql/
mysql_install_db
systemctl start mysql
Quindi è possibile fare il restore del file creato con **%%mysqldump --all-databases%%**:
zcat /home/backups/mysql/20230205.dump.gz | mysql
===== PostgreSQL =====
Se la data directory è completamente vuota bisogna crearla con i permessi giusti:
mkdir -p /var/lib/postgresql/13/main
mkdir -p /var/log/postgresql/
chown -R postgres.postgres /var/lib/postgresql/
chown -R postgres.postgres /var/log/postgresql/
chown -R postgres.postgres /etc/postgresql/
Quindi va inizializzata:
su - postgres
/usr/lib/postgresql/13/bin/initdb -D /var/lib/postgresql/13/main
A questo punto è possibile avviare il servizio:
systemctl start postgresql@13-main
E fare il restore del file creato con **pg_dumpall**:
su - postgres
psql --file=pg_dumpall_20230206.dump