
Глава 24. Виртуализация
Этот перевод может быть устаревшим. Для того, чтобы помочь с переводом, пожалуйста, обратитесь к Сервер переводов FreeBSD.
Содержание
24.1. Обзор
Программное обеспечение виртуализации позволяет нескольким операционным системам работать одновременно на одном компьютере. Такие программные системы для ПК часто включают основную операционную систему, которая запускает ПО виртуализации и поддерживает произвольное количество гостевых операционных систем.
Прочитайте эту главу, чтобы узнать:
Разница между основной операционной системой и гостевой операционной системой.
Как установить FreeBSD на следующие платформы виртуализации:
Parallels Desktop(Apple® macOS®)
VMware Fusion(Apple® macOS®)
VirtualBox™(Microsoft® Windows®, Apple® macOS® на базе Intel®, Linux)
QEMU(FreeBSD)
bhyve(FreeBSD)
Как настроить систему FreeBSD для достижения наилучшей производительности при виртуализации.
Прежде чем читать эту главу, необходимо:
Понимать основы UNIX® и FreeBSD.
Знать, как установить FreeBSD.
Уметь настраивать сетевое соединение, как описано в разделе по расширенной настройке сети.
Знать, как установить дополнительное стороннее программное обеспечение.
24.2. FreeBSD в качестве гостевой системы в Parallels Desktop для macOS®
Parallels Desktop for Mac® - это коммерческий программный продукт, доступный для компьютеров Apple® Mac® под управлением macOS® 10.14.6 или новее. FreeBSD является полностью поддерживаемой гостевой операционной системой. После установки Parallels на macOS® пользователь должен настроить виртуальную машину и затем установить желаемую гостевую операционную систему.
24.2.1. Установка FreeBSD на Parallels Desktop на Mac®
Первым шагом при установке FreeBSD на Parallels является создание новой виртуальной машины для установки FreeBSD.
Выберите Установка Windows или другой ОС с DVD или файла образа и продолжите.

Выберите файл образа FreeBSD.

Выберите Другое в качестве операционной системы.
Выбор FreeBSD приведет к ошибке загрузки при запуске. |

Назовите виртуальную машину и отметьте пункт Настроить параметры перед установкой (Customize settings before installation)

Когда появится окно конфигурации, перейдите на вкладку Hardware, выберите Boot order и нажмите Advanced. Затем выберите EFI 64-bit в качестве BIOS.

Нажмите OK, закройте окно конфигурации и нажмите Continue.

Виртуальная машина автоматически загрузится. Установите FreeBSD, следуя общим шагам.

24.2.2. Настройка FreeBSD на Parallels
После успешной установки FreeBSD на macOS® X с использованием Parallels, можно выполнить ряд шагов по настройке для оптимизации системы в виртуальной среде.
Установка переменных загрузчика
Самый важный шаг — уменьшить параметр
kern.hz, чтобы снизить использование CPU FreeBSD в среде Parallels. Это достигается добавлением следующей строки в /boot/loader.conf:kern.hz=100
Без этой настройки бездействующая гостевая система FreeBSD в Parallels будет использовать около 15% процессора однопроцессорного iMac®. После внесения изменений использование снизится до примерно 5%.
Если установлена FreeBSD 14.0 или более поздняя версия, а использование ЦП по-прежнему высокое, добавьте следующую строку в /boot/loader.conf:
debug.acpi.disabled="ged"
Создание нового файла конфигурации ядра
Настройка сети
Самая базовая настройка сети использует DHCP для подключения виртуальной машины к той же локальной сети, что и хост-компьютер Mac®. Это можно сделать, добавив
ifconfig_ed0="DHCP"в /etc/rc.conf. Более сложные настройки сети описаны в Расширенная настройка сети.
24.3. FreeBSD в качестве гостевой системы на VMware Fusion для macOS®
VMware Fusion для Mac® — это коммерческий программный продукт, доступный для компьютеров Apple® Mac® под управлением macOS® 12 или новее. FreeBSD является полностью поддерживаемой гостевой операционной системой. После установки VMware Fusion на macOS® пользователь может настроить виртуальную машину и установить желаемую гостевую операционную систему.
24.3.1. Установка FreeBSD на VMware Fusion
Первым шагом является запуск VMware Fusion, который загрузит библиотеку виртуальных машин. Нажмите , чтобы создать виртуальную машину:

Это запустит Мастер создания новой виртуальной машины. Выберите и нажмите , чтобы продолжить:

Выберите в качестве и либо , либо в качестве Версия при запросе:

Выберите прошивку (рекомендуется UEFI):

Выберите и нажмите :

Проверьте конфигурацию и нажмите :

Выберите имя виртуальной машины и каталог, в котором она будет сохранена:

Нажмите command+E, чтобы открыть настройки виртуальной машины, и выберите :

Выберите образ FreeBSD в формате ISO или с CD/DVD:

Запустите виртуальную машину:

Установите FreeBSD как обычно:

После завершения установки можно изменить параметры виртуальной машины, такие как использование памяти и количество процессоров, доступных виртуальной машине:
Настройки аппаратного обеспечения системы виртуальной машины нельзя изменить во время её работы. |

Состояние устройства CD-ROM. Обычно CD/DVD/ISO отключается от виртуальной машины, когда в нём больше нет необходимости.

Последнее, что нужно изменить, — это способ подключения виртуальной машины к сети. Чтобы разрешить подключения к виртуальной машине с других машин, кроме хоста, выберите . В противном случае предпочтительнее выбрать , чтобы виртуальная машина имела доступ в Интернет, но сеть не могла получить доступ к виртуальной машине.

