====== Автоматизация клонирования Ubuntu Server VM в Hyper-V ======
===== Описание системы =====
Система позволяет создавать копии виртуальных машин Ubuntu Server за 2-3 минуты одним кликом. После клонирования SSH работает сразу, не требуется ручная настройка ключей или перезагрузка.
==== Как работает автоматизация ====
**PowerShell скрипт выполняет:**
* Проверку существования эталонного образа
* Создание структуры папок для новой VM
* Копирование VHDX диска
* Создание и настройку виртуальной машины
* Автоматический запуск VM
**При первой загрузке клона автоматически:**
* Создаётся папка ''/run/sshd'' (требуется для SSH)
* Генерируются уникальные SSH host keys
* Генерируется новый machine-id
* SSH сервис запускается автоматически
===== Файлы автоматизации =====
==== Bat-файл запуска (New-VM.bat) ====
Создайте файл ''New-VM.bat'':
@echo off
PowerShell.exe -ExecutionPolicy Bypass -Command "Start-Process PowerShell -ArgumentList '-ExecutionPolicy Bypass -File \"%~dp0New-VMClone.ps1\"' -Verb RunAs"
**Назначение:** Запускает PowerShell скрипт с правами администратора одним двойным кликом.
==== PowerShell скрипт (New-VMClone.ps1) ====
Создайте файл ''New-VMClone.ps1'' с кодировкой **UTF-8 with BOM**:
# Установка кодировки UTF-8
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$OutputEncoding = [System.Text.Encoding]::UTF8
# Параметры
$TemplateVHD = "E:\template-vm\ubuntu-srv-template.vhdx"
$VMRootPath = "D:\Hyper-V"
$SwitchName = "external"
# Проверка что эталон существует
if (-not (Test-Path $TemplateVHD)) {
Write-Host "ОШИБКА: Эталонный диск не найден: $TemplateVHD" -ForegroundColor Red
Write-Host ""
Read-Host "Нажмите Enter для выхода"
exit
}
# Запрос параметров новой VM
Write-Host "=== Клонирование Ubuntu Server VM ===" -ForegroundColor Green
Write-Host ""
$VMName = Read-Host "Введите имя новой VM"
if ([string]::IsNullOrWhiteSpace($VMName)) {
Write-Host "ОШИБКА: Имя VM не может быть пустым!" -ForegroundColor Red
Write-Host ""
Read-Host "Нажмите Enter для выхода"
exit
}
# Проверка что VM с таким именем не существует
if (Get-VM -Name $VMName -ErrorAction SilentlyContinue) {
Write-Host "ОШИБКА: VM с именем '$VMName' уже существует!" -ForegroundColor Red
Write-Host ""
Read-Host "Нажмите Enter для выхода"
exit
}
$CPUCount = Read-Host "Количество процессоров (штук)"
if ([string]::IsNullOrWhiteSpace($CPUCount) -or $CPUCount -lt 1) {
Write-Host "ОШИБКА: Укажите корректное количество процессоров!" -ForegroundColor Red
Write-Host ""
Read-Host "Нажмите Enter для выхода"
exit
}
$RAMinGB = Read-Host "Объём памяти (GB)"
if ([string]::IsNullOrWhiteSpace($RAMinGB) -or $RAMinGB -lt 1) {
Write-Host "ОШИБКА: Укажите корректный объём памяти!" -ForegroundColor Red
Write-Host ""
Read-Host "Нажмите Enter для выхода"
exit
}
# Конвертируем GB в байты
$RAMBytes = [long]$RAMinGB * 1GB
Write-Host ""
Write-Host "=== Параметры новой VM ===" -ForegroundColor Cyan
Write-Host "Имя: $VMName"
Write-Host "CPU: $CPUCount"
Write-Host "RAM: $RAMinGB GB"
Write-Host ""
$Confirm = Read-Host "Создать VM? (y/n)"
if ($Confirm -ne "y") {
Write-Host "Отменено." -ForegroundColor Yellow
Write-Host ""
Read-Host "Нажмите Enter для выхода"
exit
}
# Создание папки для новой VM и подкаталога для дисков
$NewVMPath = Join-Path $VMRootPath $VMName
$VHDPath = Join-Path $NewVMPath "Virtual Hard Disks"
Write-Host ""
Write-Host "Создание папки: $NewVMPath" -ForegroundColor Yellow
New-Item -ItemType Directory -Path $NewVMPath -Force | Out-Null
New-Item -ItemType Directory -Path $VHDPath -Force | Out-Null
# Копирование VHDX
$NewVHDPath = Join-Path $VHDPath "$VMName.vhdx"
Write-Host "Копирование диска..." -ForegroundColor Yellow
Write-Host "Из: $TemplateVHD"
Write-Host "В: $NewVHDPath"
Copy-Item -Path $TemplateVHD -Destination $NewVHDPath -Force
# Создание VM
Write-Host "Создание виртуальной машины..." -ForegroundColor Yellow
New-VM -Name $VMName `
-MemoryStartupBytes $RAMBytes `
-Generation 2 `
-VHDPath $NewVHDPath `
-Path $VMRootPath `
-SwitchName $SwitchName | Out-Null
# Настройка процессора
Set-VMProcessor -VMName $VMName -Count $CPUCount
# Отключение динамической памяти
Set-VMMemory -VMName $VMName -DynamicMemoryEnabled $false
# Настройка безопасной загрузки (для Linux)
Set-VMFirmware -VMName $VMName -EnableSecureBoot On -SecureBootTemplate MicrosoftUEFICertificateAuthority
# Запуск VM
Write-Host "Запуск виртуальной машины..." -ForegroundColor Yellow
Start-VM -Name $VMName
Write-Host ""
Write-Host "=== VM успешно создана и запущена! ===" -ForegroundColor Green
Write-Host "Имя VM: $VMName" -ForegroundColor Cyan
Write-Host "Путь: $NewVMPath" -ForegroundColor Cyan
Write-Host "Диск: $NewVHDPath" -ForegroundColor Cyan
Write-Host "CPU: $CPUCount процессоров" -ForegroundColor Cyan
Write-Host "RAM: $RAMinGB GB" -ForegroundColor Cyan
Write-Host ""
Write-Host "VM готова к работе!" -ForegroundColor Yellow
Write-Host "Подключение: ssh root@" -ForegroundColor Cyan
Write-Host "Пароль по умолчанию: 123456" -ForegroundColor Cyan
Write-Host ""
Write-Host "=== ВСЁ ГОТОВО! ===" -ForegroundColor Green
Write-Host ""
Read-Host "Нажмите Enter для выхода"
**Параметры для настройки:**
* ''$TemplateVHD'' - путь к эталонному VHDX диску
* ''$VMRootPath'' - корневая папка для виртуальных машин
* ''$SwitchName'' - имя виртуального свитча Hyper-V
===== Подготовка эталонной VM =====
==== Шаг 1: Установка и настройка Ubuntu Server ====
Установите Ubuntu Server 24.04 LTS и выполните начальную настройку:
# Обновление системы
apt update && apt upgrade -y
# Установка базовых утилит
apt install -y curl wget git htop nano net-tools
# Установка Docker
apt install -y docker.io docker-compose-v2
# Включение Docker в автозагрузку
systemctl enable docker
systemctl start docker
==== Шаг 2: Настройка root пользователя ====
# Установка пароля для root (например: 123456)
passwd root
# Разрешение SSH входа для root
sed -i 's/#PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
sed -i 's/PermitRootLogin.*/PermitRootLogin yes/' /etc/ssh/sshd_config
# Перезапуск SSH
systemctl restart ssh
# Добавление root в группу docker
usermod -aG docker root
Теперь отключитесь и подключитесь под root, затем удалите стандартного пользователя:
# Удаление пользователя (замените username на реальное имя)
userdel -r username
==== Шаг 3: Настройка автоматической генерации SSH ключей ====
Создайте скрипт автоматической регенерации SSH ключей:
cat > /usr/local/bin/regenerate-ssh-keys.sh << 'EOF'
#!/bin/bash
if [ ! -f /etc/ssh/ssh_host_rsa_key ]; then
echo "Генерация SSH host keys..."
ssh-keygen -A
sleep 2
pkill sshd
sleep 1
systemctl start ssh
echo "SSH запущен"
fi
EOF
chmod +x /usr/local/bin/regenerate-ssh-keys.sh
Создайте systemd unit для автоматического запуска:
cat > /etc/systemd/system/regenerate-ssh-keys.service << 'EOF'
[Unit]
Description=Regenerate SSH host keys on first boot
Before=ssh.service
ConditionPathExists=!/etc/ssh/ssh_host_rsa_key
[Service]
Type=oneshot
ExecStart=/bin/bash -c 'ssh-keygen -A && sleep 2'
RemainAfterExit=yes
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable regenerate-ssh-keys.service
==== Шаг 4: Настройка автоматического создания /run/sshd ====
# Создание tmpfiles конфигурации
cat > /etc/tmpfiles.d/sshd.conf << 'EOF'
d /run/sshd 0755 root root -
EOF
# Создание папки для текущей сессии
mkdir -p /run/sshd
chmod 0755 /run/sshd
==== Шаг 5: Включение SSH в автозагрузку ====
# Включение SSH в автозагрузку
systemctl enable ssh
# Проверка статуса
systemctl status ssh
**Убедитесь что SSH показывает:** ''enabled'' и ''active (running)''
==== Шаг 6: Подготовка образа к клонированию ====
Выполните финальную очистку и подготовку:
# Отключение и удаление swap файла
swapoff -a
rm -f /swap.img
sed -i '/swap.img/d' /etc/fstab
# Очистка APT кэша
apt clean
apt autoclean
# Удаление уникальных идентификаторов
rm -f /etc/machine-id
rm -f /var/lib/dbus/machine-id
touch /etc/machine-id
# Удаление SSH host keys (будут созданы автоматически)
rm -f /etc/ssh/ssh_host_*
# Очистка DHCP leases
rm -f /var/lib/dhcp/*
# Очистка логов
find /var/log -type f -exec truncate -s 0 {} \;
journalctl --vacuum-time=1s
# Очистка временных файлов
rm -rf /tmp/*
rm -rf /var/tmp/*
# Очистка истории команд
history -c
cat /dev/null > ~/.bash_history
**Выключение VM:**
shutdown -h now
**ВАЖНО:** После выключения НЕ запускайте эту VM! Это теперь эталонный образ для клонирования.
==== Шаг 7: Оптимизация VHDX (опционально) ====
На хосте Windows выполните в PowerShell от администратора:
# Сжатие VHDX
Optimize-VHD -Path "E:\template-vm\ubuntu-srv-template.vhdx" -Mode Full
# Проверка размера
Get-Item "E:\template-vm\ubuntu-srv-template.vhdx" | Select-Object Name, @{Name="Size(GB)";Expression={[math]::Round($_.Length/1GB,2)}}
# Создание резервной копии
Copy-Item "E:\template-vm\ubuntu-srv-template.vhdx" "E:\template-vm\ubuntu-srv-template-BACKUP.vhdx"
===== Использование =====
- Поместите файлы ''New-VM.bat'' и ''New-VMClone.ps1'' в одну папку
- Убедитесь что пути в скрипте настроены правильно
- Запустите ''New-VM.bat'' двойным кликом
- Введите параметры новой VM
- Дождитесь завершения клонирования
**Время создания VM:** 2-3 минуты (зависит от размера диска)
**SSH будет доступен сразу после загрузки клона!**
===== Структура папок =====
E:\template-vm\
└── ubuntu-srv-template.vhdx # Эталонный образ
D:\Hyper-V\
└── VMName\ # Папка виртуальной машины
├── Virtual Machines\ # Конфигурация VM
└── Virtual Hard Disks\ # Диски VM
└── VMName.vhdx # Клонированный диск
===== Проверка работы SSH после клонирования =====
Подключитесь к консоли VM через Hyper-V Manager и проверьте:
# Проверка статуса SSH
systemctl status ssh
# Проверка SSH host keys
ls -l /etc/ssh/ssh_host_*
# Проверка сервиса регенерации
systemctl status regenerate-ssh-keys.service
# Узнать IP адрес
ip a
**Ожидаемый результат:**
* ''ssh.service'' - **active (running)**
* SSH host keys созданы (6-8 файлов)
* ''regenerate-ssh-keys.service'' - показывает "Finished successfully"
===== Постклонирование (опционально) =====
После создания клона вы можете:
# Изменить hostname
hostnamectl set-hostname new-hostname
# Изменить пароль root
passwd root
# Перезагрузка
reboot
Изменение hostname необязательно - система работает и с одинаковыми именами. Различать машины можно по IP адресам.
===== Устранение проблем =====
==== SSH не запускается ====
# Проверка наличия папки /run/sshd
ls -ld /run/sshd
# Если папки нет - создайте вручную
mkdir -p /run/sshd
chmod 0755 /run/sshd
# Перезапуск SSH
systemctl restart ssh
==== SSH ключи не созданы ====
# Ручная генерация ключей
ssh-keygen -A
# Перезапуск SSH
systemctl restart ssh
==== Проверка конфигурации SSH ====
# Проверка на ошибки
sshd -t
# Просмотр логов
journalctl -u ssh -n 50
===== Заключение =====
Теперь у вас есть полностью автоматизированная система клонирования Ubuntu Server VM. Каждый клон создаётся за 2-3 минуты с работающим SSH сразу после первой загрузки.
**Преимущества:**
* Быстрое развертывание новых VM
* Автоматическая генерация уникальных идентификаторов
* SSH работает сразу без ручной настройки
* Запуск одним кликом
* Минимальный ручной труд