OpenBSD FAQ - Виртуализация [FAQ - На главную]



Вступление

OpenBSD поставляется с гипервизором vmm(4) и демоном vmd(8). Виртуальные машины могут быть сконфигурированы при помощи утилиты управления vmctl(8). Для этого используются значения и параметры из файла vm.conf(5).

Доступны следующие функции:

Следующие функции в настоящий момент недоступны: Поддерживаемые гостевые операционные системы в настоящее время ограничены OpenBSD и Linux. Поскольку поддержка VGA пока отсутствует, гостевая ОС должна поддерживать последовательную консоль.

Подготовка

Для использования vmm(4) требуется процессор с поддержкой вложенных страниц (nested paging support). Поддержка может быть проверена с помощью флагов функций процессора: SLAT для AMD или EPT для Intel. В некоторых случаях возможности виртуализации должны быть включены вручную в BIOS системы. После этого обязательно запустите команду fw_update(8), чтобы получить требуемый vmm-firmware.

Совместимость процессора может быть проверена с помощью следующей команды:

$ dmesg | egrep '(VMX/EPT|SVM/RVI)'
Прежде чем продолжить, включите и запустите службу vmd(8).
# rcctl enable vmd
# rcctl start vmd

Запуск VM

В следующем примере будет создана виртуальная машина с 50 ГБ дискового пространства и 1 ГБ ОЗУ. Онa загрузится из образа install74.iso.
# vmctl create -s 50G disk.qcow2
vmctl: qcow2 imagefile created
# vmctl start -m 1G -L -i 1 -r install74.iso -d disk.qcow2 example
vmctl: started vm 1 successfully, tty /dev/ttyp8
# vmctl show
   ID   PID VCPUS  MAXMEM  CURMEM     TTY        OWNER NAME
    1 72118     1    1.0G   88.1M   ttyp8         root example
Чтобы просмотреть консоль недавно созданной виртуальной машины, подключите ее к последовательной консоли:
# vmctl console example
Connected to /dev/ttyp8 (speed 115200)
Escape sequence ~. необходима, если требуется выйти из последовательной консоли. Для получения дополнительной информации см. справочную страницу cu(1). При использовании последовательной консоли vmctl через SSH, символ ~ (тильда) должен быть экранирован, чтобы ssh(1) не прервал соединение. Чтобы выйти из последовательной консоли через SSH, используйте ~~..

Остановить виртуальную машину можно при помощи vmctl(8).

# vmctl stop example
stopping vm: requested to shutdown vm 1
Виртуальные машины могут быть запущены с файлом vm.conf(5) или без него. Следующий пример /etc/vm.conf будет дублировать вышеуказанную конфигурацию:
vm "example" {
    memory 1G
    enable
    disk /home/user/disk.qcow2
    local interface
}
Некоторые свойства конфигурации в vm.conf(5) могут быть перезагружены vmd(8) на лету. Другие изменения, такие как настройка объема RAM или дискового пространства, требуют перезагрузки виртуальной машины.

Сеть

Доступ к сети для гостей vmm(4) можно настроить несколькими способами, четыре из которых подробно описаны в этом разделе.

В приведенных ниже примерах будут указаны различные диапазоны адресов IPv4 для разных вариантов использования:

Вариант 1 - виртуальные машины должны общаться только с хостом и друг с другом

Для этой настройки vmm использует локальные интерфейсы: интерфейсы, которые используют общее адресное пространство, определенное выше.

Использование флага -L vmctl(8) создает локальный интерфейс в гостевой системе, который будет получать адрес от vmd через DHCP. По сути, это создает два интерфейса: один для хоста, а другой для виртуальной машины.

Вариант 2 - NAT для виртуальных машин

Эта настройка основана на предыдущих и позволяет виртуальным машинам подключаться за пределами хоста. IP forwarding необходима для его работы.

Следующая строка в /etc/pf.conf включит NAT сетевых адресов и перенаправит DNS-запросы на указанный сервер:

match out on egress from 100.64.0.0/10 to any nat-to (egress)
pass in proto { udp tcp } from 100.64.0.0/10 to any port domain \
	rdr-to $dns_server port domain
Перезагрузите набор правил pf, и виртуальные машины могут подключаться к Интернету.

Вариант 3 - Дополнительный контроль над конфигурацией сети VM

Иногда вам может потребоваться дополнительный контроль над виртуальной сетью для ваших виртуальных машин, например, возможность устанавливать некоторые из них на свой виртуальный коммутатор. Это можно сделать с помощью интерфейса bridge(4) и vether(4).

Создайте интерфейс vether0 который будет иметь частный IPv4-адрес, как определено выше. В этом примере мы будем использовать подсеть 10.0.0.0/8.

# echo 'inet 10.0.0.1 255.255.255.0' > /etc/hostname.vether0
# sh /etc/netstart vether0
Создайте интерфейс bridge0 интерфейсом vether0 в качестве порта моста:
# echo 'add vether0' > /etc/hostname.bridge0
# sh /etc/netstart bridge0
Убедитесь, что NAT настроен правильно, если гостям в виртуальной сети нужен доступ за пределами физической машины. Скорректированная строка NAT в /etc/pf.conf может выглядеть так:
match out on egress from vether0:network to any nat-to (egress)
Следующие строки в vm.conf(5) могут использоваться для определения виртуального коммутатора:
switch "my_switch" {
    interface bridge0
}

vm "my_vm" {
    ...
    interface { switch "my_switch" }
}
my_vm гостевой системе my_vm теперь можно назначить vio0 адрес в сети 10.0.0.0/24 и установить маршрут по умолчанию 10.0.0.1.

Для удобства вы можете настроить DHCP-сервер на vether0.

Вариант 4 - виртуальные машины как реальные хосты в одной сети

В этом случае интерфейс виртуальной машины будет подключен к той же сети, что и хост, поэтому его можно настроить так, как если бы он был физически подключен к сети хоста. Эта опция работает только для устройств на основе Ethernet, так как стандарт IEEE 802.11 запрещает беспроводным интерфейсам участвовать в сетевых мостах.

Создайте интерфейс bridge0 с сетевым интерфейсом хоста в качестве порта моста. В этом примере сетевым интерфейсом хоста является em0 - вам следует заменить имя интерфейса, к которому вы хотите подключить виртуальную em0:

# echo 'add em0' > /etc/hostname.bridge0
# sh /etc/netstart bridge0
Как и в предыдущем примере, создайте или измените файл vm.conf(5), чтобы определить виртуальный коммутатор:
switch "my_switch" {
    interface bridge0
}

vm "my_vm" {
    ...
    interface { switch "my_switch" }
}
Гостевая my_vm теперь в сети хоста, как если бы он был физически подключен.

Примечание: Если сетевой интерфейс (em0 в приведенном выше примере) также настроен на использование DHCP, dhcpleased(8), работающий на этом же интерфейсе, может блокировать DHCP-запросы от гостевых виртуальных машин. В этом случае вам следует выбрать другой сетевой интерфейс, не использующий DHCP, или остановить все процессы dhcpleased(8), назначенные этому интерфейсу, перед запуском виртуальных машин, или же использовать статические IP-адреса для виртуальных машин.