В процессе...
Ссылка на все файлы
#!/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