KVM (Русский)

Состояние перевода: На этой странице представлен перевод статьи KVM. Дата последней синхронизации: 12 марта 2025. Вы можете помочь синхронизировать перевод, если в английской версии произошли изменения.

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», чтобы передать все возможности процессора в гостевую систему:

  1. Если вы используете QEMU, запустите гостевую машину командой: qemu-system-x86_64 -enable-kvm -cpu host.
  2. Если вы используете virt-manager, измените модель процессора на host-passthrough.
  3. Если вы используете 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

Смотрите также:

Secure Boot

KVM Secure boot требует выполнения нескольких условий для включения:

  1. Вы должны использовать UEFI, скомпилированный с поддержкой secure boot.
  2. 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.

Смотрите также

This article is issued from Archlinux. The text is licensed under Creative Commons - Attribution - Sharealike. Additional terms may apply for the media files.