533 lines
12 KiB
Markdown
533 lines
12 KiB
Markdown
# 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.
|