Если вы когда-нибудь пробовали запустить NetBSD в виртуальной машине несколько лет назад — вы помните, как это выглядело. Долгая загрузка, куча эмулированного железа, которое гостевая ОС не очень-то понимала, и общее ощущение, что система чувствует себя в виртуалке не в своей тарелке. С выходом NetBSD 11 ситуация изменилась: появилась поддержка PVH boot не только для Xen, но и для QEMU. Если раньше NetBSD в виртуалке запускалась «как получится», то с PVH boot она начинает летать.
В этом руководстве разберём по шагам: что такое PVH boot, зачем он нужен, как поднять NetBSD в QEMU с нуля и как задействовать PVH для ускорения виртуальной машины. Всё с реальными командами, без воды.
Что такое PVH boot и почему это важно
PVH (Para-Virtualized Hardware) — это режим загрузки виртуальной машины, который объединяет лучшее из двух миров виртуализации:
- Паравиртуализация (PV) — гостевая ОС знает, что работает в виртуальной среде, и использует оптимизированные драйверы вместо эмулированного железа.
- Аппаратная виртуализация (HVM) — использование расширений процессора (Intel VT-x / AMD-V) для запуска кода без трансляции.
PVH берёт аппаратную изоляцию от HVM и паравиртуализированные интерфейсы ввода-вывода от PV. Результат: виртуальная машина загружается быстро, работает с минимальными накладными расходами и не тащит за собой груз legacy BIOS-эмуляции.
Конкретно PVH boot убирает из цепочки запуска:
- эмуляцию BIOS/UEFI (SeaBIOS, OVMF)
- инициализацию фиктивных PCI-устройств
- лишние этапы bootloader’а
Итог — VM стартует заметно быстрее. Для CI/CD пайплайнов или micro-VM, которые запускаются и гасятся десятки раз в день, это ощутимая разница.
Почему PVH появился в NetBSD 11
Исторически PVH boot в BSD-мире был вотчиной Xen. NetBSD поддерживала его под Xen уже несколько лет. Но мир движется в сторону QEMU, KVM и лёгких гипервизоров вроде Firecracker — особенно в облачных средах и CI/CD инфраструктуре.
В NetBSD 11 разработчики расширили поддержку PVH boot на QEMU/KVM. Это открывает несколько новых сценариев использования:
- NetBSD как лёгкая гостевая ОС в облачной инфраструктуре на базе QEMU
- Быстрые одноразовые VM для тестирования и разработки
- NetBSD в роли micro-VM в Firecracker-совместимых средах
В сочетании с новым MICROVM kernel (тоже из NetBSD 11) получается по-настоящему лёгкий стек виртуализации. Подробнее о MICROVM kernel — в нашей статье про что нового в NetBSD 11.0-RC2.
Что понадобится для запуска NetBSD в QEMU
Прежде чем переходить к командам — быстрый чеклист:
- Хост-система: Linux (предпочтительно), FreeBSD или macOS
- Процессор с поддержкой виртуализации: Intel VT-x или AMD-V, включённое в BIOS/UEFI
- QEMU: версия 6.0 и выше (для корректной поддержки PVH рекомендуется 7.0+)
- KVM: модуль ядра kvm_intel или kvm_amd (только на Linux — для аппаратного ускорения)
- ISO-образ NetBSD 11: скачаем ниже
- Свободное место на диске: минимум 5 ГБ, рекомендуется 20 ГБ
- RAM для гостевой VM: минимум 512 МБ, комфортно — 2 ГБ
Проверить наличие KVM на Linux:
lsmod | grep kvm # Должно быть: kvm_intel или kvm_amd # Если модуль не загружен: sudo modprobe kvm-intel # или sudo modprobe kvm-amd
Установка QEMU на хост-систему
Устанавливаем QEMU в зависимости от вашей платформы.
Ubuntu / Debian
sudo apt update sudo apt install qemu-system-x86 qemu-utils
Arch Linux
sudo pacman -S qemu-full
Fedora / RHEL / Rocky Linux
sudo dnf install qemu-kvm qemu-img
FreeBSD
pkg install qemu
macOS (через Homebrew)
brew install qemu
После установки проверяем версию:
qemu-system-x86_64 --version # QEMU emulator version 8.x.x
Скачивание ISO-образа NetBSD 11
Берём образ с официального CDN NetBSD. На момент написания статьи актуален RC2:
# NetBSD 11.0 RC2 для x86_64 wget https://cdn.netbsd.org/pub/NetBSD/NetBSD-11.0_RC2/images/NetBSD-11.0_RC2-amd64.iso # Проверяем контрольную сумму (файл SHA512 лежит рядом) wget https://cdn.netbsd.org/pub/NetBSD/NetBSD-11.0_RC2/images/SHA512 sha512sum -c SHA512 --ignore-missing
Когда выйдет финальный релиз NetBSD 11.0, путь изменится на /pub/NetBSD/NetBSD-11.0/. Актуальные ссылки всегда есть на официальной странице релизов NetBSD.
Создание образа диска для виртуальной машины
Создаём виртуальный диск в формате qcow2 — это стандартный формат QEMU с поддержкой снапшотов и динамическим выделением места:
qemu-img create -f qcow2 netbsd.qcow2 20G
Почему qcow2, а не raw:
- Динамически растёт по мере заполнения — 20G на диске не занимает сразу
- Поддерживает снапшоты — удобно для экспериментов
- Поддерживает сжатие и шифрование
Если нужна максимальная производительность дискового ввода-вывода — можно использовать raw, но для лабораторных задач qcow2 оптимален.
Запуск NetBSD в QEMU: стандартный режим (установка)
Сначала запускаем установку в обычном режиме HVM — загружаемся с ISO и устанавливаем систему на виртуальный диск:
qemu-system-x86_64 \ -enable-kvm \ -m 2048 \ -smp 2 \ -hda netbsd.qcow2 \ -cdrom NetBSD-11.0_RC2-amd64.iso \ -boot d \ -net nic -net user \ -nographic
Разбираем параметры:
-enable-kvm— включить аппаратное ускорение через KVM (только Linux)-m 2048— 2 ГБ RAM для гостевой системы-smp 2— 2 виртуальных CPU-hda netbsd.qcow2— виртуальный диск-cdrom— путь к ISO-образу-boot d— загрузка с CD-ROM-net nic -net user— простая сеть через NAT (интернет внутри VM работает)-nographic— вывод в терминал вместо окна GUI
Установщик NetBSD — текстовый, но вполне дружелюбный. Следуем инструкциям: выбираем диск, раскладку, набор устанавливаемых компонентов. Для лабораторной VM достаточно базового набора. После завершения установки выключаем VM и переходим к настройке PVH boot.
Запуск NetBSD в QEMU с PVH boot
Для PVH boot нам нужно запускать VM напрямую через загрузку ядра NetBSD, минуя BIOS и bootloader. QEMU поддерживает это через параметр -kernel.
Шаг 1: Извлекаем ядро NetBSD из установленной системы
После установки NetBSD ядро находится в корне файловой системы — файл netbsd. Нам нужно его достать. Самый простой способ — примонтировать образ диска на хосте:
# Находим смещение раздела внутри qcow2 # Сначала конвертируем qcow2 в raw для монтирования qemu-img convert -f qcow2 -O raw netbsd.qcow2 netbsd.raw # Смотрим таблицу разделов fdisk -l netbsd.raw # Монтируем первый раздел (замените offset на значение из fdisk * 512) sudo mount -o loop,offset=512 netbsd.raw /mnt/netbsd # Копируем ядро cp /mnt/netbsd/netbsd ./netbsd-kernel sudo umount /mnt/netbsd
Шаг 2: Запускаем VM с PVH boot
qemu-system-x86_64 \ -enable-kvm \ -machine q35 \ -cpu host \ -m 2048 \ -smp 2 \ -drive file=netbsd.qcow2,format=qcow2,if=virtio \ -kernel netbsd-kernel \ -append "root=wd0a console=com0" \ -net nic,model=virtio -net user \ -nographic
Ключевые отличия от стандартного запуска:
-machine q35— современная архитектура чипсета, лучше подходит для PVH-cpu host— пробрасываем реальные флаги CPU хоста в гостевую VM-drive ...,if=virtio— паравиртуализированный диск вместо эмулированного IDE-kernel netbsd-kernel— прямая загрузка ядра, минуя BIOS-append "root=wd0a console=com0"— параметры ядра: корневой раздел и консоль-net nic,model=virtio— паравиртуализированная сетевая карта
Проверка работы PVH boot внутри NetBSD
После загрузки проверяем, что PVH boot работает корректно. Заходим в систему и смотрим dmesg:
dmesg | grep -i pvh dmesg | grep -i xen dmesg | grep -i hypervisor
Также полезно проверить параметры машины через sysctl:
sysctl machdep sysctl machdep.cpu
Если загрузка прошла через PVH — в dmesg будет соответствующая информация об обнаруженном гипервизоре и режиме инициализации. Скорость загрузки по сравнению со стандартным HVM-режимом должна быть заметно выше — особенно на слабом железе или при частых перезапусках VM.
Три практических кейса использования NetBSD в QEMU
Кейс 1: NetBSD как тестовый сервер для сетевых конфигураций
Задача: Нужно проверить поведение BSD-стека TCP/IP под нагрузкой или протестировать сетевые конфигурации без риска для продакшн-железа.
Решение: NetBSD VM в QEMU с двумя виртуальными сетевыми интерфейсами — один в NAT (для доступа в интернет), второй в изолированную сеть для тестов.
qemu-system-x86_64 \ -enable-kvm \ -machine q35 \ -cpu host \ -m 2048 \ -drive file=netbsd.qcow2,format=qcow2,if=virtio \ -kernel netbsd-kernel \ -append "root=wd0a console=com0" \ -net nic,model=virtio,vlan=0 -net user,vlan=0 \ -net nic,model=virtio,vlan=1 -net socket,listen=:4444,vlan=1 \ -nographic
Внутри NetBSD получаем два интерфейса: vioif0 (NAT) и vioif1 (изолированная сеть). Конфигурируем как нужно — без последствий для хоста.
Кейс 2: NetBSD как окружение для разработки и портирования BSD-приложений
Задача: Разработчику нужно проверить, что приложение корректно компилируется и работает на NetBSD, не имея под рукой физического железа с этой системой.
Решение: VM с общей папкой между хостом и гостем через 9P/VirtFS.
qemu-system-x86_64 \ -enable-kvm \ -machine q35 \ -cpu host \ -m 2048 \ -drive file=netbsd.qcow2,format=qcow2,if=virtio \ -kernel netbsd-kernel \ -append "root=wd0a console=com0" \ -virtfs local,path=/home/user/project,mount_tag=hostshare,security_model=mapped \ -net nic,model=virtio -net user \ -nographic
Внутри NetBSD монтируем общую папку:
mount_9p hostshare /mnt/hostshare
Теперь можно редактировать код на хосте в любимом редакторе, а компилировать и тестировать — внутри NetBSD. Удобно и быстро.
Кейс 3: NetBSD как lightweight VM для CI/CD
Задача: Запускать быстрые одноразовые VM для прогона тестов в CI/CD пайплайне. Время жизни VM — минуты. Скорость запуска критична.
Решение: Используем PVH boot + MICROVM kernel + snapshot базового образа. Запуск нового инстанса — из готового снапшота за секунды.
# Создаём базовый образ (делается один раз) qemu-img create -f qcow2 netbsd-base.qcow2 10G # ... устанавливаем NetBSD, настраиваем окружение ... # Создаём overlay-образ поверх базового (для каждого CI-прогона) qemu-img create -f qcow2 -b netbsd-base.qcow2 -F qcow2 netbsd-ci-run.qcow2 # Запускаем VM из overlay - базовый образ не меняется qemu-system-x86_64 \ -enable-kvm \ -machine q35 \ -cpu host \ -m 1024 \ -drive file=netbsd-ci-run.qcow2,format=qcow2,if=virtio \ -kernel netbsd-kernel \ -append "root=wd0a console=com0" \ -net nic,model=virtio -net user \ -nographic # После завершения — просто удаляем overlay rm netbsd-ci-run.qcow2
Каждый CI-прогон получает чистую VM за секунды. Базовый образ не затрагивается. PVH boot обеспечивает минимальное время старта.
Преимущества PVH boot: подводим итог
- Быстрый запуск VM — загрузка ядра напрямую, без BIOS-инициализации и многоступенчатого bootloader’а.
- Меньше эмулированного железа — нет фиктивных PCI-устройств, нет ISA-шины, нет legacy-компонентов. Меньше точек отказа.
- Меньше overhead гипервизора — паравиртуализированные драйверы работают эффективнее полной эмуляции.
- Идеален для micro-VM — в связке с MICROVM kernel получается минимальный стек без лишнего.
- Предсказуемое поведение — цепочка загрузки короче и проще, меньше мест где может что-то пойти не так.
Возможные проблемы и troubleshooting
VM не загружается: kernel panic или зависание
Причина: Неправильные параметры -append. Чаще всего — неверное имя корневого устройства.
Решение: Проверьте имя корневого диска. В NetBSD при virtio-диске это wd0a или sd0a в зависимости от драйвера. Попробуйте оба варианта:
-append "root=wd0a console=com0" # или -append "root=sd0a console=com0"
Нет вывода в терминале при использовании -nographic
Причина: Консоль ядра не перенаправлена на последовательный порт.
Решение: Убедитесь, что в параметрах ядра указано console=com0. На некоторых конфигурациях NetBSD нужно дополнительно прописать консоль в /etc/ttys внутри гостевой системы.
Ошибка: «KVM not available» или медленная работа
Причина: KVM не загружен или виртуализация отключена в BIOS.
# Проверяем поддержку виртуализации процессором grep -E '(vmx|svm)' /proc/cpuinfo # Проверяем загружен ли модуль KVM lsmod | grep kvm # Загружаем вручную sudo modprobe kvm_intel # для Intel sudo modprobe kvm_amd # для AMD
Ошибка при монтировании qcow2 для извлечения ядра
Причина: Смещение раздела определено неверно или образ не конвертирован в raw.
# Альтернативный способ — использовать guestfish (пакет libguestfs-tools) sudo apt install libguestfs-tools guestfish -a netbsd.qcow2 ><fs> run ><fs> list-filesystems ><fs> mount /dev/sda1 / ><fs> copy-out /netbsd /tmp/netbsd-kernel ><fs> exit
Сеть не работает внутри VM
Причина: Виртуальный сетевой интерфейс не настроен автоматически.
Решение: Внутри NetBSD настраиваем интерфейс вручную:
# vioif0 — имя virtio-сетевого интерфейса в NetBSD ifconfig vioif0 up dhcpcd vioif0
Для автоматической настройки при каждой загрузке добавляем в /etc/rc.conf:
dhcpcd=YES
Когда стоит использовать PVH boot
PVH boot — не серебряная пуля, но в ряде сценариев он явно лучше стандартного HVM:
- CI/CD окружения — частые запуски и остановки VM. Каждая секунда запуска на счету.
- Micro-VM и serverless — минимальные VM с коротким временем жизни. PVH + MICROVM kernel = минимальный overhead.
- Облачные лаборатории — если запускаете NetBSD VM десятками для тестирования, быстрый старт экономит реальное время.
- Разработка и отладка ядра NetBSD — быстрый цикл перезапуска VM ускоряет итерации.
Для долгоживущих серверных VM (бэкенд, база данных, файловый сервер) разница во времени загрузки некритична. Там важнее runtime-производительность, и HVM с virtio-драйверами справляется отлично.
Заключение
Мы прошли полный путь: от установки QEMU и скачивания NetBSD 11 до запуска виртуальной машины с PVH boot и трёх практических кейсов. PVH boot в NetBSD 11 — это реальное ускорение запуска VM и уменьшение накладных расходов гипервизора, особенно заметное в сценариях с частыми перезапусками.
В связке с MICROVM kernel, virtio-устройствами и overlay-образами на qcow2 получается лёгкий и быстрый стек виртуализации на базе NetBSD — вполне конкурентоспособный для CI/CD и облачных лабораторий.
Запустили NetBSD в QEMU? Столкнулись с нестандартным поведением PVH? Пишите в комментарии — разберём. А в следующей статье поговорим про настройку сети в NetBSD: от базовой конфигурации до VLAN и bridge.
Оставайтесь на связи
Рецепты от IT-боли. Без воды, без рекламы, без маркетинговой шелухи.
Подписаться на IT-Аптеку →



