Определение простыми словами
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) работает без ограничений.