KVM (Русский)
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.
Поддержка в ядре
Ядра 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 (Русский).
Советы и рекомендации
Вложенная виртуализация
Вложенная виртуализация позволяет запускать существующие виртуальные машины на других гипервизорах и облаках без внесения изменений в них или их сетевую конфигурацию.
На хост-машине включите вложенную виртуализацию для kvm_intel
:
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
Смотрите также:
Secure Boot
KVM Secure boot требует выполнения нескольких условий для включения:
- Вы должны использовать UEFI, скомпилированный с поддержкой secure boot.
- UEFI должен иметь записанные ключи.
Чтобы включить 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.