Ускорение Windows в виртуальной машине KVM и Proxmox: драйверы VirtIO

Windows в KVM без дополнительных драйверов работает на эмулированном железе: диск IDE или SATA, сетевая карта Intel e1000. Это совместимо, но медленно. Каждая операция с диском и сетью проходит через эмуляцию настоящего контроллера, процессор хоста тратит на это много времени, а гость получает высокие задержки.

Решение — паравиртуальные устройства VirtIO. Гость знает, что он в виртуальной машине, и общается с гипервизором напрямую. Для Windows нужны драйверы из ISO-образа virtio-win: диск (vioscsi или viostor), сеть (NetKVM), balloon, последовательный порт для гостевого агента. Плюс несколько настроек ВМ: тип процессора, кэш диска и Hyper-V enlightenments.

Самый частый сценарий — новая ВМ с Windows 11, Windows Server 2022 или 2025 в Proxmox VE или в libvirt. Ставим систему сразу на VirtIO SCSI, загружаем драйвер диска прямо в установщике, после установки запускаем установщик гостевых инструментов. Ниже — пошагово для Proxmox VE 9 и для libvirt на Debian, Ubuntu и AlmaLinux, а также перевод уже установленной Windows с IDE/SATA на VirtIO.

Что ускоряет и за счёт чего

КомпонентЧто даётДрайвер или настройка
VirtIO SCSIБыстрый диск, TRIM, несколько очередей, поддержка IO threadvioscsi
VirtIO BlockБыстрый диск попроще (одно устройство — один контроллер)viostor
VirtIO NetСеть на скоростях 10 Гбит/с и выше без нагрузки на эмуляциюNetKVM
BalloonГипервизор видит реальное потребление памяти и может забирать лишнююBalloon + служба BalloonService
QEMU Guest AgentКорректное выключение, заморозка ФС для бэкапов, IP-адреса в интерфейсеvioserial + qemu-ga
Тип CPUДоступ гостя к инструкциям процессора (AES, AVX)host или x86-64-v2-AES/v3
Hyper-V enlightenmentsМеньше нагрузки на CPU в простое, быстрые таймеры и прерыванияТип ОС Windows в Proxmox, <hyperv> в libvirt

Для нового сервера выбирайте VirtIO SCSI с контроллером «VirtIO SCSI single». Proxmox рекомендует именно его: каждому диску свой контроллер и свой IO thread.

Где взять virtio-win

Драйверы собирает проект virtio-win (исходники — на GitHub в репозитории virtio-win/kvm-guest-drivers-windows). Стабильная сборка ISO лежит на Fedora People:

https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

Ссылка всегда указывает на последнюю стабильную версию. Положите образ туда, где гипервизор держит ISO:

# Proxmox VE (хранилище local)
cd /var/lib/vz/template/iso/
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

# libvirt на Debian, Ubuntu, AlmaLinux
cd /var/lib/libvirt/images/
wget https://fedorapeople.org/groups/virt/virtio-win/direct-downloads/stable-virtio/virtio-win.iso

В Proxmox то же самое можно сделать в интерфейсе: хранилище local → ISO Images → Download from URL.

Структура образа: каталог драйвера, внутри каталог версии Windows, внутри архитектура. Нужные пути:

УстройствоWindows 11Windows Server 2022Windows Server 2025
Диск VirtIO SCSIvioscsi\w11\amd64vioscsi\2k22\amd64vioscsi\2k25\amd64
Диск VirtIO Blockviostor\w11\amd64viostor\2k22\amd64viostor\2k25\amd64
СетьNetKVM\w11\amd64NetKVM\2k22\amd64NetKVM\2k25\amd64
BalloonBalloon\w11\amd64Balloon\2k22\amd64Balloon\2k25\amd64

В корне образа лежат установщики для уже работающей системы: virtio-win-guest-tools.exe (все драйверы, гостевой агент и SPICE-агент одним пакетом), virtio-win-gt-x64.msi (только драйверы) и guest-agent\qemu-ga-x86_64.msi (только агент).

Драйверы подписаны, Windows ставит их штатно. Отключать проверку подписи (bcdedit -set TESTSIGNING ON), как делали со старыми драйверами Xen, не нужно и вредно: это ослабляет защиту ядра, а с включённым Secure Boot такой режим вообще недоступен.

Новая ВМ в Proxmox VE

Актуальная ветка — Proxmox VE 9.x на базе Debian 13. Если Proxmox ещё не стоит, начните со статьи Установка Proxmox VE на свой сервер.

