# 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](#caratteristiche) - [Requisiti](#requisiti) - [Installazione](#installazione) - [Configurazione](#configurazione) - [Utilizzo](#utilizzo) - [Esempi](#esempi) - [Opzioni Avanzate](#opzioni-avanzate) - [Troubleshooting](#troubleshooting) - [Note di Sicurezza](#note-di-sicurezza) - [FAQ](#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 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: ```bash exportdisk.sh exportdisk.conf ``` ### 2. Imposta i permessi ```bash # 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: ```bash # 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: ```bash # 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 ```bash # Esegui con file di configurazione nella stessa directory sudo ./exportdisk.sh ``` ### Utilizzo con Configurazione Personalizzata ```bash # 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 ```bash $ 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: ```bash # 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: ```bash # 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`: ```bash # 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 ```bash # 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: ```bash # 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: ```bash # 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:** ```bash # 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:** ```bash # 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:** ```bash # 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:** ```bash # 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:** ```bash # 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: ```bash dmesg | grep -i error journalctl -xe | grep -i disk ``` --- ## 🔒 Note di Sicurezza ### Protezione File di Configurazione Il file `exportdisk.conf` contiene credenziali sensibili: ```bash # 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 ```bash # 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: ```bash # Modifica lo script per usare gpg gzip -1 | gpg --symmetric --cipher-algo AES256 | ssh ... ``` ### Logging Salva un log delle operazioni: ```bash 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: ```bash # 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: ```bash # 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.