2026-02-03 10:17:18 +01:00
2026-02-03 10:17:18 +01:00
2026-02-03 10:17:18 +01:00
2026-02-03 10:17:18 +01:00

VM Disk Export Script

Script bash per l'esportazione automatica di dischi da VM Linux verso server remoto tramite SSH, con compressione in tempo reale. Progettato per la migrazione da Tim Cloud Flex a ESXi.

📋 Indice


Caratteristiche

  • Rilevamento automatico dischi: Identifica automaticamente tutti i dischi fisici del sistema
  • Configurazione esterna: Credenziali e parametri in file separato
  • Compressione in tempo reale: Utilizza gzip per ridurre dimensioni e tempo di trasferimento
  • Progress bar: Monitoraggio avanzamento con pv (Pipe Viewer)
  • Verifiche di sicurezza: Controllo spazio, connettività SSH, permessi
  • Filtri intelligenti: Esclude automaticamente dispositivi virtuali, USB, CD-ROM
  • Export multiplo: Gestisce qualsiasi numero di dischi in una sola esecuzione
  • Output colorato: Interfaccia user-friendly con codici colore

📦 Requisiti

Sistema Operativo

  • Linux (testato su Debian/Ubuntu e CentOS/RHEL)
  • Accesso root o sudo

Software Necessario

Lo script installerà automaticamente le dipendenze mancanti:

  • pv (Pipe Viewer) - per progress bar
  • bc - per calcoli matematici
  • ssh - per trasferimento remoto
  • gzip - per compressione (solitamente preinstallato)

Server Remoto

  • Server SSH accessibile
  • Spazio disco sufficiente per i backup
  • Autenticazione SSH configurata (chiave pubblica raccomandata)

🚀 Installazione

1. Download dei file

Copia i seguenti file sulla VM da cui vuoi esportare i dischi:

exportdisk.sh
exportdisk.conf

2. Imposta i permessi

# Rendi eseguibile lo script
chmod +x exportdisk.sh

# Proteggi il file di configurazione (contiene credenziali)
chmod 600 exportdisk.conf

3. Configura l'autenticazione SSH

Per evitare di inserire la password ad ogni trasferimento:

# Genera chiave SSH (se non esiste)
ssh-keygen -t rsa -b 4096

# Copia la chiave sul server remoto
ssh-copy-id setapps@172.16.0.5

# Verifica la connessione
ssh setapps@172.16.0.5 "echo 'Connessione OK'"

⚙️ Configurazione

Modifica il file exportdisk.conf con i tuoi parametri:

# Configurazione Export Disk Script
# Tutti i campi sono obbligatori

# Credenziali SSH
REMOTE_USER="setapps"           # Username SSH sul server remoto
REMOTE_HOST="172.16.0.5"        # IP o hostname del server remoto
REMOTE_PATH="/home/setapps/backups"  # Directory di destinazione

# Filtri per il rilevamento automatico dischi
# Dispositivi da escludere (separati da |)
EXCLUDE_DEVICES="loop|sr|dm-"   # loop=loopback, sr=CD/DVD, dm=device mapper

# Dimensione minima disco in GB (per escludere dispositivi piccoli)
MIN_DISK_SIZE_GB=1              # Dischi sotto 1GB vengono ignorati

Parametri di Configurazione

Parametro Descrizione Esempio
REMOTE_USER Username per connessione SSH setapps
REMOTE_HOST IP o hostname del server 172.16.0.5
REMOTE_PATH Directory remota per i backup /home/setapps/backups
EXCLUDE_DEVICES Pattern regex per escludere dispositivi loop|sr|dm-
MIN_DISK_SIZE_GB Dimensione minima disco in GB 1

🎯 Utilizzo

Utilizzo Base

# Esegui con file di configurazione nella stessa directory
sudo ./exportdisk.sh

Utilizzo con Configurazione Personalizzata

# Specifica un file di configurazione diverso
sudo ./exportdisk.sh /percorso/al/mio/config.conf

Processo di Esecuzione

Lo script esegue i seguenti passaggi:

  1. Caricamento configurazione: Legge parametri da file .conf
  2. Rilevamento dischi: Identifica automaticamente i dischi da esportare
  3. Verifica dipendenze: Controlla e installa pv e bc se necessario
  4. Test connettività: Verifica connessione SSH al server remoto
  5. Controllo spazio: Verifica spazio disponibile su destinazione
  6. Preparazione directory: Crea directory backup se non esiste
  7. Export dischi: Esporta ogni disco con compressione e progress bar

📚 Esempi

Esempio 1: Export Standard

$ sudo ./exportdisk.sh