Мастер создания ВМ

  1. OS. ISO с Windows, Type: Microsoft Windows, Version: 11/2022/2025. Отметьте «Add additional drive for VirtIO drivers» и выберите virtio-win.iso — Proxmox подключит его вторым CD-приводом.
  2. System. Machine: q35, BIOS: OVMF (UEFI), добавьте EFI-диск с включёнными «Pre-Enroll keys» (Secure Boot), добавьте TPM версии 2.0 — без них установщик Windows 11 откажется работать. SCSI Controller: VirtIO SCSI single. Включите «Qemu Agent».
  3. Disks. Bus/Device: SCSI. Cache: Default (No cache). Включите Discard, IO thread и SSD emulation, если диск на SSD или NVMe.
  4. CPU. Минимум 2 ядра. Type: host для одиночного сервера или x86-64-v2-AES (значение по умолчанию) для кластера с разными процессорами.
  5. Memory. Для Windows 11 минимум 4 ГБ. Оставьте устройство Ballooning включённым.
  6. Network. Model: VirtIO (paravirtualized).

Тип ОС Windows важен не только для подсказок мастера. По нему Proxmox включает Hyper-V enlightenments и выставляет часы RTC в локальное время, как ожидает Windows. Если сменили тип ОС у существующей ВМ, нужна полная остановка и запуск, не перезагрузка изнутри гостя.

Те же настройки из командной строки

Для существующей ВМ с номером 101:

qm set 101 --ostype win11 --scsihw virtio-scsi-single --agent enabled=1
qm set 101 --cpu x86-64-v2-AES
qm config 101

Тип win11 подходит и для Windows Server 2022 и 2025. Параметры диска и сети меняются в той же команде, но при смене модели сетевой карты указывайте старый MAC-адрес, иначе Proxmox сгенерирует новый: --net0 virtio=BC:24:11:AA:BB:CC,bridge=vmbr0.

Установка Windows с драйвером VirtIO

Установщик Windows не знает про VirtIO и не видит диск. Это нормально.

  1. Дойдите до экрана выбора диска. Список пуст.
  2. Нажмите «Загрузить драйвер» → «Обзор», откройте CD-привод с virtio-win.
  3. Выберите vioscsi\w11\amd64 (для Server 2022 — 2k22, для 2025 — 2k25). Если диск подключён как VirtIO Block, берите viostor. Появится «Red Hat VirtIO SCSI pass-through controller», диск станет виден.
  4. Тем же способом загрузите NetKVM\w11\amd64 и Balloon\w11\amd64. Сетевой драйвер особенно важен для Windows 11: установка Home и Pro на этапе OOBE требует сети.
  5. Продолжайте установку как обычно.

Драйверы, загруженные на этом шаге, попадают и в установленную систему.

После установки

Откройте CD-привод virtio-win внутри Windows и запустите virtio-win-guest-tools.exe. Он доставит оставшиеся драйверы (последовательный порт, генератор случайных чисел, ввод, видео), службу BalloonService и QEMU Guest Agent. Если SPICE не используете, его компоненты можно не ставить.

Проверьте в Диспетчере устройств, что не осталось неизвестных устройств с жёлтым значком. Должны быть видны:

  • «Контроллеры запоминающих устройств» → Red Hat VirtIO SCSI pass-through controller;
  • «Сетевые адаптеры» → Red Hat VirtIO Ethernet Adapter;
  • «Системные устройства» → VirtIO Balloon Driver и VirtIO Serial Driver.

В «Службах» должны работать QEMU Guest Agent и Balloon Service. Проверка агента с хоста Proxmox:

qm guest cmd 101 ping
qm guest cmd 101 network-get-interfaces

Первая команда при успехе ничего не выводит и завершается без ошибки. Во вкладке Summary появятся IP-адреса ВМ.

Новая ВМ в libvirt (Debian, Ubuntu, AlmaLinux)

На хосте нужны QEMU, libvirt, virt-install, прошивка UEFI и эмулятор TPM:

# Debian 12/13, Ubuntu 24.04
apt install qemu-system-x86 libvirt-daemon-system virtinst ovmf swtpm swtpm-tools

# AlmaLinux/Rocky 9 и 10
dnf install qemu-kvm libvirt virt-install edk2-ovmf swtpm swtpm-tools

Создание ВМ с Windows 11 и диском VirtIO:

virt-install \
  --name win11 \
  --osinfo win11 \
  --memory 8192 --vcpus 4 \
  --cpu host-passthrough \
  --boot uefi --tpm default \
  --disk size=80,bus=virtio,cache=none,discard=unmap \
  --cdrom /var/lib/libvirt/images/Win11.iso \
  --disk /var/lib/libvirt/images/virtio-win.iso,device=cdrom \
  --network network=default,model=virtio \
  --graphics spice

Здесь диск подключён как VirtIO Block (bus=virtio), поэтому в установщике грузите viostor\w11\amd64. Для VirtIO SCSI добавьте --controller type=scsi,model=virtio-scsi и укажите у диска bus=scsi. Управлять такой ВМ удобно через virt-manager с рабочей станции: virt-manager на удалённом хосте.

