Jump to content

# KVM (Русский)

4 languages

- English
- Español
- 日本語
- 中文（简体）

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

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

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

- Summary of hugetlbpage support in the Linux kernel
- Debian Wiki - Hugepages

### 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.

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

- KVM Howto
- KVM FAQ

Categories:

- Hypervisors (Русский)
- Kernel (Русский)