========================================
VM Disk Export Script
========================================

Caricamento configurazione da: ./exportdisk.conf
[1/6] Rilevamento dischi automatico...
  ✓ Rilevato: /dev/sda (50.00 GB)
  ✓ Rilevato: /dev/sdb (100.00 GB)

Dischi da esportare: 2
[2/6] Verifica dipendenze...
✓ Dipendenze OK

[3/6] Verifica connettività verso 172.16.0.5...
✓ Connessione SSH OK

[4/6] Verifica spazio disponibile su 172.16.0.5...
Spazio disponibile: 500 GB
✓ Spazio OK

[5/6] Preparazione directory remota...
✓ Directory pronta

[6/6] Esportazione dischi...

[1/2] Esportazione /dev/sda ...
sda: 12.5GiB 0:05:23 [39.6MiB/s] [=============>] 100%
✓ /dev/sda esportato con successo

[2/2] Esportazione /dev/sdb ...
sdb: 25.3GiB 0:10:47 [40.1MiB/s] [=============>] 100%
✓ /dev/sdb esportato con successo

========================================
Esportazione completata!
========================================

File creati su 172.16.0.5:
-rw-r--r-- 1 setapps setapps 13G Feb  3 10:30 sda_20260203_103045.img.gz
-rw-r--r-- 1 setapps setapps 26G Feb  3 10:41 sdb_20260203_103045.img.gz

Prossimi passi:
1. Decomprimere i file sul server remoto:
   gunzip /home/setapps/backups/sda_20260203_103045.img.gz
   gunzip /home/setapps/backups/sdb_20260203_103045.img.gz

2. Convertire in VMDK:
   qemu-img convert -O vmdk sda_20260203_103045.img sda.vmdk -p
   qemu-img convert -O vmdk sdb_20260203_103045.img sdb.vmdk -p

3. Trasferire su ESXi e importare la VM

Esempio 2: Configurazione per Ambiente Multiplo

Puoi creare configurazioni diverse per ambienti diversi:

# Produzione
sudo ./exportdisk.sh /etc/exportdisk/prod.conf

# Staging
sudo ./exportdisk.sh /etc/exportdisk/staging.conf

# Test
sudo ./exportdisk.sh /etc/exportdisk/test.conf

Esempio 3: Post-Processing sul Server Remoto

Dopo l'export, sul server remoto:

# Accedi al server
ssh setapps@172.16.0.5

# Vai nella directory backup
cd /home/setapps/backups

# Decomprimi i file
gunzip sda_20260203_103045.img.gz
gunzip sdb_20260203_103045.img.gz

# Converti in formato VMDK per ESXi
qemu-img convert -O vmdk sda_20260203_103045.img sda.vmdk -p
qemu-img convert -O vmdk sdb_20260203_103045.img sdb.vmdk -p

# Crea il descriptor VMDK (opzionale, per compatibilità)
cat > sda.vmdk << 'EOF'
# Disk DescriptorFile
version=1
CID=fffffffe
parentCID=ffffffff
createType="monolithicSparse"
EOF

🔧 Opzioni Avanzate

Modifica Filtri Dispositivi

Per includere/escludere dispositivi specifici, modifica EXCLUDE_DEVICES:

# Esclude solo loop e sr
EXCLUDE_DEVICES="loop|sr"

# Esclude anche nvme
EXCLUDE_DEVICES="loop|sr|dm-|nvme"

# Non esclude nulla (attenzione!)
EXCLUDE_DEVICES=""

Modifica Dimensione Minima Disco

# Considera solo dischi > 10GB
MIN_DISK_SIZE_GB=10

# Considera tutti i dischi
MIN_DISK_SIZE_GB=0

Modifica Livello di Compressione

Nel file exportdisk.sh, puoi modificare il livello di compressione gzip:

# Compressione veloce (livello 1 - default)
gzip -1

# Compressione bilanciata (livello 6)
gzip -6

# Compressione massima (livello 9 - più lento)
gzip -9

Modifica Block Size

Per dischi molto grandi, puoi aumentare il block size:

# Default
dd if="$disk" bs=16M ...

# Per performance migliori su dischi grandi
dd if="$disk" bs=32M ...
dd if="$disk" bs=64M ...

🐛 Troubleshooting

Problema: "File di configurazione non trovato"

Soluzione:

# Verifica che il file esista
ls -la exportdisk.conf

# Specifica il percorso completo
sudo ./exportdisk.sh /percorso/completo/exportdisk.conf

Problema: "Impossibile connettersi via SSH"

Causa: Chiave SSH non configurata o firewall

Soluzione:

# Verifica connettività
ping -c 3 172.16.0.5

