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
- Requisiti
- Installazione
- Configurazione
- Utilizzo
- Esempi
- Opzioni Avanzate
- Troubleshooting
- Note di Sicurezza
- FAQ
✨ 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 barbc- per calcoli matematicissh- per trasferimento remotogzip- 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:
- Caricamento configurazione: Legge parametri da file .conf
- Rilevamento dischi: Identifica automaticamente i dischi da esportare
- Verifica dipendenze: Controlla e installa pv e bc se necessario
- Test connettività: Verifica connessione SSH al server remoto
- Controllo spazio: Verifica spazio disponibile su destinazione
- Preparazione directory: Crea directory backup se non esiste
- 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:
- Questo README
- Log di sistema (
journalctl,dmesg) - 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.