dudaENV Logo

В процессе...

Ссылка на все файлы

#!/bin/bash
# Проверка на root
if [ "$(id -u)" -ne 0 ]; then
  echo "Этот скрипт должен быть запущен с правами root" >&2
  exit 1
fi
# Проверка необходимых утилит
command -v qm >/dev/null 2>&1 || { echo >&2 "Требуется утилита qm, но она не установлена."; exit 1; }
command -v qemu-img >/dev/null 2>&1 || { echo >&2 "Требуется qemu-img. Установите qemu-utils."; exit 1; }
command -v wget >/dev/null 2>&1 || { echo >&2 "Требуется wget. Установите wget."; exit 1; }
## Переменные по умолчанию для всех ВМ
DEFAULT_STORAGE="local"
DEFAULT_BIOS="seabios"
DEFAULT_MACHINE="q35"
DEFAULT_BRIDGE="vmbr4000"
DEFAULT_MEMORY=2048
DEFAULT_CORES=2
DEFAULT_VGA="std"
# Имена ВМ
declare -A VM_NAMES=(
  ["4001"]="server"
  ["4002"]="client1"
  ["4003"]="client2"
)
# Пути к дискам
declare -A DEFAULT_DISK_PATHS=(
  ["4001"]="/root/disks/server/vm-4001-disk-1.qcow2"
  ["4002"]="/root/disks/client1/vm-4002-disk-1.qcow2"
  ["4003"]="/root/disks/client2/vm-4003-disk-1.qcow2"
)
# URL для загрузки дисков
declare -A DISK_URLS=(
  ["4001"]="https://getfile.dokpub.com/yandex/get/https://disk.yandex.ru/d/Hi1EkEufiziKtA/vm-4001-disk-1.qcow2"
  ["4002"]="https://getfile.dokpub.com/yandex/get/https://disk.yandex.ru/d/Hi1EkEufiziKtA/vm-4002-disk-1.qcow2"
  ["4003"]="https://getfile.dokpub.com/yandex/get/https://disk.yandex.ru/d/Hi1EkEufiziKtA/vm-4003-disk-1.qcow2"
)
# Конфигурации ВМ
declare -A VM_CONFIGS=(
  ["4001_STORAGE"]="$DEFAULT_STORAGE"
  ["4001_BIOS"]="$DEFAULT_BIOS"
  ["4001_MACHINE"]="$DEFAULT_MACHINE"
  ["4001_BRIDGE"]="$DEFAULT_BRIDGE"
  ["4001_MEMORY"]="$DEFAULT_MEMORY"
  ["4001_CORES"]="$DEFAULT_CORES"
  ["4001_VGA"]="$DEFAULT_VGA"
  ["4001_DISK_PATH"]="${DEFAULT_DISK_PATHS["4001"]}"
  
  ["4002_STORAGE"]="$DEFAULT_STORAGE"
  ["4002_BIOS"]="$DEFAULT_BIOS"
  ["4002_MACHINE"]="$DEFAULT_MACHINE"
  ["4002_BRIDGE"]="$DEFAULT_BRIDGE"
  ["4002_MEMORY"]="$DEFAULT_MEMORY"
  ["4002_CORES"]="$DEFAULT_CORES"
  ["4002_VGA"]="$DEFAULT_VGA"
  ["4002_DISK_PATH"]="${DEFAULT_DISK_PATHS["4002"]}"
  
  ["4003_STORAGE"]="$DEFAULT_STORAGE"
  ["4003_BIOS"]="$DEFAULT_BIOS"
  ["4003_MACHINE"]="$DEFAULT_MACHINE"
  ["4003_BRIDGE"]="$DEFAULT_BRIDGE"
  ["4003_MEMORY"]="$DEFAULT_MEMORY"
  ["4003_CORES"]="$DEFAULT_CORES"
  ["4003_VGA"]="$DEFAULT_VGA"
  ["4003_DISK_PATH"]="${DEFAULT_DISK_PATHS["4003"]}"
)
# Функция показа информации о создаваемых ВМ
show_creation_info() {
  echo -e "\nБудут созданы следующие ВМ:"
  echo "----------------------------------------"
  for vm_id in 4001 4002 4003; do
    echo "ВМ $vm_id (${VM_NAMES[$vm_id]})"
    echo "  - Диск: ${VM_CONFIGS["${vm_id}_DISK_PATH"]} (qcow2)"
    echo "  - Хранилище: ${VM_CONFIGS["${vm_id}_STORAGE"]}"
    echo "  - Память: ${VM_CONFIGS["${vm_id}_MEMORY"]} MB"
    echo "  - Ядра: ${VM_CONFIGS["${vm_id}_CORES"]}"
    echo "  - Сетевой мост: ${VM_CONFIGS["${vm_id}_BRIDGE"]}"
    echo "----------------------------------------"
  done
  echo -e "\nБудут созданы следующие папки:"
  echo "  - /root/disks/server/"
  echo "  - /root/disks/client1/"
  echo "  - /root/disks/client2/"
  
  echo -e "\nБудут загружены следующие диски:"
  for vm_id in 4001 4002 4003; do
    echo "  - ${VM_NAMES[$vm_id]}: ${DISK_URLS[$vm_id]}"
  done
}
# Функция загрузки дисков
download_disks() {
  echo -e "\nПроверка и загрузка дисков..."
  
  for vm_id in 4001 4002 4003; do
    dir=$(dirname "${DEFAULT_DISK_PATHS["$vm_id"]}")
    if [ ! -d "$dir" ]; then
      echo "Создаем директорию $dir"
      mkdir -p "$dir"
    else
      echo "Директория $dir уже существует"
    fi
  done
  
  for vm_id in 4001 4002 4003; do
    vm_name=${VM_NAMES["$vm_id"]}
    disk_path=${DEFAULT_DISK_PATHS["$vm_id"]}
    disk_url=${DISK_URLS["$vm_id"]}
    
    if [ -f "$disk_path" ]; then
      echo "Диск для $vm_name ($vm_id) уже существует: $disk_path"
      continue
    fi
    
    echo -n "Загрузка диска для $vm_name ($vm_id)... "
    
    if wget -q --show-progress -O "$disk_path" "$disk_url"; then
      echo "OK"
    else
      echo "ОШИБКА"
      return 1
    fi
  done
  
  echo "Все диски проверены/загружены."
  return 0
}
# Функция создания ВМ
create_vm_with_qcow2() {
  local vm_id=$1
  local vm_name=${VM_NAMES["$vm_id"]}
  local disk_path=${VM_CONFIGS["${vm_id}_DISK_PATH"]}
  local storage=${VM_CONFIGS["${vm_id}_STORAGE"]}
  local bios=${VM_CONFIGS["${vm_id}_BIOS"]}
  local machine=${VM_CONFIGS["${vm_id}_MACHINE"]}
  local bridge=${VM_CONFIGS["${vm_id}_BRIDGE"]}
  local memory=${VM_CONFIGS["${vm_id}_MEMORY"]}
  local cores=${VM_CONFIGS["${vm_id}_CORES"]}
  local vga=${VM_CONFIGS["${vm_id}_VGA"]}
  
  echo -e "\nСоздаем ВМ $vm_id ($vm_name) с параметрами:"
  echo "Диск: $disk_path (qcow2)"
  echo "Хранилище: $storage"
  echo "BIOS: $bios"
  echo "Тип машины: $machine"
  echo "Сетевой мост: $bridge"
  echo "Память: $memory MB"
  echo "Ядра: $cores"
  echo "Видеокарта: $vga"
  
  # Проверка существования ВМ
  if qm list | grep -q "$vm_id"; then
    echo "ВМ $vm_id ($vm_name) уже существует, пропуск."
    return 0
  fi
  
  if [ ! -f "$disk_path" ]; then
    echo "Ошибка: файл диска $disk_path не найден!" >&2
    return 1
  fi
  
  if ! qemu-img info "$disk_path" | grep -q "file format: qcow2"; then
    echo "Ошибка: файл диска $disk_path не в формате qcow2!" >&2
    return 1
  fi
  
  # Создание ВМ
  echo "Создаем ВМ..."
  qm create "$vm_id" \
    --name "$vm_name" \
    --memory "$memory" \
    --cores "$cores" \
    --bios "$bios" \
    --machine "$machine" \
    --net0 virtio,bridge="$bridge" \
    --scsihw virtio-scsi-pci \
    --vga "$vga"
  echo "Импорт диска в формате qcow2..."
  qm importdisk "$vm_id" "$disk_path" "$storage" --format qcow2
  
  echo "Привязка диска к ВМ..."
  qm set "$vm_id" \
    --scsi0 "$storage:$vm_id/vm-$vm_id-disk-0.qcow2,discard=on,format=qcow2" \
    --boot c \
    --bootdisk scsi0
  qm set "$vm_id" --serial0 socket
  qm set "$vm_id" --agent enabled=1
  
  if qm config "$vm_id" | grep -q "scsi0:"; then
    echo "Диск успешно привязан к ВМ $vm_id"
  else
    echo "Ошибка: диск не привязан к ВМ $vm_id!" >&2
    echo "Попробуйте привязать его вручную через веб-интерфейс Proxmox"
    return 1
  fi
  
  echo "ВМ $vm_id ($vm_name) успешно создана."
  return 0
}
# Запуск всех ВМ
start_all_vms() {
  echo -e "\nЗапуск всех ВМ..."
  for vm_id in 4001 4002 4003; do
    vm_name=${VM_NAMES["$vm_id"]}
    if qm list | grep -q "$vm_id"; then
      if qm status "$vm_id" | grep -q "running"; then
        echo "ВМ $vm_id ($vm_name) уже запущена"
      else
        echo -n "Запускаем ВМ $vm_id ($vm_name)... "
        if qm start "$vm_id" >/dev/null 2>&1; then
          echo "OK"
        else
          echo "ОШИБКА"
        fi
      fi
    else
      echo "ВМ $vm_id ($vm_name) не существует, пропускаем"
    fi
  done
}
# Главное меню
main_menu() {
  show_creation_info
  read -p "Вы хотите загрузить диски и создать ВМ? (y/n): " confirm
  if [[ "$confirm" =~ ^[YyДд]$ ]]; then
    # Загрузка дисков
    if ! download_disks; then
      echo "Ошибка при загрузке дисков! Создание ВМ прервано." >&2
      exit 1
    fi
    
    for vm_id in 4001 4002 4003; do
      if ! create_vm_with_qcow2 "$vm_id"; then
        echo "Ошибка при создании ВМ $vm_id!" >&2
        exit 1
      fi
    done
    
    start_all_vms
    
    echo -e "\nВсе ВМ успешно созданы и запущены!"
  else
    echo "Операция отменена."
  fi
}
main_menu
Автор: Maksim Duda