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 загрузится из образа install76.iso.
# vmctl create -s 50G disk.qcow2
vmctl: qcow2 imagefile created
# vmctl start -m 1G -L -i 1 -r install76.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

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

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

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

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

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

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

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

Сеть Ethernet будет переключаться между реальной сетью, хостом и виртуальной машиной с помощью veb(4). Поскольку veb(4) отключает интерфейсы, добавленные как порты, от стека IP, любая конфигурация IP на реальном интерфейсе должна быть перемещена на интерфейс vport(4), чтобы хост мог участвовать в сети. В этом примере em0 — это интерфейс, подключенный к реальной сети.

Скопируйте конфигурацию интерфейса em0 для нового vport0:

# mv /etc/hostname.em0 /etc/hostname.vport0
# echo up >> /etc/hostname.vport0
# echo up >> /etc/hostname.em0
# sh /etc/netstart em0 vport0

Создайте интерфейс veb0 и добавьте интерфейсы em0 и vport0:

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

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

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

Виртуальные машины могут быть подключены к реальной сети, но изолированы от хоста, путем исключения интерфейса vport в конфигурации выше.