После изменения настроек загрузите новую виртуальную машину с установленной FreeBSD.
24.3.2. Настройка FreeBSD на VMware Fusion
После успешной установки FreeBSD на macOS® X с использованием VMware Fusion можно выполнить ряд шагов по настройке для оптимизации системы в виртуальной среде.
Установка переменных загрузчика
Самый важный шаг — уменьшить параметр
kern.hz, чтобы снизить использование CPU FreeBSD в среде VMware Fusion. Это достигается добавлением следующей строки в /boot/loader.conf:kern.hz=100
Без этой настройки бездействующая гостевая система FreeBSD в VMware Fusion будет использовать около 15% процессора однопроцессорного iMac®. После внесения изменений использование снизится до примерно 5%.
Создание нового файла конфигурации ядра
Настройка сети
Самая базовая настройка сети использует DHCP для подключения виртуальной машины к той же локальной сети, что и хост-компьютер Mac®. Это можно сделать, добавив
ifconfig_em0="DHCP"в /etc/rc.conf. Более сложные настройки сети описаны в Сложные вопросы работы в сети.Установите драйверы и open-vm-tools
Для бесперебойной работы FreeBSD на VMWare необходимо установить драйверы:
# pkg install xf86-video-vmware xf86-input-vmmouse open-vm-tools
Пакеты xf86 доступны только для гостевых систем FreeBSD на архитектуре x86. |
Включение мыши
+ Некоторые пользователи сообщали о проблемах с использованием мыши в виртуальной машине. Мышь можно включить, добавив следующее в /boot/loader.conf:
+
# ums_load=“YES”
24.4. FreeBSD в качестве гостевой системы в VirtualBox™
FreeBSD хорошо работает в качестве гостевой системы в VirtualBox™. Это программное обеспечение виртуализации доступно для большинства распространённых операционных систем, включая саму FreeBSD.
Дополнения гостевой ОС VirtualBox™ обеспечивают поддержку:
Общий буфер обмена.
Интеграция указателя мыши.
Синхронизация времени хоста.
Масштабирование окна.
Бесшовный режим.
Эти команды выполняются в гостевой системе FreeBSD. |
Сначала установите пакет или порт emulators/virtualbox-ose-additions` в гостевой системе FreeBSD. Это установит порт:
# cd /usr/ports/emulators/virtualbox-ose-additions && make install cleanДобавьте следующие строки в файл /etc/rc.conf:
vboxguest_enable="YES" vboxservice_enable="YES"
Если используется ntpd(8) или ntpdate(8), отключите синхронизацию времени хоста:
vboxservice_flags="--disable-timesync"
Xorg автоматически распознает драйвер vboxvideo. Его также можно вручную добавить в /etc/X11/xorg.conf:
Section "Device" Identifier "Card0" Driver "vboxvideo" VendorName "InnoTek Systemberatung GmbH" BoardName "VirtualBox Graphics Adapter" EndSection
Чтобы использовать драйвер vboxmouse, измените раздел мыши в /etc/X11/xorg.conf:
Section "InputDevice" Identifier "Mouse0" Driver "vboxmouse" EndSection
Общие папки для передачи файлов между хостом и виртуальной машиной доступны путем их монтирования с помощью mount_vboxvfs. Общую папку можно создать на хосте через графический интерфейс VirtualBox или с помощью vboxmanage. Например, чтобы создать общую папку с именем myshare в /mnt/bsdboxshare для виртуальной машины с именем BSDBox, выполните:
# vboxmanage sharedfolder add 'BSDBox' --name myshare --hostpath /mnt/bsdboxshareОбратите внимание, что имя общей папки не должно содержать пробелов. Подключите общую папку из гостевой системы следующим образом:
# mount_vboxvfs -w myshare /mnt24.5. FreeBSD в качестве хоста с VirtualBox™
VirtualBox™ — это активно развивающийся комплексный пакет виртуализации, доступный для большинства операционных систем, включая Windows®, macOS®, Linux® и FreeBSD. Он одинаково хорошо подходит для запуска гостевых систем Windows® или UNIX®-подобных ОС. Программа распространяется как открытое программное обеспечение, но с проприетарными компонентами, доступными в отдельном пакете расширений. Эти компоненты включают поддержку устройств USB 2.0. Дополнительную информацию можно найти на странице загрузок вики VirtualBox™. В настоящее время эти расширения недоступны для FreeBSD.
24.5.1. Установка VirtualBox™
VirtualBox™ доступен в FreeBSD как пакет или порт в emulators/virtualbox-ose. Порт можно установить с помощью следующих команд:
# cd /usr/ports/emulators/virtualbox-ose
# make install cleanОдна полезная опция в меню настройки порта — набор программ GuestAdditions. Они предоставляют ряд полезных функций в гостевых операционных системах, таких как интеграция указателя мыши (позволяя использовать мышь совместно между хостом и гостем без необходимости нажатия специальной комбинации клавиш для переключения) и ускоренный рендеринг видео, особенно в гостевых системах Windows®. Гостевые дополнения доступны в меню Devices после завершения установки гостевой системы.
Для начала работы с VirtualBox™ необходимо внести несколько изменений в конфигурацию. Порт устанавливает модуль ядра в /boot/modules, который должен быть загружен в работающее ядро:
# kldload vboxdrvЧтобы модуль всегда загружался после перезагрузки, добавьте эту строку в /boot/loader.conf:
vboxdrv_load="YES"
Для использования модулей ядра, которые позволяют организовать мостовую или гостевую сеть, добавьте следующую строку в /etc/rc.conf и перезагрузите компьютер:
vboxnet_enable="YES"
Группа vboxusers создается во время установки VirtualBox™. Все пользователи, которым необходим доступ к VirtualBox™, должны быть добавлены в эту группу. Для добавления новых участников можно использовать pw:
# pw groupmod vboxusers -m usernameНастройки прав доступа по умолчанию для /dev/vboxnetctl являются ограничительными и требуют изменения для работы мостового соединения:
# chown root:vboxusers /dev/vboxnetctl
# chmod 0660 /dev/vboxnetctlЧтобы сделать это изменение прав постоянным, добавьте следующие строки в /etc/devfs.conf:
own vboxnetctl root:vboxusers perm vboxnetctl 0660
Для запуска VirtualBox™ введите в сеансе Xorg:
% VirtualBoxДля получения дополнительной информации о настройке и использовании VirtualBox™ обратитесь к официальному сайту. Информация, относящаяся к FreeBSD, и инструкции по устранению проблем доступны на соответствующей странице wiki FreeBSD.
24.5.2. Поддержка USB в VirtualBox™
В VirtualBox™ можно настроить передачу USB-устройств в гостевую операционную систему. Хост-контроллер версии OSE ограничен эмуляцией USB 1.1 устройств до тех пор, пока расширение, поддерживающее USB 2.0 и 3.0 устройства, не станет доступным в FreeBSD.
Чтобы VirtualBox™ мог обнаруживать USB-устройства, подключённые к машине, пользователь должен быть членом группы operator.
# pw groupmod operator -m usernameЗатем добавьте следующее в /etc/devfs.rules или создайте этот файл, если он ещё не существует:
[system=10] add path 'usb/*' mode 0660 group operator
Чтобы загрузить эти новые правила, добавьте следующее в /etc/rc.conf:
devfs_system_ruleset="system"
Затем перезапустите devfs:
# service devfs restartПерезапустите сеанс входа и VirtualBox™, чтобы изменения вступили в силу, и при необходимости создайте фильтры USB.
24.5.3. Виртуальный DVD/CD-доступ хоста VirtualBox™
Доступ к DVD/CD-приводам хоста из гостевых систем обеспечивается путем совместного использования физических приводов. В VirtualBox™ это настраивается в окне Хранилище (Storage) в настройках (Settings) виртуальной машины. При необходимости сначала создайте пустое устройство IDECD/DVD. Затем выберите Привод хоста (Host drive) из всплывающего меню для выбора виртуального привода CD/DVD. Появится флажок с меткой Сквозной доступ (Passthrough). Это позволяет виртуальной машине использовать оборудование напрямую. Например, аудио-CD или записывающее устройство будут работать только при выборе этой опции.
Для того чтобы пользователи могли использовать функции VirtualBox™ для работы с DVD/CD, им необходим доступ к /dev/xpt0, /dev/cdN и /dev/passN. Обычно это достигается путем добавления пользователя в группу operator. Права доступа к этим устройствам можно настроить, добавив следующие строки в /etc/devfs.conf:
perm cd* 0660 perm xpt0 0660 perm pass* 0660
# service devfs restart24.6. Виртуализация с QEMU на FreeBSD
QEMU — это универсальный эмулятор и виртуализатор машин, представляющий собой полностью открытое программное обеспечение. Он разрабатывается большим активным сообществом и поддерживает FreeBSD, OpenBSD, NetBSD, а также другие операционные системы.
QEMU можно использовать несколькими способами. Наиболее распространённый — это эмуляция системы, при которой предоставляется виртуальная модель всей машины (процессор, память и эмулируемые устройства) для запуска гостевой ОС. В этом режиме процессор может быть полностью эмулирован или работать с гипервизором, таким как
KVM,XenилиHypervisor.Framework, что позволяет гостевой системе выполняться непосредственно на процессоре хоста.Второй поддерживаемый способ использования QEMU — это эмуляция пользовательского режима, при которой QEMU может запускать процессы, скомпилированные для одного ЦП, на другом ЦП. В этом режиме ЦП всегда эмулируется.
QEMU также предоставляет ряд автономных утилит командной строки, таких как утилита для работы с образами дисков qemu-img(1), которая позволяет создавать, преобразовывать и изменять образы дисков.
QEMU может эмулировать широкий спектр архитектур, включая Arm™, i386, x86_64, MIPS™, s390X, SPARC™ (Sparc™ и Sparc64™), и другие. Список целевых систем QEMU System Emulator регулярно обновляется.
Этот раздел описывает, как использовать QEMU для системной эмуляции и эмуляции пользовательского режима в FreeBSD, а также содержит примеры использования команд QEMU и утилит командной строки.
24.6.1. Установка программы QEMU
QEMU доступен в виде пакета FreeBSD или порта в emulators/qemu. Сборка пакета включает разумные опции и настройки по умолчанию для большинства пользователей и является рекомендуемым способом установки.
# pkg install qemuУстановка пакета включает несколько зависимостей. После завершения установки создайте ссылку на основную версию QEMU для хоста, которая будет использоваться чаще всего. Если хост — 64-битная система Intel™ или AMD™, это будет:
# ln -s /usr/local/bin/qemu-system-x86_64 /usr/local/bin/qemuПротестируйте установку, выполнив следующую команду от имени непривилегированного пользователя:
% qemuОткрывается окно, в котором QEMU активно пытается загрузиться с жёсткого диска, дискеты, DVD/CD и PXE. Пока ничего не настроено, поэтому команда выдаст несколько ошибок и завершится сообщением «No bootable device» (Нет загрузочного устройства), как показано на рисунке 1. Тем не менее, это подтверждает, что ПО QEMU установлено корректно.

Рисунок 1. QEMU без загрузочного образа
24.6.2. Установка виртуальной машины
QEMU находится в стадии активной разработки. Возможности и параметры команд могут меняться от одной версии к другой. В этом разделе приведены примеры, разработанные с использованием QEMU версии 9.0.1 (лето 2024 года). В случае сомнений всегда обращайтесь к документации QEMU, особенно к странице О QEMU, где содержатся ссылки на поддерживаемые платформы сборки, эмуляцию, устаревшие и удалённые возможности. |
Выполните следующие шаги, чтобы создать две виртуальные машины с именами left и right. Большинство команд можно выполнять без привилегий root.
Создайте тестовую среду для работы с QEMU:
% mkdir -p ~/QEMU ~/QEMU/SCRIPTS ~/QEMU/ISO ~/QEMU/VMКаталог SCRIPTS предназначен для стартовых скриптов и утилит. Каталог ISO содержит загрузочные ISO-образы для гостевых систем. В каталоге VM хранятся образы виртуальных машин (
ВМ).Скачайте свежую копию FreeBSD в ~/QEMU/ISO:
% cd ~/QEMU/ISO % fetch https://download.freebsd.org/releases/ISO-IMAGES/14.1/FreeBSD-14.1-RELEASE-amd64-bootonly.isoПосле завершения загрузки создайте сокращенную ссылку. Эта сокращенная ссылка используется в скриптах запуска ниже.
% ln -s FreeBSD-14.1-RELEASE-amd64-bootonly.iso fbsd.isoПерейдите в каталог для виртуальных машин (~/QEMU/VM). Запустите qemu-img(1) для создания образов дисков виртуальной машины "left":
% cd ~/QEMU/VM % qemu-img create -f raw left.img 15GФормат
rawв QEMU предназначен для обеспечения высокой производительности. Этот формат прост и не имеет накладных расходов, что делает его быстрее, особенно в сценариях с высокой производительностью или высокой пропускной способностью. Он используется в случаях, когда требуется максимальная производительность, а дополнительные функции, такие как снимки состояния, не нужны. Этот формат используется в скрипте для виртуальной машины "left", приведённой ниже.Отдельным форматом является
qcow2, который использует технологию QEMU "копирования при записи" для управления дисковым пространством. Эта технология не требует полного диска размером 15G, а лишь заготовку, которой напрямую управляет виртуальная машина. Диск растёт динамически по мере записи данных виртуальной машиной. Этот формат поддерживает снимки состояния, сжатие и шифрование. Его применение целесообразно в разработке, тестировании и сценариях, требующих этих расширенных возможностей. Данный формат используется в скрипте для виртуальной машины "right" ниже.Снова выполните qemu-img(1), чтобы создать образ диска для ВМ "right", используя
qcow2:% qemu-img create -f qcow2 -o preallocation=full,cluster_size=512K,lazy_refcounts=on right.qcow2 20GЧтобы увидеть фактический размер файла, используйте:
% du -Ah right.qcow2Настройте сеть для обеих виртуальных машин с помощью следующих команд. В этом примере сетевой интерфейс хоста —
em0. При необходимости измените его в соответствии с интерфейсом вашей системы. Это необходимо выполнять после каждой перезагрузки хоста, чтобы обеспечить возможность обмена данными для гостевых QEMU ВМ.# ifconfig tap0 create # ifconfig tap1 create # sysctl net.link.tap.up_on_open=1 net.link.tap.up_on_open: 0 -> 1 # sysctl net.link.tap.user_open=1 net.link.tap.user_open: 0 -> 1 # ifconfig bridge0 create # ifconfig bridge0 addm tap0 addm tap1 addm em0 # ifconfig bridge0 upПриведенные выше команды создают два устройства tap(4) (
tap0,tap1) и одно устройство if_bridge(4) (bridge0). Затем они добавляют устройстваtapи интерфейс локального хоста (em0) вbridge, а также устанавливают две записи sysctl(8), чтобы разрешить обычным пользователям открывать устройство tap. Эти команды позволят виртуальным машинам взаимодействовать с сетевым стеком на хосте.Перейдите в ~/QEMU/SCRIPTS и используйте следующий скрипт для запуска первой виртуальной машины — "left". Этот скрипт использует диск QEMU в формате raw.
/usr/local/bin/qemu-system-x86_64 -monitor none \ -cpu qemu64 \ -vga std \ -m 4096 \ -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -blockdev driver=file,aio=threads,node-name=imgleft,filename=../VM/left.img \ -blockdev driver=raw,node-name=drive0,file=imgleft \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap0,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:20:6c:65:66:74 \ -name \"left\"
Сохраните приведённый выше код в файл (например, |
QEMU запустит виртуальную машину в отдельном окне и загрузит FreeBSD iso, как показано на рисунке 2. Все параметры команд, такие как -cpu и -boot, полностью описаны в man-странице QEMU qemu(1).
Если в окне консоли QEMU кликнуть мышкой , QEMU «захватит» мышь, как показано в Рисунок 3. Нажмите Ctrl+Alt+G, чтобы освободить мышь. |

Рисунок 3. Когда QEMU захватил мышь
На FreeBSD первоначальная установка QEMU может быть несколько медленной. Это происходит потому, что эмулятор записывает форматирование файловой системы и метаданные при первом использовании диска. Последующие операции, как правило, выполняются значительно быстрее. |
Во время установки следует обратить внимание на несколько моментов:
Выберите использование UFS в качестве файловой системы. ZFS работает неэффективно при небольшом объеме памяти.
Для использования сети настройте DHCP. При необходимости настройте IPv6, если он поддерживается локальной сетью.
При добавлении пользователя по умолчанию убедитесь, что он является членом группы wheel.
После завершения установки виртуальная машина перезагружается в только что установленный образ FreeBSD.
Войдите как root и обновите систему следующим образом:
# freebsd-update fetch install
# rebootПосле успешной установки QEMU загрузит операционную систему, установленную на диске, а не программу установки. |
QEMU поддерживает параметр |
Войдите снова как root и добавьте любые необходимые пакеты. Чтобы использовать систему X Window в гостевой системе, см. раздел «Использование системы X Window» ниже.
Завершена настройка виртуальной машины "left".
Для установки виртуальной машины "right" выполните следующий скрипт. Этот скрипт содержит необходимые изменения для tap1, format=qcow2, имени файла образа, MAC-адреса и названия окна терминала. При желании можно добавить параметр "-runas", как описано в примечании выше.
/usr/local/bin/qemu-system-x86_64 -monitor none \ -cpu qemu64 \ -vga cirrus \ -m 4096 -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -drive if=none,id=drive0,cache=writeback,aio=threads,format=qcow2,discard=unmap,file=../VM/right.qcow2 \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap1,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:72:69:67:68:74 \ -name \"right\"
После завершения установки обе машины "left" и "right" могут взаимодействовать друг с другом и с хостом. Если на хосте действуют строгие правила брендмауэра, рассмотрите возможность добавления или изменения правил для разрешения взаимодействия между мостом (bridge) и устройствами tap.
24.6.3. Советы по использованию
24.6.3.1. Использование системы X Window
Установка Xorg описывает, как настроить систему X Window. Обратитесь к этому руководству для первоначальной настройки X Window, затем ознакомьтесь с Среды рабочего стола, чтобы настроить полноценную рабочую среду.
Этот раздел демонстрирует использование рабочего стола XFCE.
После завершения установки войдите в систему как обычный пользователь, затем введите:
% startxМенеджер окон XFCE4 должен запуститься и предоставить рабочий графический рабочий стол, как на рисунке 4. При первом запуске отображение рабочего стола может занять до минуты. Подробности использования см. в документации на сайте XFCE.

Рисунок 4. Обе виртуальные машины QEMU
Добавление дополнительной памяти в гостевую систему может ускорить работу графического интерфейса пользователя. |
Здесь на виртуальной машине "left" установлена система X Window, а виртуальная машина "right" всё ещё находится в текстовом режиме.
24.6.3.2. Использование окна QEMU
Окно QEMU функционирует как полноценная консоль FreeBSD и способно работать с несколькими виртуальными терминалами, как и система на реальном оборудовании.
Для переключения на другую виртуальную консоль кликните в окно QEMU и нажмите Alt+F2 или Alt+F3. FreeBSD должна переключиться на другую виртуальную консоль. Рисунок 5 показывает ВМ "left" с виртуальной консолью на ttyv3.

Рисунок 5. Переключение на другую виртуальную консоль в окне QEMU
Текущий менеджер рабочего стола или оконный менеджер на хосте может быть уже настроен на другое действие для комбинаций клавиш Alt+F1, Alt+F2. В таком случае попробуйте нажать Ctrl+Alt+F1, Ctrl+Alt+F2 или другую подобную комбинацию. Подробности смотрите в документации вашего оконного менеджера или менеджера рабочего стола. |
24.6.3.3. Использование меню окна QEMU
Еще одна особенность окна QEMU — это меню View и элементы управления масштабом. Наиболее полезным является пункт Zoom to Fit. При выборе этого пункта меню появляется возможность изменить размер окна QEMU, перетаскивая его углы. На рисунке 6 показан эффект изменения размера окна "left" в графическом режиме.

Рисунок 6. Использование опции
Zoom to Fit в меню View24.6.3.4. Другие пункты меню окна QEMU
Также в меню View отображаются
Опции
cirrus-vga,serial0иparallel0. Они позволяют переключать ввод/вывод на выбранное устройство.
Окно QEMU в меню Machine предоставляет четыре типа управления гостевой виртуальной машиной:
Pauseпозволяет приостановить виртуальную машину QEMU. Это может быть полезно для остановки быстро прокручивающегося окна.Resetнемедленно возвращает виртуальную машину в исходное состояние, как "при включении питания". Как и с реальной машиной, это не рекомендуется, если в этом нет крайней необходимости.Power Downимитирует сигнал отключения ACPI, и операционная система выполняет аккуратное завершение работы.Quitнемедленно выключает виртуальную машину — также не рекомендуется, если в этом нет необходимости.
24.6.4. Добавление интерфейса последовательного порта к гостевой ВМ
Для использования последовательной консоли гостевая ВМ под управлением FreeBSD должна добавить
console="comconsole"
в /boot/loader.conf для разрешения использования последовательной консоли FreeBSD.
Обновлённая конфигурация ниже показывает, как реализовать последовательную консоль на гостевой ВМ. Запустите скрипт для старта ВМ.
# left+serial.sh echo echo "NOTE: telnet startup server running on guest VM!" echo "To start QEMU, start another session and telnet to localhost port 4410" echo /usr/local/bin/qemu-system-x86_64 -monitor none \ -serial telnet:localhost:4410,server=on,wait=on\ -cpu qemu64 \ -vga std \ -m 4096 \ -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -blockdev driver=file,aio=threads,node-name=imgleft,filename=../VM/left.img \ -blockdev driver=raw,node-name=drive0,file=imgleft \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap0,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:20:6c:65:66:74 \ -name \"left\"

Рисунок 7. Включение последовательного порта через TCP
На рисунке 7 последовательный порт перенаправляется на TCP-порт хост-системы при запуске ВМ, а монитор QEMU ожидает (wait=on), активируя гостевую ВМ только после установления соединения telnet(1) с указанным портом localhost. После получения соединения из отдельного сеанса система FreeBSD начинает загрузку и ищет директиву консоли в /boot/loader.conf. С директивой "console=comconsole" FreeBSD запускает консольный сеанс на последовательном порту. Монитор QEMU обнаруживает это и направляет необходимый символьный ввод-вывод с этого последовательного порта в telnet-сеанс на хосте. Система загружается, и после завершения загрузки приглашения для входа в систему становятся доступными на последовательном порту (ttyu0) и на консоли (ttyv0).
Важно отметить, что этот последовательный перенаправление через TCP происходит вне виртуальной машины. Нет взаимодействия с какой-либо сетью внутри виртуальной машины, и поэтому оно не подчиняется никаким правилам брандмауэра. Представьте это как простой терминал, подключенный к RS-232 или USB-порту на реальном компьютере.
24.6.4.1. Заметки об использовании последовательной консоли
На последовательной консоли, если размер окна изменен, выполните resizewin(1), чтобы обновить размер терминала.
Может быть желательно (или даже необходимо) остановить отправку сообщений syslog на консоль (как консоль QEMU, так и последовательный порт). Подробности о перенаправлении сообщений консоли можно найти в syslog.conf(5).
После обновления файла /boot/loader.conf для разрешения использования последовательной консоли гостевая ВМ будет пытаться загружаться с последовательного порта при каждом запуске. Убедитесь, что последовательный порт включен, как показано в приведённом выше листинге, или измените файл /boot/loader.conf, чтобы не требовать использования последовательной консоли. |
24.6.5. Эмуляция пользовательского режима QEMU
QEMU также поддерживает выполнение приложений, скомпилированных для архитектуры, отличной от архитектуры основного процессора. Например, можно запустить операционную систему архитектуры Sparc64 на хосте с архитектурой x86_64. Это демонстрируется в следующем разделе.
24.6.5.1. Настройка гостевой ВМ SPARC64 на хосте x86_64
Настройка новой виртуальной машины с архитектурой, отличной от архитектуры хоста, включает несколько шагов:
Получение программного обеспечения, которое будет работать на гостевой ВМ
Создание нового образа диска для гостевой ВМ
Настройка нового скрипта QEMU с новой архитектурой
Выполнение установки
В следующей процедуре используется копия программного обеспечения OpenBSD 6.8 SPARC64 для этого упражнения по эмуляции пользовательского режима QEMU.
Не все версии OpenBSD Sparc64 работают в QEMU. Известно, что OpenBSD версии 6.8 работает, и она была выбрана в качестве примера для этого раздела. |
Скачать OpenBSD 6.8 Sparc64 из архива OpenBSD.
На сайтах загрузки OpenBSD поддерживаются только самые последние версии. Для получения предыдущих выпусков необходимо искать в архиве.
% cd ~/QEMU/ISO % fetch https://mirror.planetunix.net/pub/OpenBSD-archive/6.8/sparc64/install68.isoСоздание нового образа диска для виртуальной машины Sparc64 аналогично описанному выше для "правильной" виртуальной машины. В данном случае используется формат диска QEMU qcow2:
% cd ~/QEMU/VM qemu-img create -f qcow2 -o preallocation=full,lazy_refcounts=on sparc64.qcow2 16GИспользуйте приведенный ниже скрипт для новой архитектуры Sparc64. Как и в предыдущем примере, запустите скрипт, затем начните новую сессию и подключитесь через
telnetк localhost на указанном порту:echo echo "NOTE: telnet startup server running on guest VM!" echo "To start QEMU, start another session and telnet to localhost port 4410" echo /usr/local/bin/qemu-system-sparc64 \ -serial telnet:localhost:4410,server=on,wait=on \ -machine sun4u,usb=off \ -smp 1,sockets=1,cores=1,threads=1 \ -rtc base=utc \ -m 1024 \ -boot d \ -drive file=../VM/sparc64.qcow2,if=none,id=drive-ide0-0-1,format=qcow2,cache=none \ -cdrom ../ISO/install68.iso \ -device ide-hd,bus=ide.0,unit=0,drive=drive-ide0-0-1,id=ide0-0-1 \ -msg timestamp=on \ -net nic,model=sunhme -net user \ -nographic \ -name \"sparc64\"
Обратите внимание на следующее:
Опция
-boot dзагружает систему с устройства CDROM QEMU, которое указано как-cdrom ../ISO/install68.iso.Как и ранее, параметр сервера
telnetнастроен на ожидание отдельного подключения на порту 4410. Запустите еще один сеанс и используйте telnet(1) для подключения к localhost на порту 4410.Скрипт устанавливает опцию
-nographic, что означает использование только ввода/вывода через последовательный порт. Графический интерфейс отсутствует.Сетевое взаимодействие не настраивается через комбинацию tap(4) / if_bridge(4). В этом примере используется отдельный метод сетевого взаимодействия QEMU, известный как "Serial Line Internet Protocol" (SLIRP), иногда называемый "User Mode Networking". Документация по этому и другим методам сетевого взаимодействия QEMU находится здесь: Документация по сетевому взаимодействию QEMU
Если все настроено правильно, система загрузится, как показано на рисунке 8.

Рисунок 8. QEMU Загрузка OpenBSD 6.8 Sparc64 с CDROM с эмуляцией пользовательского режима
После установки системы измените скрипт и замените параметр загрузки на -boot c. Это укажет QEMU загружаться с предоставленного жесткого диска, а не с CDROM.
Установленная система может использоваться как любая другая гостевая виртуальная машина. Однако, базовая архитектура гостевой системы — Sparc64, а не x86_64.
Если система остановлена на приглашении консоли OpenBios |

Рисунок 9. QEMU Загрузка с CDROM с эмуляцией пользовательского режима
24.6.6. Использование монитора QEMU
Монитор QEMU управляет работающим эмулятором QEMU (гостевой виртуальной машиной).
Используя монитор, можно:
Динамически удалять или добавлять устройства, включая диски, сетевые интерфейсы, CD-ROM или дисководы гибких дисков
Заморозить/разморозить гостевую ВМ и сохранить или восстановить её состояние из файла на диске
Собрать информацию о состоянии ВМ и устройств
Изменить настройки устройств на лету
А также сделать множество других операций.
Наиболее распространённые способы использования монитора — это проверка состояния виртуальной машины, а также добавление, удаление или изменение устройств. Некоторые операции, такие как миграция, доступны только при использовании гипервизоров с ускорением, например KVM, Xen и т.д., и не поддерживаются на хостах FreeBSD.
При использовании графической среды рабочего стола самый простой способ доступа к монитору QEMU — это опция -monitor stdio при запуске QEMU из терминала.
# /usr/local/bin/qemu-system-x86_64 -monitor stdio \ -cpu qemu64 \ -vga cirrus \ -m 4096 -smp 4 \ ...
Это приводит к появлению новой строки приглашения (qemu) в окне терминала, как показано на рисунке 10.

Рисунок 10. Приглашение монитора QEMU и команда "stop"
На изображении также показано, что команда stop замораживает систему во время последовательности загрузки FreeBSD. Система останется замороженной до тех пор, пока в мониторе не будет введена команда cont.
24.6.6.1. Добавление нового диска в виртуальную машину
Чтобы добавить новый диск к работающей виртуальной машине, его необходимо подготовить, как описано выше:
% cd ~/QEMU/VM
% qemu-img create -f raw new10G.img 10GРисунок 11 показывает последовательность команд в мониторе, необходимую для добавления нового диска в виртуальную машину. После добавления устройства с помощью команды device_add в мониторе оно появляется на консоли системы FreeBSD, как показано в нижней части рисунка. Диск можно настроить по необходимости.
Обратите внимание, что новый диск должен быть добавлен в стартовый скрипт, если он будет использоваться после перезагрузки виртуальной машины.

Рисунок 11. Команды монитора QEMU для добавления нового диска
24.6.6.2. Использование монитора QEMU для управления снимками
Документация QEMU описывает несколько схожих концепций, используя термин снимок (snapshot). Существует опция -snapshot в командной строке, которая означает использование диска или его части для хранения копии устройства. Также есть команды монитора snapshot_blkdev и snapshot_blkdev_internal, описывающие сам процесс копирования блочного устройства. Наконец, команды монитора savevm, loadvm и delvm относятся к созданию, сохранению, загрузке или удалению копии всей виртуальной машины. Вместе с последними, команда монитора info snapshots выводит детали недавних снимков состояния.
Этот раздел посвящён созданию, сохранению и загрузке полного образа ВМ и использует термин снимок для этой цели.
Для начала заново создайте виртуальную машину "left", на этот раз используя формат qcow2.
% cd ~/QEMU/VM
% rm left.img
% qemu-img create -f qcow2 left.qcow2 16G # Clean file for a new FreeBSD installation.
% cd ../SCRIPTS
# /bin/sh left.sh # See the below program listing.После завершения установки перезагрузите систему, на этот раз с использованием опции -monitor stdio, чтобы обеспечить доступ к монитору.
# left VM script. /usr/local/bin/qemu-system-x86_64 -monitor stdio \ -cpu qemu64 \ -vga std \ -m 4096 \ -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -blockdev driver=file,aio=threads,node-name=imgleft,filename=../VM/left.qcow2 \ -blockdev driver=qcow2,node-name=drive0,file=imgleft \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap0,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:20:6c:65:66:74 \ -name \"left\"
Для демонстрации работы снимков можно использовать следующую процедуру:
Установите FreeBSD с нуля
Подготовьте окружение и создайте снимок состояния с помощью команды монитора
savevmУстановите несколько пакетов
Выключите систему
Перезапустите экземпляр QEMU без оболочки и используйте команду монитора
loadvmдля восстановления ВМОбратите внимание, что восстановленная ВМ не имеет установленных пакетов
На этапе «Подготовка окружения» в отдельной виртуальной консоли (ttyv1) запускается сеанс редактирования в vi(1), имитирующий активность пользователя. При желании можно запустить дополнительные программы. Снимок должен учитывать состояние всех приложений, работающих на момент его создания.
Рисунок 12 показывает новую установленную систему FreeBSD без пакетов, а также отдельно сеанс редактирования на ttyv1. Редактор vi(1) в данный момент находится в режиме insert, и пользователь набирает слово "broadcast".

Рисунок 12. Виртуальная машина QEMU перед первым снимком состояния
Чтобы создать снимок состояния, введите savevm в мониторе. Убедитесь, что указали метку (например, original_install).
QEMU 9.0.1 monitor - type 'help' for more information
(qemu)
(qemu) savevm original_installДалее, в главном окне консоли, установите пакет, например zip(1), который не имеет зависимостей. После завершения установки вернитесь в монитор и создайте ещё один снимок состояния (snap1_pkg+zip).
Рисунок 13 показывает результаты выполненных выше команд и вывод команды info shapshots.

Рисунок 13. QEMU — Использование команд монитора для создания снимков состояния
Перезагрузите систему, и до запуска FreeBSD переключитесь на монитор и введите stop. Виртуальная машина остановится.
Введите loadvm с тегом, который вы использовали ранее (здесь original_install).
QEMU 9.0.1 monitor - type 'help' for more information
(qemu) stop
(qemu) loadvm original_install
(qemu) contСразу же экран виртуальной машины переключится на тот момент, когда была введена команда savevm, как указано выше. Обратите внимание, что виртуальная машина всё ещё остановлена.
Введите cont, чтобы запустить ВМ, переключитесь на сеанс редактирования на ttyv1 и наберите одну букву на клавиатуре. Редактор, всё ещё находящийся в режиме вставки, должен отреагировать соответствующим образом. Любые другие программы, работавшие в момент создания снимка, не должны быть затронуты.
Приведенные выше шаги показывают, как можно создать снимок состояния, изменить систему, а затем «откатить» изменения, восстановив предыдущий снимок.
По умолчанию QEMU хранит данные снимков в том же файле, что и образ. Просмотреть список снимков можно с помощью qemu-img(1), как показано ниже в Рисунок 14.

Рисунок 14. QEMU Использование qemu-img(1) для проверки снимков
24.6.7. Использование USB-устройств в QEMU
QEMU поддерживает создание виртуальных USB-устройств, которые используют файл образа. Это виртуальные USB-устройства, которые можно разбивать на разделы, форматировать, монтировать и использовать, как реальное USB-устройство.
/usr/local/bin/qemu-system-x86_64 -monitor stdio \ -cpu qemu64 \ -vga cirrus \ -m 4096 -smp 4 \ -cdrom ../ISO/fbsd.iso \ -boot order=cd,menu=on \ -drive if=none,id=usbstick,format=raw,file=../VM/foo.img \ -usb \ -device usb-ehci,id=ehci \ -device usb-storage,bus=ehci.0,drive=usbstick \ -device usb-mouse \ -blockdev driver=file,node-name=img1,filename=../VM/right.qcow2 \ -blockdev driver=qcow2,node-name=drive0,file=img1 \ -device virtio-blk-pci,drive=drive0,bootindex=1 \ -netdev tap,id=nd0,ifname=tap1,script=no,downscript=no,br=bridge0 \ -device e1000,netdev=nd0,mac=02:72:69:67:68:74 \ -name \"right\"
Эта конфигурация включает спецификацию -drive с id=usbstick, формат raw и файл образ (который должен быть создан с помощью qemu-img(1)). Следующая строка содержит спецификацию -device usb-ehci для контроллера USB EHCI с id=ehci. Наконец, спецификация -device usb-storage связывает указанный накопитель с шиной USB EHCI.
При загрузке системы FreeBSD распознает USB-концентратор, добавит подключенное USB-устройство и назначит его на da0, как показано на рисунке 15.

Рисунок 15. QEMU Созданные USB-концентратор и устройство хранения данных
Устройство готово к разделению с помощью gpart(8) и форматированию с помощью newfs(8). Поскольку USB-устройство использует файл, созданный qemu-img(1), записанные на него данные сохранятся после перезагрузки.
24.6.8. Использование USB-устройств хоста через проброс (passthrough)
Поддержка проброса USB в QEMU указана как экспериментальная в версии 9.0.1 (лето 2024 года). Тем не менее, следующие шаги показывают, как USB-накопитель, подключённый к хосту, может быть использован в гостевой ВМ.
Для получения дополнительной информации и примеров см.:
Верхняя часть рисунка 16 показывает команды монитора QEMU:
info usbhostотображает информацию обо всех USB-устройствах в хост-системе. Найдите нужное USB-устройство в хост-системе и запишите два шестнадцатеричных значения в соответствующей строке. (В примере ниже хост-устройство — это Memorex Mini с vendorid 0718 и productid 0619.) Используйте эти два значения, показанные командойinfo usbhost, на этапеdevice_addниже.device_addдобавляет USB-устройство в гостевую ВМ.

Рисунок 16. Команды монитора QEMU для доступа к USB-устройству на хосте
Как и ранее, после завершения device_add ядро FreeBSD распознает новое USB-устройство, как показано в нижней части экрана.
Использование нового устройства показано на рисунке 17.

Рисунок 17. Использование USB-устройства хоста через проброс (passthrough)
Если USB-устройство отформатировано как файловая система FAT16 или FAT32, его можно подключить как файловую систему MS-DOS™ с помощью mount_msdosfs(8), как показано в примере. Файл /etc/hosts копируется на только что подключённый диск, и для проверки целостности файла на USB-устройстве вычисляются контрольные суммы. Затем устройство отключается с помощью umount(8).
Если USB-устройство отформатировано в NTFS, необходимо установить пакет fusefs-ntfs и использовать ntfs-3g(8) для доступа к устройству:
# pkg install fusefs-ntfs
# kldload fusefs
# gpart show da1
# ntfs-3g /dev/da1s1 /mnt
Access the drive as needed. When finished:
# umount /mntЗамените приведенные выше идентификаторы устройств в соответствии с установленным оборудованием. Дополнительную информацию о работе с файловыми системами NTFS см. в ntfs-3g(8).
24.6.9. QEMU на FreeBSD Краткое описание
Как упоминалось выше, QEMU работает с несколькими различными гипервизорными ускорителями.
Список поддерживаемых QEMU ускорителей виртуализации включает:
KVMв Linux с поддержкой 64-битных архитектур Arm, MIPS, PPC, RISC-V, s390x и x86Xenна Linux в качестве dom0 с поддержкой Arm и x86Hypervisor Framework (hvf)в macOS с поддержкой x86 и Arm (только 64-битные)Windows Hypervisor Platform (whpx)в Windows с поддержкой x86Диспетчер виртуальных машин NetBSD (nvmm)на NetBSD с поддержкой x86Tiny Code Generator (tcg)на Linux и других POSIX-совместимых системах, Windows, macOS с поддержкой Arm, x86, Loongarch64, MIPS, PPC, s390x и Sparc64.
Все примеры в этом разделе использовали ускоритель Tiny Code Generator (tcg), так как это единственный поддерживаемый ускоритель в FreeBSD на данный момент.
24.7. FreeBSD в качестве хоста с bhyve
Гипервизор bhyve с лицензией BSD стал частью базовой системы начиная с FreeBSD 10.0-RELEASE. Этот гипервизор поддерживает несколько гостевых систем, включая FreeBSD, OpenBSD, многие дистрибутивы Linux® и Microsoft Windows®. По умолчанию bhyve предоставляет доступ к последовательной консоли и не эмулирует графическую консоль. Функции оффлоадинга виртуализации современных процессоров используются для избежания устаревших методов трансляции инструкций и ручного управления отображением памяти.
Дизайн bhyve требует
процессор Intel®, поддерживающий Intel Extended Page Tables (EPT),
или процессор AMD®, поддерживающий AMD Rapid Virtualization Indexing (RVI) или Nested Page Tables (NPT),
или процессор ARM® aarch64.
На ARM поддерживается только чистая виртуализация ARMv8.0, расширения Virtualization Host Extensions в настоящее время не используются. Для запуска гостевых систем Linux® или FreeBSD с более чем одним vCPU требуется поддержка неограниченного режима VMX (UG).
Самый простой способ проверить, поддерживает ли процессор Intel или AMD технологию bhyve, — выполнить команду dmesg или посмотреть в файле /var/run/dmesg.boot флаг POPCNT в строке Features2 для процессоров AMD® или флаги EPT и UG в строке VT-x для процессоров Intel®.
24.7.1. Подготовка хоста
Первым шагом к созданию виртуальной машины в bhyve является настройка хостовой системы. Сначала загрузите модуль ядра bhyve:
# kldload vmmСуществует несколько способов подключения гостевой виртуальной машины к сети хоста; один из простых способов — создать интерфейс tap, к которому подключится сетевое устройство виртуальной машины. Чтобы сетевое устройство могло участвовать в сети, также необходимо создать мостовой интерфейс, включающий интерфейс tap и физический интерфейс в качестве членов. В данном примере физический интерфейс — это igb0:
# ifconfig tap0 create
# sysctl net.link.tap.up_on_open=1
net.link.tap.up_on_open: 0 -> 1
# ifconfig bridge0 create
# ifconfig bridge0 addm igb0 addm tap0
# ifconfig bridge0 up24.7.2. Создание гостевой системы FreeBSD
Создайте файл, который будет использоваться как виртуальный диск для гостевой машины. Укажите размер и имя виртуального диска:
# truncate -s 16G guest.imgСкачать образ установки FreeBSD для установки:
# fetch https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASE-amd64-bootonly.iso
FreeBSD-14.0-RELEASE-amd64-bootonly.iso 426 MB 16 MBps 22sFreeBSD включает пример скрипта vmrun.sh для запуска виртуальной машины в bhyve. Он запускает виртуальную машину и выполняет её в цикле, поэтому она автоматически перезапустится в случае сбоя. vmrun.sh принимает несколько опций для управления конфигурацией машины, включая:
-cуправляет количеством виртуальных процессоров,-mограничивает объем памяти, доступной гостевой системе,-tуказывает, какой tap-устройство использовать,-dуказывает, какой образ диска использовать,-iуказывает bhyve загружаться с образа CD вместо диска, и-Iопределяет, какой образ CD использовать.
Последний параметр — это имя виртуальной машины, которое используется для отслеживания работающих машин. Следующая команда выводит список всех доступных аргументов программы:
# sh /usr/share/examples/bhyve/vmrun.sh -hЭтот пример запускает виртуальную машину в режиме установки:
# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M -t tap0 -d guest.img \
-i -I FreeBSD-14.0-RELEASE-amd64-bootonly.iso guestnameВиртуальная машина загрузится и запустит установщик. После установки системы в виртуальной машине, когда система предложит перейти в оболочку в конце установки, выберите Да.
Перезагрузите виртуальную машину. Хотя перезагрузка виртуальной машины приводит к выходу из bhyve, скрипт vmrun.sh запускает bhyve в цикле и автоматически перезапустит его. Когда это произойдет, выберите опцию перезагрузки в меню загрузчика, чтобы выйти из цикла. Теперь гостевую систему можно запустить с виртуального диска:
# sh /usr/share/examples/bhyve/vmrun.sh -c 4 -m 1024M -t tap0 -d guest.img guestname24.7.3. Создание гостевой системы Linux®
Гостевые системы Linux можно загружать как любую другую обычную виртуальную машину на основе UEFI, либо, в качестве альтернативы, можно использовать порт sysutils/grub2-bhyve.
Для этого сначала убедитесь, что порт установлен, затем создайте файл, который будет использоваться как виртуальный диск для гостевой машины:
# truncate -s 16G linux.imgЗапуск виртуальной машины Linux с grub2-bhyve — это двухэтапный процесс.
Сначала необходимо загрузить ядро, затем можно запустить гостевую систему.
Ядро Linux® загружается с помощью пакета sysutils/grub2-bhyve.
Создайте файл device.map, который grub будет использовать для сопоставления виртуальных устройств с файлами в хостовой системе:
(hd0) ./linux.img (cd0) ./somelinux.iso
Используйте sysutils/grub2-bhyve для загрузки ядра Linux® из образа ISO:
# grub-bhyve -m device.map -r cd0 -M 1024M linuxguestЭто запустит grub. Если на установочном CD содержится файл grub.cfg, будет отображено меню. Если нет, файлы vmlinuz и initrd необходимо найти и загрузить вручную:
grub> ls
(hd0) (cd0) (cd0,msdos1) (host)
grub> ls (cd0)/isolinux
boot.cat boot.msg grub.conf initrd.img isolinux.bin isolinux.cfg memtest
splash.jpg TRANS.TBL vesamenu.c32 vmlinuz
grub> linux (cd0)/isolinux/vmlinuz
grub> initrd (cd0)/isolinux/initrd.img
grub> bootТеперь, когда ядро Linux® загружено, можно запустить гостевую систему:
# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \
-s 3:0,virtio-blk,./linux.img -s 4:0,ahci-cd,./somelinux.iso \
-l com1,stdio -c 4 -m 1024M linuxguestСистема загрузится и запустит установщик. После установки системы в виртуальной машине перезагрузите виртуальную машину. Это приведёт к завершению работы bhyve. Экземпляр виртуальной машины необходимо уничтожить перед тем, как его можно будет запустить снова:
# bhyvectl --destroy --vm=linuxguestТеперь гостевую систему можно запустить напрямую с виртуального диска. Загрузите ядро:
# grub-bhyve -m device.map -r hd0,msdos1 -M 1024M linuxguest
grub> ls
(hd0) (hd0,msdos2) (hd0,msdos1) (cd0) (cd0,msdos1) (host)
(lvm/VolGroup-lv_swap) (lvm/VolGroup-lv_root)
grub> ls (hd0,msdos1)/
lost+found/ grub/ efi/ System.map-2.6.32-431.el6.x86_64 config-2.6.32-431.el6.x
86_64 symvers-2.6.32-431.el6.x86_64.gz vmlinuz-2.6.32-431.el6.x86_64
initramfs-2.6.32-431.el6.x86_64.img
grub> linux (hd0,msdos1)/vmlinuz-2.6.32-431.el6.x86_64 root=/dev/mapper/VolGroup-lv_root
grub> initrd (hd0,msdos1)/initramfs-2.6.32-431.el6.x86_64.img
grub> bootЗапустите виртуальную машину:
# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \
-s 3:0,virtio-blk,./linux.img -l com1,stdio -c 4 -m 1024M linuxguestLinux® теперь загрузится в виртуальной машине и в конечном итоге покажет приглашение для входа. Войдите в систему и используйте виртуальную машину. Когда вы закончите, перезагрузите виртуальную машину для выхода из bhyve. Уничтожьте экземпляр виртуальной машины:
# bhyvectl --destroy --vm=linuxguest24.7.4. Загрузка виртуальных машин bhyve с прошивкой UEFI
В дополнение к bhyveload и grub-bhyve, гипервизор bhyve также может загружать виртуальные машины с использованием прошивки UEFI. Этот вариант может поддерживать гостевые операционные системы, которые не поддерживаются другими загрузчиками.
Чтобы использовать поддержку UEFI в bhyve, сначала получите образы прошивки UEFI. Это можно сделать, установив порт sysutils/bhyve-firmware или пакет.
Имея микропрограмму, добавьте флаги -l bootrom,/путь/к/микропрограмме в командную строку bhyve. Фактическая команда bhyve может выглядеть так:
# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \
-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
guestЧтобы разрешить гостевой системе сохранять переменные UEFI, вы можете использовать файл переменных, указанный с флагом -l. Обратите внимание, что bhyve будет записывать изменения, внесённые гостевой системой, в указанный файл переменных. Поэтому убедитесь, что вы предварительно создали отдельную копию шаблонного файла переменных для каждой гостевой системы:
# cp /usr/local/share/uefi-firmware/BHYVE_UEFI_VARS.fd /path/to/vm-image/BHYVE_UEFI_VARS.fdЗатем добавьте этот файл переменных в аргументы bhyve:
# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \
-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd,/path/to/vm-image/BHYVE_UEFI_VARS.fd \
guestНекоторые дистрибутивы Linux требуют использования переменных UEFI для хранения пути к их загрузочному файлу UEFI (например, используют |
Для просмотра или изменения содержимого файла переменных используйте efivar(8) с хоста.
sysutils/bhyve-firmware также содержит прошивку с поддержкой CSM для загрузки гостевых систем без поддержки UEFI в режиме устаревшего BIOS:
# bhyve -AHP -s 0:0,hostbridge -s 1:0,lpc \
-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI_CSM.fd \
guest24.7.5. Графический UEFI фреймбуфер для гостевых систем bhyve
Поддержка микропрограммы UEFI особенно полезна для преимущественно графических гостевых операционных систем, таких как Microsoft Windows®.
Поддержка фреймбуфера UEFI-GOP также может быть включена с помощью флагов -s 29,fbuf,tcp=0.0.0.0:5900. Разрешение фреймбуфера можно настроить с помощью параметров w=800 и h=600, а также можно указать bhyve ожидать подключения VNC перед загрузкой гостевой системы, добавив wait. Доступ к фреймбуферу возможен с хоста или по сети через протокол VNC. Дополнительно можно добавить -s 30,xhci,tablet для точной синхронизации курсора мыши с хостом.
Результирующая команда bhyve будет выглядеть так:
# bhyve -AHP -s 0:0,hostbridge -s 31:0,lpc \
-s 2:0,virtio-net,tap1 -s 3:0,virtio-blk,./disk.img \
-s 4:0,ahci-cd,./install.iso -c 4 -m 1024M \
-s 29,fbuf,tcp=0.0.0.0:5900,w=800,h=600,wait \
-s 30,xhci,tablet \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
guestЗаметим, что в режиме эмуляции BIOS обновление кадрового буфера прекращается после передачи управления от микропрограммы гостевой операционной системе.
24.7.6. Создание гостевой системы Microsoft Windows®
Настройка гостевой системы для Windows версий 10 или более ранних может быть выполнена непосредственно с оригинального установочного носителя и является относительно простым процессом. Помимо минимальных требований к ресурсам, для работы Windows в качестве гостевой системы требуется
привязка памяти виртуальной машины (флаг
-w) изагрузка с загрузочной памяти (bootrom) UEFI.
Пример загрузки гостевой виртуальной машины с установочным ISO-образом Windows:
bhyve \
-c 2 \
-s 0,hostbridge \
-s 3,nvme,windows2016.img \
-s 4,ahci-cd,install.iso \
-s 10,virtio-net,tap0 \
-s 31,lpc \
-s 30,xhci,tablet \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
-m 8G -H -w \
windows2016Только один или два виртуальных процессора (VCPU) следует использовать во время установки, но их количество можно увеличить после установки Windows.
Для использования определенного сетевого интерфейса virtio-net необходимо установить драйверы VirtIO. Альтернативой является переключение на эмуляцию E1000 (Intel E82545) путем замены virtio-net на e1000 в приведенной выше командной строке. Однако это повлияет на производительность.
24.7.6.1. Создание гостевой системы Windows 11
Начиная с Windows 11, Microsoft ввела требование к оборудованию в виде модуля TPM 2. bhyve поддерживает передачу аппаратного TPM гостевой системе. Установочный носитель можно модифицировать для отключения соответствующих проверок оборудования. Подробное описание этого процесса доступно по ссылке FreeBSD Wiki.
Изменение установочных носителей Windows и запуск гостевых систем Windows без модуля TPM не поддерживаются производителем. Учитывайте свои задачи и сценарии использования перед применением подобных методов. |
24.7.7. Использование ZFS с гостевыми ВМ в bhyve
Если на хост-машине доступен ZFS, использование томов ZFS вместо файлов образов дисков может обеспечить значительное повышение производительности для гостевых ВМ. Том ZFS можно создать следующим образом:
# zfs create -V16G -o volmode=dev zroot/linuxdisk0При запуске ВМ укажите том ZFS в качестве диска:
# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 \
-s3:0,virtio-blk,/dev/zvol/zroot/linuxdisk0 \
-l com1,stdio -c 4 -m 1024M linuxguestЕсли вы используете ZFS как на хосте, так и внутри гостевой системы, учитывайте конкуренцию за память из-за кэширования содержимого виртуальной машины обеими системами. Чтобы уменьшить эту нагрузку, рассмотрите возможность настройки файловых систем ZFS на хосте для использования кэширования только метаданных. Для этого примените следующие параметры к файловым системам ZFS на хосте, заменив <name> на имя конкретного zvol-набора данных виртуальной машины.
# zfs set primarycache=metadata <name>24.7.8. Создание снимка виртуальной машины
Современные гипервизоры позволяют своим пользователям создавать "снимки" состояния; такой снимок включает в себя диск гостевой системы, содержимое процессора и памяти. Снимок обычно можно сделать независимо от того, работает гостевая система или выключена. Затем можно сбросить и вернуть виртуальную машину в точное состояние на момент создания снимка.
24.7.8.1. ZFS Снимки
Использование томов ZFS в качестве основного хранилища для виртуальной машины позволяет создавать снимки диска гостевой системы. Например:
zfs snapshot zroot/path/to/zvol@snapshot_nameХотя можно создать снимок ZFS тома таким образом, пока гостевая система работает, следует учитывать, что содержимое виртуального диска может находиться в несогласованном состоянии, пока гость активен. Поэтому рекомендуется сначала завершить работу или приостановить гостевую систему перед выполнением этой команды. Функция приостановки гостевой системы не поддерживается по умолчанию и должна быть сначала включена (см. Снимки памяти и процессора)
Откат ZFS zvol к снимку во время использования виртуальной машиной может повредить содержимое файловой системы и вызвать сбой гостевой ОС. Все несохранённые данные в гостевой системе будут потеряны, а изменения, сделанные после последнего снимка, могут быть уничтожены. Повторный откат может потребоваться после выключения виртуальной машины, чтобы вернуть файловую систему в работоспособное состояние. Это, в свою очередь, окончательно уничтожит все изменения, сделанные после создания снимка. |
24.7.8.2. Снимки памяти и процессора (экспериментальная функция)
Начиная с FreeBSD 13, bhyve имеет экспериментальную функцию "snapshot" для сохранения состояния памяти и процессора гостевой системы в файл с последующей остановкой виртуальной машины. Гостевая система может быть возобновлена из содержимого файла снимка позже.
Однако эта функция не включена по умолчанию и требует пересборки системы из исходного кода. Подробное описание процесса компиляции ядра с пользовательскими настройками приведено в Сборка из исходного кода.
Функциональность не готова для промышленного использования и ограничена работой с определёнными конфигурациями виртуальных машин. Существует несколько ограничений:
|
Убедитесь, что каталог /usr/src актуален, прежде чем выполнять следующие шаги. Подробная процедура обновления описана в разделе Updating the Source. |
Добавьте следующее в /etc/src.conf:
WITH_BHYVE_SNAPHOT=yes BHYVE_SNAPSHOT=1 MK_BHYVE_SNAPSHOT=yes
Если система была частично или полностью пересобрана, рекомендуется выполнить прежде чем продолжить. |
Затем выполните шаги, описанные в разделе Быстрый старт обновления FreeBSD из исходного кода, чтобы собрать и установить систему и ядро.
Чтобы проверить успешную активацию функции снимков, введите
# bhyvectl --usageи проверить, есть ли в выводе флаг --suspend. Если флаг отсутствует, значит функция не активировалась корректно.
Затем вы можете создать снимок состояния и приостановить работающую виртуальную машину по вашему выбору:
# bhyvectl --vm=vmname --suspend=/path/to/snapshot/filenameУкажите абсолютный путь и имя файла для Убедитесь, что записываете данные снимка в защищённый каталог. Сформированный вывод содержит полный дамп памяти гостевой системы и, следовательно, может включать конфиденциальные данные (например, пароли)! |
Это создает три файла:
моментальный снимок памяти - назван аналогично параметру
--suspendфайл ядра - имя, аналогичное входному параметру
--suspend, с суффиксом .kernmetadata - содержит метаданные о состоянии системы, с именем, оканчивающимся на суффикс .meta
Для восстановления гостевой системы из снимка используйте флаг -r с bhyve:
# bhyve -r /path/to/snapshot/filenameВосстановление снимка гостевой системы на архитектуре процессора, отличной от исходной, невозможно. Как правило, попытка восстановления на системе, не идентичной той, на которой был создан снимок, скорее всего, завершится неудачей.
24.7.9. bhyve в клетке
Для повышения безопасности и изоляции виртуальных машин от основной операционной системы можно запускать bhyve в клетке. См. Клетки для подробного описания клеток и их преимуществ в плане безопасности.
24.7.9.1. Создание клетки для bhyve
Сначала создайте окружение клетки. Если используется файловая система UFS, просто выполните:
# mkdir -p /jails/bhyveЕсли используется файловая система ZFS, выполните следующие команды:
# zfs create zroot/jails
# zfs create zroot/jails/bhyveЗатем создайте ZFS zvol для виртуальной машины bhyvevm0:
# zfs create zroot/vms
# zfs create -V 20G zroot/vms/bhyvevm0Если ZFS не используется, для создания файла образа диска непосредственно в структуре каталогов клетки применяйте следующие команды:
# mkdir /jails/bhyve/vms
# truncate -s 20G /jails/bhyve/vms/bhyvevm0Загрузите образ FreeBSD, предпочтительно версии, равной или более старой, чем на хосте, и извлеките его в каталог клетки:
# cd /jails
# fetch -o base.txz http://ftp.freebsd.org/pub/FreeBSD/releases/amd64/13.2-RELEASE/base.txz
# tar -C /jails/bhyve -xvf base.txzЗапуск более высокой версии FreeBSD в клетке, чем на хосте, не поддерживается (например, запуск 14.0-RELEASE в jail на хосте с 13.2-RELEASE). |
Далее добавьте набор правил devfs в /etc/devfs.rules:
[devfsrules_jail_bhyve=100] add include $devfsrules_hide_all add include $devfsrules_unhide_login add path 'urandom' unhide add path 'random' unhide add path 'crypto' unhide add path 'shm' unhide add path 'zero' unhide add path 'null' unhide add path 'mem' unhide add path 'vmm' unhide add path 'vmm/*' unhide add path 'vmm.io' unhide add path 'vmm.io/*' unhide add path 'nmdmbhyve*' unhide add path 'zvol' unhide add path 'zvol/zroot' unhide add path 'zvol/zroot/vms' unhide add path 'zvol/zroot/vms/bhyvevm0' unhide add path 'zvol/zroot/vms/bhyvevm1' unhide add path 'tap10*' unhide
Если в вашем файле /etc/devfs.rules уже есть другое правило devfs с числовым идентификатором 100, замените указанный в примере идентификатор на другой, еще не использованный. |
Если не используется файловая система ZFS, пропустите связанные с zvol правила в /etc/devfs.rules: add path 'zvol' unhide add path 'zvol/zroot' unhide add path 'zvol/zroot/vms' unhide add path 'zvol/zroot/vms/bhyvevm0' unhide add path 'zvol/zroot/vms/bhyvevm1' unhide |
Эти правила приведут к тому, что bhyve
создаст виртуальную машину с дисковыми томами
bhyvevm0иbhyvevm1,будет использовать сетевые интерфейсы tap с префиксом имени
tap10. Это означает, что допустимыми именами интерфейсов будутtap10,tap100,tap101, …tap109,tap1000и так далее.Ограничение доступа к подмножеству возможных имён интерфейсов tap предотвратит доступ клетки (и, следовательно, bhyve) к интерфейсам tap хоста и других клеток.
используйте устройства nmdm с префиксом "bhyve", например /dev/nmdmbhyve0.
Эти правила можно расширять и изменять, используя различные имена гостевых систем и интерфейсов по необходимости.
Если вы планируете использовать bhyve как на хосте, так и в одной или нескольких клеток, помните, что имена интерфейсов tap и nmdm будут работать в общей среде. Например, /dev/nmdmbhyve0 можно использовать либо для bhyve на хосте, либо в клетке. |
Перезапустите devfs для применения изменений:
# service devfs restartЗатем добавьте определение для вашей новой клетке в /etc/jail.conf или /etc/jail.conf.d. Замените номер интерфейса $if и IP-адрес на свои значения.
Пример 1. Использование NAT или маршрутизируемого трафика с межсетевым экраном
bhyve {
$if = 0;
exec.prestart = "/sbin/ifconfig epair${if} create up";
exec.prestart += "/sbin/ifconfig epair${if}a up";
exec.prestart += "/sbin/ifconfig epair${if}a name ${name}0";
exec.prestart += "/sbin/ifconfig epair${if}b name jail${if}";
exec.prestart += "/sbin/ifconfig ${name}0 inet 192.168.168.1/27";
exec.prestart += "/sbin/sysctl net.inet.ip.forwarding=1";
exec.clean;
host.hostname = "the-hostname-here";
vnet;
vnet.interface = "jail${if}";
path = "/jails/${name}";
persist;
securelevel = 3;
devfs_ruleset = 100;
mount.devfs;
allow.vmm;
exec.start += "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.poststop += "/sbin/ifconfig ${name}0 destroy";
}Этот пример предполагает использование межсетевого экрана, такого как pf или ipfw, для трансляции сетевых адресов (NAT) трафика вашей jail. Подробнее о доступных вариантах реализации этого смотрите в главе Межсетевые экраны.
Пример 2. Использование мостового сетевого подключения
bhyve {
$if = 0;
exec.prestart = "/sbin/ifconfig epair${if} create up";
exec.prestart += "/sbin/ifconfig epair${if}a up";
exec.prestart += "/sbin/ifconfig epair${if}a name ${name}0";
exec.prestart += "/sbin/ifconfig epair${if}b name jail${if}";
exec.prestart += "/sbin/ifconfig bridge0 addm ${name}0";
exec.prestart += "/sbin/sysctl net.inet.ip.forwarding=1";
exec.clean;
host.hostname = "the-hostname-here";
vnet;
vnet.interface = "jail${if}";
path = "/jails/${name}";
persist;
securelevel = 3;
devfs_ruleset = 100;
mount.devfs;
allow.vmm;
exec.start += "/bin/sh /etc/rc";
exec.stop = "/bin/sh /etc/rc.shutdown";
exec.poststop += "/sbin/ifconfig ${name}0 destroy";
}Если вы ранее заменили идентификатор набора правил devfs 100 в /etc/devfs.rules на свой уникальный номер, не забудьте также заменить числовой идентификатор в вашем jails.conf. |
24.7.9.2. Настройка клетки
Для первого запуска клетки и выполнения дополнительных настроек введите:
# cp /etc/resolv.conf /jails/bhyve/etc
# service jail onestart bhyve
# jexec bhyve
# sysrc ifconfig_jail0="inet 192.168.168.2/27"
# sysrc defaultrouter="192.168.168.1"
# sysrc sendmail_enable=NONE
# sysrc cloned_interfaces="tap100"
# exitПерезапустите и включите клетку:
# sysrc jail_enable=YES
# service jail restart bhyveПосле этого вы можете создать виртуальную машину внутри клетки. Для гостевой системы FreeBSD сначала загрузите установочный ISO-образ:
# jexec bhyve
# cd /vms
# fetch -o freebsd.iso https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASE-amd64-bootonly.iso24.7.9.3. Создание виртуальной машины внутри клетки
Чтобы создать виртуальную машину, сначала инициализируйте её с помощью bhyvectl:
# jexec bhyve
# bhyvectl --create --vm=bhyvevm0Создание гостевой системы с помощью
|
Наконец, используйте предпочитаемый способ запуска гостевой системы.
Пример 3. Запуск с
vmrun.sh и ZFSИспользуя vmrun.sh на файловых системах ZFS:
# jexec bhyve
# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M \
-t tap100 -d /dev/zvol/zroot/vms/bhyvevm0 -i -I /vms/FreeBSD-14.0-RELEASE-amd64-bootonly.iso bhyvevm0Пример 4. Запуск с
vmrun.sh и UFSИспользуя vmrun.sh на файловой системе UFS:
# jexec bhyve
# sh /usr/share/examples/bhyve/vmrun.sh -c 1 -m 1024M \
-t tap100 -d /vms/bhyvevm0 -i -I /vms/FreeBSD-14.0-RELEASE-amd64-bootonly.iso bhyvevm0Пример 5. Запуск bhyve для гостевой системы UEFI с ZFS
Если же вы хотите использовать гостевую систему с UEFI, не забудьте сначала установить необходимый пакет с микропрограммой sysutils/bhyve-firmware в клетку:
# pkg -j bhyve install bhyve-firmwareЗатем используйте bhyve напрямую:
# bhyve -A -c 4 -D -H -m 2G \
-s 0,hostbridge \
-s 1,lpc \
-s 2,virtio-net,tap100 \
-s 3,virtio-blk,/dev/zvol/zroot/vms/bhyvevm0 \
-s 4,ahci-cd,/vms/FreeBSD-14.0-RELEASE-amd64-bootonly.iso \
-s 31,fbuf,tcp=127.0.0.1:5900,w=1024,h=800,tablet \
-l bootrom,/usr/local/share/uefi-firmware/BHYVE_UEFI.fd \
-l com1,/dev/nmdbbhyve0A \
bhyvevm0Это позволит вам подключиться к вашей виртуальной машине bhyvevm0 через VNC, а также через последовательную консоль по адресу /dev/nmdbbhyve0B.
24.7.10. Консоли виртуальной машины
Преимуществом является обёртывание консоли bhyve в инструмент управления сеансами, например sysutils/tmux или sysutils/screen, чтобы иметь возможность отключаться и подключаться к консоли. Также можно сделать консоль bhyve нуль-модемным устройством, доступным через cu. Для этого загрузите модуль ядра nmdm и замените -l com1,stdio на -l com1,/dev/nmdm0A. Устройства /dev/nmdm создаются автоматически по мере необходимости, где каждое представляет собой пару, соответствующую двум концам нуль-модемного кабеля (/dev/nmdm0A и /dev/nmdm0B). Подробнее см. в nmdm(4).
# kldload nmdm
# bhyve -A -H -P -s 0:0,hostbridge -s 1:0,lpc -s 2:0,virtio-net,tap0 -s 3:0,virtio-blk,./linux.img \
-l com1,/dev/nmdm0A -c 4 -m 1024M linuxguest
# cu -l /dev/nmdm0B
Connected
Ubuntu 13.10 handbook ttyS0
handbook login:Чтобы отключиться от консоли, введите перевод строки (т.е. нажмите RETURN), затем тильду (~) и точку (.). Учтите, что разрывается только соединение, а сеанс входа в систему остаётся активным. Таким образом, другой пользователь, подключившись к той же консоли, может воспользоваться активными сеансами без необходимости аутентификации. По соображениям безопасности рекомендуется выйти из системы перед отключением.
Число в пути устройства nmdm должно быть уникальным для каждой виртуальной машины и не должно использоваться другими процессами до запуска bhyve. Это число можно выбирать произвольно, оно не обязательно должно быть взято из последовательного ряда чисел. Пара узлов устройств (например, /dev/nmdm0a и /dev/nmdm0b) создаётся динамически при подключении консоли bhyve и уничтожается при её завершении. Учитывайте это при создании скриптов для запуска виртуальных машин: необходимо убедиться, что всем виртуальным машинам назначены уникальные устройства nmdm.
24.7.11. Управление виртуальными машинами
Для каждой виртуальной машины создается узел устройства в /dev/vmm. Это позволяет администратору легко просматривать список работающих виртуальных машин:
# ls -al /dev/vmm
total 1
dr-xr-xr-x 2 root wheel 512 Mar 17 12:19 ./
dr-xr-xr-x 14 root wheel 512 Mar 17 06:38 ../
crw------- 1 root wheel 0x1a2 Mar 17 12:20 guestname
crw------- 1 root wheel 0x19f Mar 17 12:19 linuxguest
crw------- 1 root wheel 0x1a1 Mar 17 12:19 otherguestУказанную виртуальную машину можно уничтожить с помощью bhyvectl:
# bhyvectl --destroy --vm=guestnameУничтожение виртуальной машины таким способом означает её немедленное завершение. Все несохранённые данные будут потеряны, открытые файлы и файловые системы могут быть повреждены. Для корректного завершения работы виртуальной машины отправьте сигнал TERM её процессу bhyve. Это инициирует событие ACPI завершения работы для гостевой системы:
# ps ax | grep bhyve
17424 - SC 56:48.27 bhyve: guestvm (bhyve)
# kill 1742424.7.12. Инструменты и утилиты
В портах доступно множество утилит и приложений, которые помогают упростить настройку и управление виртуальными машинами bhyve:
| Имя | Лицензия | Пакет | Documentation |
|---|---|---|---|
vm-bhyve | BSD-2 | ||
CBSD | BSD-2 | ||
Virt-Manager | LGPL-3 | ||
Bhyve RC Script | Неизвестно | ||
bmd | BSD-2 | ||
vmstated | BSD-2 |
24.7.13. Постоянная конфигурация
Для настройки системы на автоматический запуск гостевых систем bhyve при загрузке необходимо внести изменения в некоторые конфигурационные файлы.
/etc/sysctl.conf
При использовании интерфейсов tap в качестве сетевого бэкенда необходимо либо вручную переводить каждый используемый интерфейс tap в состояние UP, либо просто установить следующий параметр sysctl:
net.link.tap.up_on_open=1
/etc/rc.conf
Чтобы подключить устройство tap вашей виртуальной машины к сети через bridge, необходимо сохранить настройки устройства в /etc/rc.conf. Дополнительно можно загрузить необходимые модули ядра
vmmдля bhyve иnmdmдля устройств nmdm через переменную конфигурацииkld_list. При настройкеifconfig_bridge0убедитесь, что заменили<ipaddr>/<netmask>на реальный IP-адрес вашего физического интерфейса (igb0 в данном примере) и удалите IP-настройки с вашего физического устройства.# sysrc cloned_interfaces+="bridge0 tap0" # sysrc ifconfig_bridge0="inet <ipaddr>/<netmask> addm igb0 addm tap0" # sysrc kld_list+="nmdm vmm" # sysrc ifconfig_igb0="up"
Пример 6. Установка IP для устройства bridge
Для хоста с интерфейсом igb0, подключенным к сети с IP 10.10.10.1 и маской подсети 255.255.255.0, используйте следующие команды:
# sysrc ifconfig_igb0="up"
# sysrc ifconfig_bridge0="inet 10.10.10.1/24 addm igb0 addm tap0"
# sysrc kld_list+="nmdm vmm"
# sysrc cloned_interfaces+="bridge0 tap0"Изменение конфигурации IP-адреса системы может заблокировать ваш доступ, если вы выполняете эти команды, подключившись удаленно (например, через SSH)! Примите меры предосторожности, чтобы сохранить доступ к системе, или вносите эти изменения, работая в локальной терминальной сессии. |
24.8. FreeBSD в качестве хоста Xen™
Xen — это гипервизор класса 1 с лицензией GPLv2 для архитектур Intel® и ARM®. Начиная с FreeBSD 8.0, система включает поддержку непривилегированных доменов (виртуальных машин) DomU и Amazon EC2 для i386™ и AMD® 64-битных процессоров, а также поддержку управляющего домена (хоста) Dom0 в FreeBSD 11.0. Поддержка паравиртуализованных (PV) доменов была удалена в FreeBSD 11 в пользу аппаратно-виртуализованных (HVM) доменов, которые обеспечивают лучшую производительность.
Xen™ — это гипервизор первого типа (bare-metal), что означает, что он загружается первым после BIOS. Затем запускается специальная привилегированная гостевая система, называемая Domain-0 (сокращенно Dom0). Dom0 использует свои особые привилегии для прямого доступа к физическому оборудованию, что делает его высокопроизводительным решением. Она может напрямую обращаться к контроллерам дисков и сетевым адаптерам. Инструменты управления Xen™ для управления гипервизором Xen™ также используются Dom0 для создания, перечисления и удаления виртуальных машин. Dom0 предоставляет виртуальные диски и сетевые ресурсы для непривилегированных доменов, часто называемых DomU. Xen™ Dom0 можно сравнить с сервисной консолью других гипервизоров, в то время как DomU — это среда, в которой запускаются отдельные гостевые виртуальные машины.
Xen™ может переносить виртуальные машины между разными серверами Xen™. Если два хоста Xen используют общее хранилище данных, миграцию можно выполнить без предварительного выключения виртуальной машины. Вместо этого миграция выполняется в реальном времени, пока DomU работает, и нет необходимости перезапускать его или планировать простой. Это полезно в сценариях обслуживания или обновления, чтобы гарантировать непрерывность предоставления услуг DomU. Множество других возможностей Xen™ перечислены на странице обзора Xen Wiki. Обратите внимание, что не все функции пока поддерживаются в FreeBSD.
24.8.1. Требования к оборудованию для Xen™ Dom0
Для запуска гипервизора Xen™ на хосте требуется определенная аппаратная функциональность. Для работы FreeBSD в качестве хоста Xen (Dom0) необходимы поддержка Intel Extended Page Tables (EPT) или AMD Nested Page Tables (NPT), а также поддержка Input/Output Memory Management Unit (IOMMU) в процессоре хоста.
Для запуска FreeBSD 13 в качестве Xen™ Dom0 система должна быть загружена в режиме legacy boot (BIOS). FreeBSD 14 и новее поддерживают загрузку в качестве Xen™ Dom0 как в режиме BIOS, так и в режиме UEFI. |
24.8.2. Настройка управляющего домена Xen™ Dom0
Пользователям следует установить пакеты emulators/xen-kernel и sysutils/xen-tools, основанные на Xen™ 4.18.
После установки пакетов Xen необходимо отредактировать конфигурационные файлы, чтобы подготовить хост для интеграции с Dom0. В файл /etc/sysctl.conf следует добавить запись, отключающую ограничение на количество страниц памяти, которые могут быть закреплены. В противном случае виртуальные машины DomU с повышенными требованиями к памяти не смогут запуститься.
# echo 'vm.max_wired=-1' >> /etc/sysctl.confЕщё одна настройка, связанная с памятью, включает изменение файла /etc/login.conf, где необходимо установить параметр memorylocked в значение unlimited. В противном случае создание доменов DomU может завершиться ошибкой Cannot allocate memory. После внесения изменений в /etc/login.conf выполните команду cap_mkdb для обновления базы данных capability. Подробности см. в разделе Ограничения ресурсов.
# sed -i '' -e 's/memorylocked=64K/memorylocked=unlimited/' /etc/login.conf
# cap_mkdb /etc/login.confДобавьте запись для консоли Xen™ в /etc/ttys:
# echo 'xc0 "/usr/libexec/getty Pc" xterm onifconsole secure' >> /etc/ttysВыбор ядра Xen™ в /boot/loader.conf активирует Dom0. Xen™ также требует ресурсы, такие как процессор и память, от основной машины для себя и других доменов DomU. Количество процессоров и памяти зависит от индивидуальных требований и возможностей оборудования. В этом примере для Dom0 доступно 8 ГБ памяти и 4 виртуальных процессора. Также активирована последовательная консоль и определены параметры журналирования.
Следующая команда используется для пакетов Xen 4.7:
# echo 'hw.pci.mcfg=0' >> /boot/loader.conf
# echo 'if_tap_load="YES"' >> /boot/loader.conf
# echo 'xen_kernel="/boot/xen"' >> /boot/loader.conf
# echo 'xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0pvh=1 console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"' >> /boot/loader.confДля версий Xen 4.11 и выше вместо этого следует использовать следующую команду:
# echo 'if_tap_load="YES"' >> /boot/loader.conf
# echo 'xen_kernel="/boot/xen"' >> /boot/loader.conf
# echo 'xen_cmdline="dom0_mem=8192M dom0_max_vcpus=4 dom0=pvh console=com1,vga com1=115200,8n1 guest_loglvl=all loglvl=all"' >> /boot/loader.confФайлы журналов, создаваемые Xen™ для DomU ВМ, хранятся в /var/log/xen. В случае возникновения проблем обязательно проверьте содержимое этого каталога. |
Активируйте сервис xencommons при загрузке системы:
# sysrc xencommons_enable=yesЭтих настроек достаточно для запуска системы с поддержкой Dom0. Однако в ней отсутствует сетевая функциональность для машин DomU. Чтобы это исправить, определите мостовой интерфейс с основной сетевой картой системы, который DomU-виртуальные машины смогут использовать для подключения к сети. Замените em0 на имя сетевого интерфейса хоста.
# sysrc cloned_interfaces="bridge0"
# sysrc ifconfig_bridge0="addm em0 SYNCDHCP"
# sysrc ifconfig_em0="up"Перезагрузите хост для загрузки ядра Xen™ и запуска Dom0.
# rebootПосле успешной загрузки ядра Xen™ и повторного входа в систему, инструмент управления Xen™ xl используется для отображения информации о доменах.
# xl list
Name ID Mem VCPUs State Time(s)
Domain-0 0 8192 4 r----- 962.0Вывод подтверждает, что Dom0 (называемый Domain-0) имеет идентификатор 0 и работает. Также у него есть память и виртуальные CPU, которые были определены ранее в /boot/loader.conf. Дополнительную информацию можно найти в документации Xen™. Теперь можно создавать гостевые ВМ DomU.
24.8.3. Конфигурация гостевой виртуальной машины Xen™ DomU
Непривилегированные домены состоят из конфигурационного файла и виртуальных или физических жестких дисков. Виртуальное дисковое хранилище для DomU может быть файлами, созданными с помощью truncate(1), или томами ZFS, как описано в “Создание и уничтожение томов”. В этом примере используется том объемом 20 ГБ. Виртуальная машина создается с томом ZFS, образом ISO FreeBSD, 1 ГБ оперативной памяти и двумя виртуальными процессорами. Файл установки ISO извлекается с помощью fetch(1) и сохраняется локально в файле с именем freebsd.iso.
# fetch https://download.freebsd.org/releases/ISO-IMAGES/14.0/FreeBSD-14.0-RELEASE-amd64-bootonly.iso -o freebsd.isoСоздается том ZFS объемом 20 ГБ с именем xendisk0, который будет использоваться в качестве дискового пространства для виртуальной машины.
# zfs create -V20G -o volmode=dev zroot/xendisk0Новый гостевая ВМ DomU определяется в файле. Некоторые конкретные определения, такие как имя, раскладка клавиатуры и детали подключения VNC, также задаются. Следующий файл freebsd.cfg содержит минимальную конфигурацию DomU для этого примера:
# cat freebsd.cfg
builder = "hvm" (1)
name = "freebsd" (2)
memory = 1024 (3)
vcpus = 2 (4)
vif = [ 'mac=00:16:3E:74:34:32,bridge=bridge0' ] (5)
disk = [
'/dev/zvol/tank/xendisk0,raw,hda,rw', (6)
'/root/freebsd.iso,raw,hdc:cdrom,r' (7)
]
vnc = 1 (8)
vnclisten = "0.0.0.0"
serial = "pty"
usbdevice = "tablet"Эти строки объясняются более подробно:
| 1 | Это определяет, какой тип виртуализации использовать. hvm означает аппаратную виртуализацию или аппаратную виртуальную машину. Гостевые операционные системы могут работать без изменений на процессорах с расширениями виртуализации, обеспечивая производительность, почти такую же, как и на физическом оборудовании. generic — значение по умолчанию, которое создает PV-домен. |
| 2 | Имя этой виртуальной машины для отличия от других, работающих на том же Dom0. Обязательно. |
| 3 | Количество оперативной памяти в мегабайтах, которое будет доступно виртуальной машине. Этот объем вычитается из общего объема доступной памяти гипервизора, а не из памяти Dom0. |
| 4 | Количество виртуальных CPU, доступных гостевой ВМ. Для наилучшей производительности не следует создавать гостевые системы с количеством виртуальных CPU, превышающим число физических CPU на хосте. |
| 5 | Виртуальный сетевой адаптер. Это мост, подключенный к сетевому интерфейсу хоста. Параметр mac — это MAC-адрес, установленный на виртуальном сетевом интерфейсе. Этот параметр необязателен: если MAC-адрес не указан, Xen™ сгенерирует случайный. |
| 6 | Полный путь к диску, файлу или тому ZFS для дискового хранилища этой ВМ. Параметры и определения нескольких дисков разделяются запятыми. |
| 7 | Определяет загрузочный носитель, с которого устанавливается исходная операционная система. В данном примере это загруженный ранее образ ISO. О других типах устройств и настраиваемых параметрах см. документацию Xen™. |
| 8 | Параметры, управляющие подключением VNC к последовательной консоли DomU. В порядке перечисления: поддержка VNC, определение IP-адреса для прослушивания, файл устройства последовательной консоли и метод ввода для точного позиционирования мыши и других методов ввода. keymap определяет, какую раскладку клавиатуры использовать, по умолчанию установлено значение english. |
После создания файла со всеми необходимыми параметрами DomU создаётся путём передачи его в xl create в качестве аргумента.
# xl create freebsd.cfgКаждый раз при перезапуске Dom0 конфигурационный файл необходимо снова передавать в |
Вывод команды xl list подтверждает, что DomU был создан.
# xl list
Name ID Mem VCPUs State Time(s)
Domain-0 0 8192 4 r----- 1653.4
freebsd 1 1024 1 -b---- 663.9Для начала установки базовой операционной системы запустите клиент VNC, указав основной сетевой адрес хоста или IP-адрес, определённый в строке vnclisten файла freebsd.cfg. После установки операционной системы завершите работу DomU и отключите VNC-клиент. Отредактируйте файл freebsd.cfg, удалив строку с определением cdrom или закомментировав её, поставив символ # в начале строки. Чтобы загрузить новую конфигурацию, необходимо удалить старый DomU командой xl destroy, передав в качестве параметра имя или идентификатор. После этого воссоздайте его, используя изменённый файл freebsd.cfg.
# xl destroy freebsd
# xl create freebsd.cfgЗатем к машине можно снова получить доступ с помощью VNC-клиента. На этот раз она загрузится с виртуального диска, на который была установлена операционная система, и её можно будет использовать как виртуальную машину.
24.8.4. Устранение неполадок
Этот раздел содержит основную информацию, которая поможет в устранении проблем, возникающих при использовании FreeBSD в качестве хоста или гостевой системы Xen™.
24.8.4.1. Устранение неполадок при загрузке хоста
Обратите внимание, что следующие советы по устранению неполадок предназначены для Xen™ 4.11 или новее. Если вы всё ещё используете Xen™ 4.7 и сталкиваетесь с проблемами, рассмотрите возможность перехода на более новую версию Xen™.
Для устранения проблем с загрузкой хоста вам, скорее всего, понадобится последовательный кабель или отладочный USB-кабель. Подробный вывод загрузки Xen™ можно получить, добавив параметры к опции xen_cmdline в файле loader.conf. Несколько соответствующих отладочных параметров:
iommu=debug: может использоваться для вывода дополнительной диагностической информации о iommu.dom0=verbose: может использоваться для вывода дополнительной диагностической информации о процессе сборки dom0.sync_console: флаг для принудительного синхронного вывода на консоль. Полезен при отладке, чтобы избежать потери сообщений из-за ограничения скорости. Никогда не используйте эту опцию в рабочих средах, так как она может позволить злоумышленникам выполнять DoS-атаки на Xen™ через консоль.
FreeBSD также следует загружать в подробном режиме для выявления возможных проблем. Чтобы активировать подробную загрузку, выполните следующую команду:
# echo 'boot_verbose="YES"' >> /boot/loader.confЕсли ни один из этих вариантов не помог решить проблему, отправьте журнал загрузки по последовательному соединению по адресам freebsd-xen@FreeBSD.org и xen-devel@lists.xenproject.org для дальнейшего анализа.
24.8.4.2. Устранение неполадок при создании гостевой системы
Проблемы также могут возникать при создании гостевых систем. В следующем разделе представлены рекомендации для диагностики подобных проблем.
Наиболее распространённой причиной сбоев при создании гостевой системы является команда xl, которая выдаёт ошибку и завершается с кодом возврата, отличным от 0. Если предоставленного сообщения об ошибке недостаточно для определения проблемы, можно получить более подробный вывод от xl, многократно используя опцию v.
# xl -vvv create freebsd.cfg
Parsing config from freebsd.cfg
libxl: debug: libxl_create.c:1693:do_domain_create: Domain 0:ao 0x800d750a0: create: how=0x0 callback=0x0 poller=0x800d6f0f0
libxl: debug: libxl_device.c:397:libxl__device_disk_set_backend: Disk vdev=xvda spec.backend=unknown
libxl: debug: libxl_device.c:432:libxl__device_disk_set_backend: Disk vdev=xvda, using backend phy
libxl: debug: libxl_create.c:1018:initiate_domain_create: Domain 1:running bootloader
libxl: debug: libxl_bootloader.c:328:libxl__bootloader_run: Domain 1:not a PV/PVH domain, skipping bootloader
libxl: debug: libxl_event.c:689:libxl__ev_xswatch_deregister: watch w=0x800d96b98: deregister unregistered
domainbuilder: detail: xc_dom_allocate: cmdline="", features=""
domainbuilder: detail: xc_dom_kernel_file: filename="/usr/local/lib/xen/boot/hvmloader"
domainbuilder: detail: xc_dom_malloc_filemap : 326 kB
libxl: debug: libxl_dom.c:988:libxl__load_hvm_firmware_module: Loading BIOS: /usr/local/share/seabios/bios.bin
...Если подробный вывод не помог диагностировать проблему, также существуют журналы QEMU и инструментов Xen™ в /var/log/xen. Обратите внимание, что имя домена добавляется к имени журнала, поэтому если домен называется freebsd, вы найдете файлы /var/log/xen/xl-freebsd.log и, вероятно, /var/log/xen/qemu-dm-freebsd.log. Оба файла журналов могут содержать полезную информацию для отладки. Если ничто из этого не помогло решить проблему, пожалуйста, отправьте описание возникшей проблемы и как можно больше информации на адреса freebsd-xen@FreeBSD.org и xen-devel@lists.xenproject.org, чтобы получить помощь.
Изменено: 24 ноября 2025 г. by Vladlen Popolitov
