KVM (Русский)

Состояние перевода:
На этой странице представлен перевод статьи
KVM
. Дата последней синхронизации: 12 марта 2025. Вы можете
помочь
синхронизировать перевод, если в английской версии произошли
изменения
.
Ссылки по теме
Category:Hypervisors (Русский)
Libvirt
KVM
(
Kernel-based Virtual Machine
) — это
гипервизор
, встроенный в ядро Linux. Он похож по функциональности на
Xen
, но гораздо проще в настройке. В отличие от обычного
QEMU
, который использует эмуляцию, KVM — это специальный режим QEMU, который с помощью модуля ядра использует дополнительные инструкции процессора для виртуализации (
HVM
).
Используя KVM, вы можете запускать несколько виртуальных машин под управлением обыкновенных (не требующих патчей) GNU/Linux, Windows или любой другой операционной системой (смотрите
Guest Support Status
для дополнительной информации о поддерживаемых ОС). Каждая виртуальная машина имеет свой отдельный набор виртуального оборудования: сетевую карту, диск, видеокарту и т.д.
Отличия KVM от
Xen
,
VMware
или QEMU описаны в
KVM FAQ
.
В этой статье не рассказывается о возможностях эмуляторов, использующих KVM в качестве бэкенда. Обратитесь к связанным статьям, если вам это интересно.
Проверка поддержки KVM
Аппаратная поддержка
Для работы KVM необходимо, чтобы процессор хост-машины поддерживал технологию виртуализации (VT-x для процессоров Intel и AMD-V для процессоров AMD). Вы можете проверить, поддерживает ли ваш процессор аппаратную виртуализацию, выполнив следующую команду:
$ LC_ALL=C.UTF-8 lscpu | grep Virtualization
Или:
$ grep -E --color=auto 'vmx|svm|0xc0f' /proc/cpuinfo
Если после выполнения команды на экране ничего не выводится, тогда процессор вашего компьютера
не
поддерживает аппаратную виртуализацию, и вы
не
сможете использовать KVM.
Примечание
Возможно, поддержку виртуализации необходимо включить в BIOS. Все x86_64 процессоры, произведённые AMD и Intel в последние 10 лет, поддерживают виртуализацию. Если вышеприведённые команды показывают, что процессор не поддерживает виртуализацию, то почти наверняка она выключена в BIOS.
Поддержка в ядре
Ядра Arch Linux имеют необходимые
модули ядра
для работы KVM.
Вы можете проверить, что необходимые модули —
kvm
, а также либо
kvm_amd
, либо
kvm_intel
— доступны в ядре с помощью команды:
$ zgrep CONFIG_KVM= /proc/config.gz
Модуль доступен, если установлено значение
y
или
m
.
Далее убедитесь, что модули ядра автоматически загружены, с помощью команды:
$ lsmod | grep kvm
kvm_intel             245760  0
kvmgt                  28672  0
mdev                   20480  2 kvmgt,vfio_mdev
vfio                   32768  3 kvmgt,vfio_mdev,vfio_iommu_type1
kvm                   737280  2 kvmgt,kvm_intel
irqbypass              16384  1 kvm
Если команда ничего не возвращает, то модуль необходимо загрузить вручную; смотрите
Модуль ядра#Управление модулями вручную
.
Совет
Если загрузить модуль
kvm_intel
или
kvm_amd
не удаётся, но при этом модуль
kvm
успешно загружается и
lscpu
показывает, что аппаратная поддержка есть, то проверьте настройки виртуализации в BIOS. Некоторые производители, особенно производители ноутбуков, по умолчанию отключают в BIOS поддержку виртуализации. Определить, что в процессоре нет аппаратной поддержки виртуализации или что она выключена в BIOS, поможет чтение вывода
dmesg
после неудачной попытки загрузить необходимые модули ядра.
Паравиртуализация с Virtio
Паравиртуализация — это быстрый и эффективный способ для гостевой системы использовать устройства хост-машины. KVM предоставляет виртуальным машинам паравиртуализированные устройства посредством
Virtio
API. Это API служит прослойкой между гипервизором и гостевой системой.
Все устройства Virtio состоят из двух частей: хостового устройства и гостевого драйвера.
Поддержка в ядре
Выполните следующую команду
в виртуальной машине
, чтобы проверить, что модули VIRTIO доступны в ядре:
$ zgrep VIRTIO /proc/config.gz
Далее проверьте, что модули ядра автоматически загружены, выполнив команду:
$ lsmod | grep virtio
Если команды выше ничего не вернули, то
загрузите модули ядра
вручную.
Список паравиртуализированных устройств
сетевая карта (virtio-net)
блочное устройство (virtio-blk)
контроллер SCSI (virtio-scsi)
последовательное устройство (virtio-serial)
устройство balloon (память переменного объёма) (virtio-balloon)
Как пользоваться KVM
Смотрите основную статью:
QEMU (Русский)
.
Советы и рекомендации
Примечание
Смотрите
QEMU#Tips and tricks
и
QEMU/Troubleshooting
для общих советов и рекомендаций.
Вложенная виртуализация
Вложенная виртуализация позволяет запускать существующие виртуальные машины на других гипервизорах и облаках без внесения изменений в них или их сетевую конфигурацию.
На хост-машине включите вложенную виртуализацию для
kvm_intel
:
Примечание
Это же можно сделать для AMD, заменив
intel
на
amd
где необходимо.
# modprobe -r kvm_intel
# modprobe kvm_intel nested=1
Чтобы изменение сохранилось после перезагрузки, создайте файл (подробнее:
Модуль ядра#Настройка параметров модуля
):
/etc/modprobe.d/kvm_intel.conf
options kvm_intel nested=1
Убедитесь, что функция активирована:
$ cat /sys/module/kvm_intel/parameters/nested
Y
Включите режим «host passthrough», чтобы передать все возможности процессора в гостевую систему:
Если вы используете
QEMU
, запустите гостевую машину командой:
qemu-system-x86_64 -enable-kvm -cpu host
.
Если вы используете
virt-manager
, измените модель процессора на
host-passthrough
.
Если вы используете
virsh
, введите
virsh edit
vm-name
и замените строчку CPU на
<cpu mode='host-passthrough' check='partial'/>
Загрузите виртуальную машину и проверьте, установлен ли флаг
vmx
:
$ grep -E --color=auto 'vmx|svm' /proc/cpuinfo
Включение поддержки больших страниц (hugepages)
Вы, возможно, захотите включить поддержку больших страниц для повышения производительности виртуальной машины.
Если используется актуальный Arch Linux и модуль KVM включен, вероятно, всё необходимое уже есть. Проверьте, есть ли каталог
/dev/hugepages
. Если нет, то создайте его.
Также необходимы правильные права для его использования. По умолчанию он принадлежит пользователю и группе root, битовая маска режима доступа установлена в значение 0755, но нам нужно, чтобы все пользователи группы kvm имели доступ к hugepages.
Добавьте в свой
/etc/fstab
:
/etc/fstab
hugetlbfs       /dev/hugepages  hugetlbfs       mode=01770,gid=kvm        0 0
Вместо того, чтобы прямо указывать имя группы
gid=kvm
, вы, конечно, можете указать gid с помощью числа, но оно должно соответствовать группе
kvm
. Режим
1770
позволяет любому члену группы создавать файлы, но не разрешает удалять ссылки или переименовывать файлы других членов группы. Убедитесь, что
/dev/hugepages
смонтирована верно:
# umount /dev/hugepages
# mount /dev/hugepages
$ mount | grep huge
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,mode=1770,gid=78)
Теперь можно посчитать как много hugepages вам нужно. Проверьте размер hugepages командой:
$ grep Hugepagesize /proc/meminfo
Обычный размер - 2048 kB ≙ 2 MB. Допустим, вы хотите виртуальную машину с размером страниц 1024 MB. 1024 / 2 = 512. Добавим ещё немного, чтобы округлить до 550. Теперь укажите как много hugepages вам надо:
# sysctl -w vm.nr_hugepages=550
Если вы располагаете достаточным объёмом свободной памяти, то увидите:
$ grep HugePages_Total /proc/meminfo
HugesPages_Total:  550
Если число меньше, закройте ненужные программы или запустите вашу виртуальную машину, уменьшив объём её памяти (количество_страниц x 2):
$ qemu-system-x86_64 -enable-kvm -m 1024 -mem-path /dev/hugepages -hda <disk_image> [...]
Обратите внимание на параметр
-mem-path
. Он определяет использование hugepages.
Теперь, пока виртуальная машина работает, вы можете проверить, как много страниц использовано:
$ grep HugePages /proc/meminfo
HugePages_Total:     550
HugePages_Free:       48
HugePages_Rsvd:        6
HugePages_Surp:        0
Теперь, когда всё работает, вы можете, если хотите, включить hugepages по умолчанию. Создайте
/etc/sysctl.d/40-hugepage.conf
:
/etc/sysctl.d/40-hugepage.conf
vm.nr_hugepages = 550
Смотрите также:
Summary of hugetlbpage support in the Linux kernel
Debian Wiki - Hugepages
Secure Boot
KVM Secure boot требует выполнения нескольких условий для включения:
Вы должны использовать UEFI, скомпилированный с поддержкой secure boot.
UEFI должен иметь записанные ключи.
Примечание
Arch Linux не имеет secure boot ключей, как, например, Fedora. Если вы намереваетесь включить secure boot в Arch Linux, вы должны создать свой ключ и подписать ваше ядро после выполнения нижеописанных шагов. Смотрите
Unified Extensible Firmware Interface/Secure Boot
для дополнительной информации.
Чтобы включить UEFI с поддержкой secure boot, установите
edk2-ovmf
и укажите вашей виртуальной машине использовать UEFI с secure boot. Если вы используете
libvirt
, то можете сделать это, добавив следующие строки в XML файл конфигурации вашей виртуальной машины.
<os firmware="efi">
  <loader readonly="yes" secure="yes" type="pflash">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
</os>
Далее следует записать ключи. В данном примере мы запишем ключи secure boot от Microsoft и Redhat. Установите
virt-firmware
и выполните следующую команду, заменив
vm_name
именем вашей виртуальной машины.
$ virt-fw-vars --input /var/lib/libvirt/qemu/nvram/
vm_name
_VARS.fd --output /var/lib/libvirt/qemu/nvram/
vm_name
_SECURE_VARS.fd --secure-boot --enroll-redhat
Отредактируйте XML-файл конфигурации вашей виртуальной машины, указав на новый файл VARS.
<os firmware="efi">
  <loader readonly="yes" secure="yes" type="pflash">/usr/share/edk2/x64/OVMF_CODE.secboot.4m.fd</loader>
  <nvram template="/usr/share/edk2/x64/OVMF_VARS.4m.fd">/var/lib/libvirt/qemu/nvram/
{vm-name}
_SECURE_VARS.fd</nvram>
</os>
После этого secure boot должна быть автоматически включена. Можете перепроверить в BIOS виртуальной машины. Чтобы открыть интерфейс BIOS нажмите
F2
, когда увидите логотип загрузки UEFI.
Смотрите также
KVM Howto
KVM FAQ