Канал для гостевого агента virt-install с --osinfo win11 обычно добавляет сам. Проверить: virsh dumpxml win11 | grep -A2 guest_agent. Если его нет, добавьте --channel unix,target.type=virtio,target.name=org.qemu.guest_agent.0.

Тип процессора

Тип CPU определяет, какие инструкции видит гость. Чем ближе к реальному процессору, тем быстрее шифрование, сжатие и всё, что использует AVX.

  • host (в libvirt host-passthrough) — гость видит процессор хоста как есть. Максимальная скорость. Минус: живая миграция возможна только на узел с таким же процессором.
  • x86-64-v2-AES — значение по умолчанию в Proxmox VE. Совместимо почти со всеми серверными процессорами последних десяти лет, есть AES-NI.
  • x86-64-v3 — добавляет AVX2. Подходит, если все узлы кластера поддерживают этот уровень.
  • kvm64 — старое значение по умолчанию. Не используйте его для Windows 11 24H2 и Server 2025: им нужны SSE4.2 и POPCNT, которых в kvm64 нет, и система может не загрузиться.

Если в Windows включена виртуализация на основе безопасности (VBS, «Целостность памяти») и ВМ видит расширения виртуализации, гостю приходится работать поверх собственного гипервизора. Это заметно замедляет ВМ. Если вложенная виртуализация (WSL2, Hyper-V внутри гостя) не нужна, это стоит учитывать при выборе host.

Кэш диска

РежимКак работаетКогда использовать
noneКэш хоста не используется, запись идёт напрямую на устройство; сбросы гостя честно доходят до дискаПо умолчанию. Безопасно, хорошо на SSD, LVM, ZFS, Ceph
writebackЗапись через кэш страниц хоста, сбросы гостя передаются на дискБыстрее на медленных дисках; при сбое хоста теряются данные, которые гость ещё не сбросил
writethroughЧтение из кэша, каждая запись синхроннаяБезопасно, но запись медленная
directsyncБез кэша и с синхронной записьюМаксимальная надёжность, минимальная скорость
unsafeСбросы гостя игнорируютсяТолько для временных ВМ, которые не жалко. Никогда в продакшене

Proxmox в руководствах по Windows допускает writeback ради скорости, но по умолчанию оставляет none. Без ИБП и при важных данных выбирайте none. Формат образа (raw или qcow2) и его конвертация разобраны в статье Образы дисков виртуальных машин.

Включённый Discard вместе с SSD emulation позволяет Windows отправлять TRIM. Тонкие тома (LVM-thin, ZFS, qcow2) тогда освобождают место после удаления файлов. Проверить можно в «Оптимизации дисков»: тип носителя должен быть «Твердотельный накопитель».

Hyper-V enlightenments

Windows умеет работать под Hyper-V и использовать его паравиртуальные интерфейсы: часы, таймеры, уведомления о спин-блокировках, быстрые межпроцессорные прерывания. KVM умеет эмулировать эти интерфейсы. Без них Windows грузит процессор хоста даже в простое и хуже переносит нагрузку на много ядер.

Proxmox VE включает их сам, если тип ОС — Windows. Ничего дописывать не нужно.

libvirt: virt-install и virt-manager при выборе Windows тоже добавляют базовый набор. Проверьте XML (virsh edit win11) и при необходимости дополните:

<features>
  <acpi/>
  <apic/>
  <hyperv mode='custom'>
    <relaxed state='on'/>
    <vapic state='on'/>
    <spinlocks state='on' retries='8191'/>
    <vpindex state='on'/>
    <runtime state='on'/>
    <synic state='on'/>
    <stimer state='on'/>
    <frequencies state='on'/>
    <tlbflush state='on'/>
    <ipi state='on'/>
  </hyperv>
</features>
<clock offset='localtime'>
  <timer name='rtc' tickpolicy='catchup'/>
  <timer name='pit' tickpolicy='delay'/>
  <timer name='hpet' present='no'/>
  <timer name='hypervclock' present='yes'/>
</clock>

Изменения применяются после полной остановки ВМ (virsh shutdown, затем virsh start). Таймер hypervclock заодно решает многие проблемы с уходом времени, подробнее — в статье Синхронизация времени в виртуальных машинах.

Перевод установленной Windows с IDE/SATA на VirtIO

