#!/bin/bash # # VM Export Script - Tim Cloud Flex to ESXi Migration # Rileva automaticamente i dischi e li esporta verso server remoto # set -e # Exit on error # File di configurazione CONFIG_FILE="${1:-./exportdisk.conf}" # Verifica esistenza file di configurazione if [[ ! -f "$CONFIG_FILE" ]]; then echo "Errore: File di configurazione non trovato: $CONFIG_FILE" echo "Uso: $0 [percorso-config-file]" echo "Se non specificato, cerca ./exportdisk.conf" exit 1 fi # Carica configurazione echo "Caricamento configurazione da: $CONFIG_FILE" source "$CONFIG_FILE" # Verifica parametri obbligatori if [[ -z "$REMOTE_USER" ]] || [[ -z "$REMOTE_HOST" ]] || [[ -z "$REMOTE_PATH" ]]; then echo "Errore: Parametri obbligatori mancanti nel file di configurazione" echo "Richiesti: REMOTE_USER, REMOTE_HOST, REMOTE_PATH" exit 1 fi # Imposta valori di default se non specificati EXCLUDE_DEVICES="${EXCLUDE_DEVICES:-loop|sr|dm-}" MIN_DISK_SIZE_GB="${MIN_DISK_SIZE_GB:-1}" TIMESTAMP=$(date +%Y%m%d_%H%M%S) # Colori per output RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}VM Disk Export Script${NC}" echo -e "${GREEN}========================================${NC}" echo "" # Verifica se eseguito come root if [[ $EUID -ne 0 ]]; then echo -e "${RED}Questo script deve essere eseguito come root${NC}" exit 1 fi # Rileva i dischi DISKS=($(detect_disks | grep "^/dev/" || echo "")) # Verifica se pv è installato echo -e "${YELLOW}[2/6] Verifica dipendenze...${NC}" if ! command -v pv &> /dev/null; then echo -e "${YELLOW}pv (Pipe Viewer) non è installato. Installazione in corso...${NC}" apt-get update -qq && apt-get install -y pv || yum install -y pv || { echo -e "${RED}Impossibile installare pv. Installa manualmente: apt-get install pv${NC}" exit 1 } fi # Verifica bc per i calcoli if ! command -v bc &> /dev/null; then echo -e "${YELLOW}bc non è installato. Installazione in corso...${NC}" apt-get update -qq && apt-get install -y bc || yum install -y bc || { echo -e "${RED}Impossibile installare bc. Installa manualmente: apt-get install bc${NC}" exit 1 } fi echo -e "${GREEN}✓ Dipendenze OK${NC}" echo "" # Verifica connettività SSH echo -e "${YELLOW}[3/6_name" | grep -qE "$EXCLUDE_DEVICES"; then continue fi # Verifica se il disco è removibile (esclude USB, ecc.) if [[ -f "$device/removable" ]] && [[ $(cat "$device/removable") -eq 1 ]]; then continue fi # Ottieni dimensione del disco if [[ -f "$device/size" ]]; then sectors=$(cat "$device/size") # Calcola dimensione in GB (settori * 512 byte / 1024^3) size_gb=$(awk "BEGIN {printf \"%.2f\", $sectors * 512 / 1024 / 1024 / 1024}") # Verifica dimensione minima if (( $(echo "$size_gb >= $MIN_DISK_SIZE_GB" | bc -l) )); then disks+=("/dev/$disk_name:$size_gb") echo -e " ${GREEN}✓${NC} Rilevato: /dev/$disk_name (${size_gb} GB)" fi fi done if [[ ${#disks[@]} -eq 0 ]]; then echo -e "${RED}Errore: Nessun disco rilevato${NC}" exit 1 fi echo "" echo -e "${BLUE}Dischi da esportare: ${#disks[@]}${NC}" echo "${disks[@]}" } # Verifica se pv è installato if ! command -v pv &> /dev/null; then echo -e "${YELLOW}pv (Pipe Viewer) non è installato. Installazione in corso...${NC}" apt-get update -qq && apt-get install -y pv || yum install -y pv || { echo -e "${RED}Impossibile installare pv. Installa manualmente: apt-get install pv${NC}" exit 14/6 } fi # Verifica connettività SSH echo -e "${YELLOW}[1/5] Verifica connettività verso ${REMOTE_HOST}...${NC}" if ! ssh -o ConnectTimeout=5 ${REMOTE_USER}@${REMOTE_HOST} "echo 'OK'" &> /dev/null; then echo -e "${RED}Errore: Impossibile connettersi a ${REMOTE_USER}@${REMOTE_HOST}${NC}" echo "Assicurati che SSH sia configurato e che la chiave pubblica sia installata." exit 1 fi echo -e "${GREEN}✓ Connessione SSH OK${NC}" echo "" # Verifica spazio su destinazione echo -e "${YELLOW}[2/5] Verifica spazio disponibile su ${REMOTE_HOST}...${NC}" REMOTE_SPACE=$(ssh ${REMOTE_USER}@${REMOTE_HOST} "df -BG ${REMOTE_PATH} | tail -1 | awk '{print \$4}' | sed 's/G//'") echo -e "Spazio disponibile: ${REMOTE_SPACE} GB" if [[ $REMOTE_SPACE -lt 30 ]]; then echo -e "${RED}Attenzione: Spazio insufficiente (minimo 30GB consigliato)${NC}" read -p "Continuare comunque? (y/N): " -n 1 -r echo if [[ ! $REPLY =~ ^[Yy]$ ]]; then exit 1 fi fi echo -e "${GREEN}✓ Spazio OK${NC}" echo "" # Crea directory backup se non esiste echo -e "${YELLOW}[5/6] Preparazione directory remota...${NC}" ssh ${REMOTE_USER}@${REMOTE_HOST} "mkdir -p ${REMOTE_PATH}" echo -e "${GREEN}✓ Directory pronta${NC}" echo "" # Export di tutti i dischi rilevati echo -e "${YELLOW}[6/6] Esportazione dischi...${NC}" echo "" disk_counter=1 total_disks=${#DISKS[@]} for disk_info in "${DISKS[@]}"; do disk=$(echo "$disk_info" | cut -d':' -f1) disk_name=$(basename "$disk") echo -e "${BLUE}[$disk_counter/$total_disks] Esportazione $disk ...${NC}" echo -e "Destinazione: ${REMOTE_USER}@${REMOTE_HOST}:${REMOTE_PATH}/${disk_name}_${TIMESTAMP}.img.gz" echo "" # Ottieni dimensione del disco DISK_SIZE=$(blockdev --getsize64 "$disk") # Esegui export dd if="$disk" bs=16M conv=sync,noerror 2>/dev/null | \ pv -s ${DISK_SIZE} -N "$disk_name" -p -t -e -r -b | \ gzip -1 | \ ssh ${REMOTE_USER}@${REMOTE_HOST} "cat > ${REMOTE_PATH}/${disk_name}_${TIMESTAMP}.img.gz" echo -e "\n${GREEN}✓ $disk esportato con successo${NC}" echo "" ((disk_counter++)) done # Summary echo -e "${GREEN}========================================${NC}" echo -e "${GREEN}Esportazione completata!${NC}" echo -e "${GREEN}========================================${NC}" echo "" echo "File creati su ${REMOTE_HOST}:" ssh ${REMOTE_USER}@${REMOTE_HOST} "ls -lh ${REMOTE_PATH}/*${TIMESTAMP}*.gz" echo "" echo -e "${YELLOW}Prossimi passi:${NC}" echo "1. Decomprimere i file sul server remoto:" for disk_info in "${DISKS[@]}"; do disk_name=$(basename $(echo "$disk_info" | cut -d':' -f1)) echo " gunzip ${REMOTE_PATH}/${disk_name}_${TIMESTAMP}.img.gz" done echo "" echo "2. Convertire in VMDK:" for disk_info in "${DISKS[@]}"; do disk_name=$(basename $(echo "$disk_info" | cut -d':' -f1)) echo " qemu-img convert -O vmdk ${disk_name}_${TIMESTAMP}.img ${disk_name}.vmdk -p" done echo "" echo "3. Trasferire su ESXi e importare la VM" echo "" exit 0