# Verifica SSH
ssh -v setapps@172.16.0.5

# Configura chiave SSH
ssh-copy-id setapps@172.16.0.5

Problema: "Nessun disco rilevato"

Causa: Filtri troppo restrittivi o MIN_DISK_SIZE_GB troppo alto

Soluzione:

# Verifica dischi disponibili manualmente
lsblk -d -o NAME,SIZE,TYPE

# Modifica configurazione
MIN_DISK_SIZE_GB=0
EXCLUDE_DEVICES="loop|sr"

Problema: "Spazio insufficiente"

Soluzione:

# Sul server remoto, libera spazio
ssh setapps@172.16.0.5 "df -h"
ssh setapps@172.16.0.5 "du -sh /home/setapps/backups/*"

# Elimina backup vecchi
ssh setapps@172.16.0.5 "rm /home/setapps/backups/old_backup_*"

Problema: "Permission denied"

Soluzione:

# Assicurati di eseguire come root
sudo ./exportdisk.sh

# Verifica permessi file
ls -la exportdisk.sh
chmod +x exportdisk.sh

Problema: Export si interrompe

Causa: Disco con settori danneggiati

Soluzione: Lo script usa conv=sync,noerror in dd che continua anche con errori. Controlla i log del sistema:

dmesg | grep -i error
journalctl -xe | grep -i disk

🔒 Note di Sicurezza

Protezione File di Configurazione

Il file exportdisk.conf contiene credenziali sensibili:

# Imposta permessi restrittivi (solo root può leggere)
chmod 600 exportdisk.conf
chown root:root exportdisk.conf

Autenticazione SSH

Raccomandato: Usa chiavi SSH invece di password

# Genera chiave con passphrase
ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa_backup

# Specifica la chiave nel file config SSH
cat >> ~/.ssh/config << 'EOF'
Host backup-server
    HostName 172.16.0.5
    User setapps
    IdentityFile ~/.ssh/id_rsa_backup
EOF

Crittografia Aggiuntiva

Per dati sensibili, aggiungi crittografia oltre a gzip:

# Modifica lo script per usare gpg
gzip -1 | gpg --symmetric --cipher-algo AES256 | ssh ...

Logging

Salva un log delle operazioni:

sudo ./exportdisk.sh 2>&1 | tee export_$(date +%Y%m%d_%H%M%S).log

Network Security

  • Usa VPN o rete privata per i trasferimenti
  • Considera l'uso di SSH su porta non standard
  • Implementa fail2ban sul server remoto

FAQ

D: Quanto tempo impiega l'export?

R: Dipende da:

  • Dimensione dischi
  • Velocità rete
  • Carico I/O del sistema
  • Livello compressione

Stima approssimativa: 40-50 MB/s → ~30 minuti per 100GB

D: Posso eseguire lo script senza essere root?

R: No, serve accesso root per leggere i dispositivi /dev/sdX

D: Lo script funziona con NVMe?

R: Sì, ma assicurati che EXCLUDE_DEVICES non contenga "nvme"

D: Posso exportare su disco locale invece che remoto?

R: Sì, modifica la parte SSH dello script:

# Invece di SSH, usa redirect locale
gzip -1 > /percorso/locale/disk_${TIMESTAMP}.img.gz

D: Come verifico l'integrità dei file esportati?

R: Usa checksum:

# Prima dell'export (sulla VM)
md5sum /dev/sda > sda.md5

# Dopo l'import (sul server)
gunzip -c sda_20260203_103045.img.gz | md5sum

D: Posso fare export incrementali?

R: Questo script fa export completo. Per incrementali considera:

  • rsync per filesystem montati
  • Strumenti di backup dedicati (Bacula, Amanda, etc.)

D: Supporta dischi > 2TB?

R: Sì, dd e blockdev supportano dischi di qualsiasi dimensione


📄 License

Script fornito "as-is" per scopi di migrazione VM.

🤝 Supporto

Per problemi o suggerimenti, verifica:

  1. Questo README
  2. Log di sistema (journalctl, dmesg)
  3. Output verbose SSH (ssh -vvv)

📝 Changelog

Versione 2.0 (Corrente)

  • Rilevamento automatico dischi
  • File di configurazione esterno
  • Supporto multi-disco
  • 🐛 Fix gestione errori
  • 📚 Documentazione completa

Versione 1.0

  • Export manuale sda/sdb
  • Configurazione hardcoded

Nota: Questo script è progettato per migrazioni one-time. Per backup regolari, considera soluzioni dedicate come Veeam, Bacula, o snapshot a livello hypervisor.

Description
No description provided
Readme 44 KiB
Languages
Shell 100%