Если просто переключить шину загрузочного диска на VirtIO, Windows упадёт с синим экраном INACCESSIBLE_BOOT_DEVICE: драйвер диска не установлен или не помечен как загрузочный. Надёжный порядок для Proxmox:

  1. В работающей Windows запустите virtio-win-guest-tools.exe с образа virtio-win.
  2. Выключите ВМ. Добавьте временный маленький диск на VirtIO SCSI:
    qm set 101 --scsihw virtio-scsi-single --scsi1 local-lvm:1
  3. Включите ВМ, дождитесь, пока Windows увидит новый диск в «Управлении дисками». Драйвер vioscsi теперь используется системой. Выключите ВМ.
  4. Отключите системный диск от IDE/SATA и подключите на SCSI:
    qm set 101 --delete ide0
    qm config 101 | grep unused
    qm set 101 --scsi0 local-lvm:vm-101-disk-0,discard=on,iothread=1,ssd=1
    qm set 101 --boot order=scsi0
    qm set 101 --delete scsi1

    Имя тома берите из вывода qm config (строка unused0). Временный диск после отключения тоже станет unused, удалите его в интерфейсе.
  5. Запустите ВМ. Если загрузилась — смените сетевую карту на VirtIO с сохранением MAC-адреса.

Перед этим сделайте резервную копию или снимок. Если система не загрузилась, верните диск на прежнюю шину — данные не пострадали.

Симптом, причина, решение

СимптомПричинаРешение
Установщик не видит дискНет драйвера VirtIO в WinPE«Загрузить драйвер» → vioscsi\w11\amd64 или viostor
«Этот компьютер не соответствует требованиям Windows 11»Нет UEFI, Secure Boot или TPM 2.0OVMF, EFI-диск с ключами, TPM 2.0 (в libvirt — пакет swtpm)
Windows 11 24H2 / Server 2025 не загружаетсяТип CPU kvm64 без SSE4.2/POPCNTx86-64-v2-AES или host
BSOD INACCESSIBLE_BOOT_DEVICE после смены шиныДрайвер диска не загружается при стартеТрюк с временным VirtIO-диском, см. выше
Нет сети на этапе OOBEНе загружен NetKVMЗагрузить NetKVM\w11\amd64 в установщике
Proxmox показывает занятой всю память ВМНет драйвера Balloon или службы BalloonServiceУстановить guest tools, проверить службу
ВМ не выключается из интерфейса, бэкап без заморозки ФСНе работает гостевой агентВключить Qemu Agent в ВМ, проверить службу и qm guest cmd ping
Высокая нагрузка на CPU хоста в простоеНет Hyper-V enlightenmentsТип ОС Windows в Proxmox, блок <hyperv> в libvirt

Исторически: драйверы для Xen

Раньше Windows Server 2008 в Xen ускоряли драйверами GPLPV. Они не были подписаны Microsoft, поэтому в госте включали тестовый режим подписи (bcdedit -set TESTSIGNING ON), а в конфиге ВМ прописывали type=paravirtualized для сетевого интерфейса и timer_mode = 1. Сейчас так делать не нужно. Для KVM и Proxmox есть подписанные драйверы virtio-win. Для XCP-ng есть собственные подписанные гостевые инструменты Windows PV Tools, их ставят штатно.

Частые вопросы

Что выбрать: VirtIO SCSI или VirtIO Block?

Для большинства случаев — VirtIO SCSI с контроллером «VirtIO SCSI single». Он поддерживает TRIM, много дисков и IO thread на каждый диск, его рекомендует Proxmox. VirtIO Block чуть проще и в отдельных тестах быстрее, но выигрыш обычно незаметен. Главное — не оставлять IDE или SATA.

Нужно ли обновлять драйверы virtio-win?

Да, время от времени. Новые версии исправляют ошибки и добавляют поддержку свежих Windows. Скачайте новый ISO, подключите к ВМ и запустите virtio-win-guest-tools.exe — он обновит установленные драйверы. Перед обновлением сделайте снимок.

Можно ли включить ballooning для Windows-сервера с базой данных?

Лучше не надо. SQL Server и Exchange сами управляют памятью и плохо реагируют на её изъятие. Задайте одинаковые минимум и максимум памяти: устройство balloon останется, Proxmox будет показывать реальное потребление, но забирать память не станет.

Тип CPU host или x86-64-v2-AES?

На одиночном сервере — host, это самый быстрый вариант. В кластере с разными процессорами — общий для всех узлов уровень, обычно x86-64-v2-AES или x86-64-v3, иначе живая миграция не сработает. Для WSL2 и Hyper-V внутри гостя нужен host и включённая вложенная виртуализация на хосте.

Подходят ли эти драйверы для Windows 7, 2008 R2 и 2012?

Свежие выпуски virtio-win эти системы больше не поддерживают. Для них нужны старые выпуски ISO из архива проекта на Fedora People. Сами системы давно без обновлений безопасности, такие ВМ лучше не выпускать в интернет и планировать переход.

Нужен ли QEMU Guest Agent, если и так всё работает?

Да. Без агента Proxmox не может корректно выключить ВМ (только через ACPI, на который Windows реагирует не всегда), не замораживает файловую систему через VSS при резервном копировании и не показывает IP-адреса. Агент ставится одним MSI-пакетом и почти не потребляет ресурсов.