В данной статье описывается пошаговая методика развертывания виртуальной машины (ВМ) с установленной операционной системой Windows 10 на сервере с операционной системой Ubuntu. Решение предполагает установку всех необходимых компонентов, настройку виртуализации с помощью QEMU/KVM, а также организацию удалённого доступа к ВМ посредством noVNC. Аналогичный подход может применяться и для создания ВМ с Windows 11, однако при её установке необходимо учитывать минимальные требования к оборудованию.
> Замечание. Не у всех хостинг-провайдеров реализована возможность виртуализации (nested virtualization), поэтому для успешного развертывания рекомендуется использовать проверенные сервисы, такие как Timeweb. Моя ссылка с небольшим бонусом: https://timeweb.cloud/r/xillusion
Исходный код bash-скрипта для установки:
https://gist.github.com/amlkyc/a6ac7e05d5f121658d21478868604f79
Спасибо Claude за помощь в написании и дебаге. :)
Для загрузки и запуска скрипта можно выполнить следующие команды:
wget https://gist.githubusercontent.com/amlkyc/a6ac7e05d5f121658d21478868604f79/raw/16865eaaad6a67873d444c07640d73e8cfa8727c/installWin10noVNC.sh
chmod +x installWin10noVNC.sh
./installWin10noVNC.sh
Далее, подробнее о том как работает скрипт.
1. Подготовка VPS и установка необходимых пакетов
Для начала необходимо убедиться, что на сервере работает актуальная версия Ubuntu и имеется возможность установки виртуализации. В первую очередь обновляются системные пакеты:
apt-get update && apt-get upgrade -y
Далее устанавливаются необходимые пакеты:
Пакеты для работы с QEMU/KVM и libvirt (qemu-kvm, libvirt-daemon-system, virtinst, libvirt-clients, bridge-utils, qemu-utils);
Утилиты для загрузки файлов (wget, curl);
Python 3 и Git для установки и работы с noVNC.
Кроме того, после установки необходимо активировать службы libvirtd и virtlogd, что обеспечит стабильную работу виртуализации на сервере:
systemctl enable --now libvirtd
systemctl enable --now virtlogd
2. Установка и настройка noVNC
Для организации доступа к виртуальной машине через веб-интерфейс устанавливается проект noVNC. Для этого клонируются репозитории noVNC и websockify:
git clone https://github.com/novnc/noVNC.git /opt/noVNC
git clone https://github.com/novnc/websockify /opt/noVNC/utils/websockify
После клонирования создаётся символическая ссылка для доступа к клиентской части VNC через файл index.html:
ln -sf /opt/noVNC/vnc.html /opt/noVNC/index.html
3. Подготовка образов установочных ISO и создание виртуального диска
Создаются необходимые директории для хранения образов операционных систем и виртуальных дисков:
mkdir -p /var/lib/libvirt/images/
mkdir -p /var/lib/libvirt/isos/
Загрузка установочного образа Windows 10
Образ Windows 10 может быть загружен посредством утилиты wget с другого сервера или перенесён на целевой сервер заранее. В скрипте в строке:
WINDOWS_ISO_URL="https://example.com/windows10.iso" # Замените URL на фактический
Необходимо указать корректную ссылку на ISO-образ. В качестве примера загрузки использован следующий образ (тестировался на Ubuntu 22.04): https://torrent.libreseed.icu/SHA-1/5337bb57bd672d6bf2282379a8f52e42100312c4
Либо, поместите образ на сервер заранее и пропустите шаг загрузки wget -O.
Загрузка драйверов VirtIO
Для корректной работы системы рекомендуется загрузить ISO-образ с драйверами VirtIO для Windows:
wget -O /var/lib/libvirt/isos/virtio-win.iso https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso
Создание виртуального диска
Виртуальный диск для ВМ создаётся с использованием формата qcow2 и размером 60 Гб:
qemu-img create -f qcow2 /var/lib/libvirt/images/win10.qcow2 60G
4. Определение и настройка виртуальной машины
Для развертывания ВМ создаётся XML-конфигурация, в которой задаются основные параметры: имя виртуальной машины, объём оперативной памяти (в примере 4 ГБ), количество виртуальных процессоров (2 vCPU) и параметры загрузки (с приоритетом CD/DVD, а затем жесткая копия).
В конфигурации определяются следующие устройства:
Три виртуальных диска: – основной диск для системы; – загрузочный образ Windows 10; – образ с драйверами VirtIO.
Сетевой адаптер с моделью e1000.
Параметры графического вывода через VNC (порт 5900) с доступом через noVNC.
Дополнительные контроллеры, USB-контроллер, последовательные порты и прочие компоненты, необходимые для полноценной работы ГУИ и инфраструктуры гипервизора.
Сохранённый XML-файл, например, во временной директории, применяется командой virsh define для регистрации ВМ, после чего она запускается:
virsh define /tmp/win10_vm.xml
rm /tmp/win10_vm.xml
virsh start win10
5. Настройка noVNC для доступа к виртуальной машине
Для обеспечения удалённого доступа создаётся скрипт запуска noVNC:
cat > /usr/local/bin/start_novnc << EOL
#!/bin/bash
cd /opt/noVNC
./utils/novnc_proxy --vnc 127.0.0.1:5900 --listen 0.0.0.0:6080
EOL
Необходимо сделать данный скрипт исполняемым:
chmod +x /usr/local/bin/start_novnc
Далее создаётся unit-файл для systemd, который будет автоматически запускать сервис noVNC:
cat > /etc/systemd/system/novnc.service << EOL
[Unit]
Description=noVNC Service
After=network.target
[Service]
Type=simple
User=root
ExecStart=/usr/local/bin/start_novnc
Restart=on-failure
[Install]
WantedBy=multi-user.target
EOL
После перезагрузки демона systemd сервис активируется и запускается:
systemctl daemon-reload
systemctl enable novnc
systemctl start novnc
6. Получение публичного IP-адреса и инструкция по доступу
Чтобы обеспечить удобство подключения, скрипт пытается получить публичный IP-адрес сервера с помощью утилит curl или команды ip. После установления службы, в консоли выводится инструкция для доступа к Windows:
Для входа в систему необходимо в веб-браузере открыть URL:
http://<ip>:6080/vnc.html
7. Заключительные замечания
Образ Windows. В строке установки WINDOWS_ISO_URL укажите корректную ссылку на образ Windows 10, либо заранее поместите его в /var/lib/libvirt/isos/windows10.iso и скорректируйте скрипт.
Ресурсы хоста и ВМ. В примере виртуальной машины выделено 2 vCPU и 4 ГБ оперативной памяти. При наличии достаточных ресурсов хост-системы вы можете увеличить параметры.
Виртуализация. Убедитесь, что выбранный вами хостинг-провайдер поддерживает виртуализацию внутри виртуализации (nested virtualization).
Данное решение является универсальным и может быть адаптировано под различные требования и версии Windows. Надеюсь, что представленная инструкция поможет вам быстро и качественно развернуть Windows 10 на сервере Ubuntu с удобным веб-доступом через noVNC.
Автор статьи благодарит Timeweb за предоставленную возможность развертывания проекта и рекомендует использовать данный сервис для стабильной работы виртуальных машин.