VirtIO — что это и зачем нужно в виртуальных машинах | Глоссарий FREEHOSTING

VirtIO

Virtual I/O
VirtIO — VirtIO — стандарт паравиртуализованных драйверов для виртуальных машин, обеспечивающий высокопроизводительный обмен данными между гостевой ОС и гипервизором без эмуляции реального железа.

Определение простыми словами

VirtIO — это набор стандартизированных драйверов и устройств, который позволяет виртуальной машине работать с сетью, дисками и другими ресурсами почти на скорости физического железа. Вместо того чтобы эмулировать реальное оборудование (например, сетевую карту Intel e1000 или диск IDE), гипервизор предоставляет упрощённые виртуальные устройства, а гостевая ОС использует специальные VirtIO-драйверы для прямого взаимодействия с ними.

Стандарт описан в спецификации OASIS VirtIO и поддерживается в KVM, QEMU, Proxmox VE, VMware и других платформах. В Linux-ядре драйверы VirtIO включены начиная с версии 2.6.25, в Windows доступны через пакет virtio-win от Red Hat.

Сравнение

Подход Производительность Совместимость Пример
Полная эмуляция Низкая (20–50% от нативной) Любая ОС без изменений IDE, RTL8139, e1000
VirtIO (паравиртуализация) Высокая (85–98% от нативной) Требует VirtIO-драйверов в ОС virtio-net, virtio-blk, virtio-scsi
PCI Passthrough / SR-IOV Нативная (100%) Жёсткая привязка к железу, нет живой миграции SR-IOV, VFIO

Кейсы использования

  • Сетевые нагрузки: virtio-net обеспечивает пропускную способность до 10+ Гбит/с на одном vNIC без дополнительных накладных расходов на эмуляцию.
  • Дисковые операции: virtio-blk или virtio-scsi для баз данных (PostgreSQL, MySQL) даёт latency <0.1 мс против 1–3 мс при эмуляции IDE.
  • Балунинг памяти: драйвер virtio-balloon позволяет динамически возвращать неиспользуемую память от гостя хосту.
  • Энтропия: virtio-rng обеспечивает гостевую ОС криптографически стойкими случайными числами с хоста.
  • Файловые системы: virtio-fs (virtiofsd) монтирует директории хоста в гостевую ОС с производительностью, близкой к локальной.

Негативный пример: использование VirtIO-драйверов для Windows XP без заранее установленного пакета virtio-win приведёт к тому, что VM не загрузится с системного диска — ОС не найдёт контроллер хранилища. Всегда подключайте ISO virtio-win как второй CD-ROM перед установкой.

Технические детали

VirtIO использует механизм virtqueues — кольцевых буферов в разделяемой памяти между гостем и хостом. Гость помещает дескрипторы запросов в очередь, гипервизор обрабатывает их и возвращает результат без дорогостоящих VM-exit на каждую операцию.

Проверить, что VM использует VirtIO-устройства (внутри гостевой Linux):

lspci | grep -i virtio
lsmod | grep virtio
ls /sys/bus/virtio/drivers/

Создать VM с VirtIO-диском и сетью через virsh / virt-install:

virt-install --name testvm --ram 2048 --vcpus 2 
  --disk path=/var/lib/libvirt/images/testvm.qcow2,bus=virtio,size=20 
  --network network=default,model=virtio 
  --os-variant ubuntu22.04 
  --cdrom /tmp/ubuntu-22.04-server.iso

Проверить очереди virtio-net внутри гостя:

ethtool -l eth0
cat /proc/interrupts | grep virtio

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

Нужно ли устанавливать VirtIO-драйверы вручную в Linux?

Нет. В ядре Linux начиная с версии 2.6.25 драйверы virtio-net, virtio-blk и virtio-balloon включены по умолчанию. При создании VM на KVM/QEMU они подключаются автоматически при выборе модели устройства virtio.

Как установить VirtIO-драйверы в Windows на KVM?

Скачайте ISO-образ virtio-win с сайта Fedora Project или репозитория Red Hat, подключите его как виртуальный CD-ROM и запустите установщик virtio-win-guest-tools.exe. Это добавит драйверы для сети, диска, балунинга и RNG.

В чём разница между virtio-blk и virtio-scsi?

virtio-blk — более простой и быстрый протокол для одного диска, latency ниже на 5–10%. virtio-scsi поддерживает до 255 дисков на один контроллер, SCSI-команды (TRIM/UNMAP, TCQ) и горячее подключение дисков — предпочтителен для продакшн-серверов.

Поддерживает ли VirtIO живую миграцию VM?

Да. В отличие от PCI Passthrough, VirtIO-устройства не привязаны к конкретному железу хоста, поэтому live migration между узлами кластера (например, в Proxmox или OpenStack) работает без ограничений.