<p>Если вы когда-нибудь пробовали запустить <strong>NetBSD в виртуальной машине</strong> несколько лет назад — вы помните, как это выглядело. Долгая загрузка, куча эмулированного железа, которое гостевая ОС не очень-то понимала, и общее ощущение, что система чувствует себя в виртуалке не в своей тарелке. С выходом <strong>NetBSD 11</strong> ситуация изменилась: появилась поддержка <strong>PVH boot</strong> не только для Xen, но и для QEMU. Если раньше NetBSD в виртуалке запускалась «как получится», то с PVH boot она начинает летать.</p>
<p>В этом руководстве разберём по шагам: что такое PVH boot, зачем он нужен, как поднять <strong>NetBSD в QEMU</strong> с нуля и как задействовать PVH для ускорения виртуальной машины. Всё с реальными командами, без воды.</p>
<h2>Что такое PVH boot и почему это важно</h2>
<p><strong>PVH (Para-Virtualized Hardware)</strong> — это режим загрузки виртуальной машины, который объединяет лучшее из двух миров виртуализации:</p>
<ul>
<li><strong>Паравиртуализация (PV)</strong> — гостевая ОС знает, что работает в виртуальной среде, и использует оптимизированные драйверы вместо эмулированного железа.</li>
<li><strong>Аппаратная <a class="wpil_keyword_link" href="https://it-apteka.com/category/virtualise/" target="_blank" rel="noopener" title="Виртуализация" data-wpil-keyword-link="linked" data-wpil-monitor-id="730">виртуализация</a> (HVM)</strong> — использование расширений процессора (Intel VT-x / AMD-V) для запуска кода без трансляции.</li>
</ul>
<p>PVH берёт аппаратную изоляцию от HVM и паравиртуализированные интерфейсы ввода-вывода от PV. Результат: виртуальная машина загружается быстро, работает с минимальными накладными расходами и не тащит за собой груз legacy BIOS-эмуляции.</p>
<p>Конкретно PVH boot убирает из цепочки запуска:</p>
<ul>
<li>эмуляцию BIOS/UEFI (SeaBIOS, OVMF)</li>
<li>инициализацию фиктивных PCI-устройств</li>
<li>лишние этапы bootloader’а</li>
</ul>
<p>Итог — VM стартует заметно быстрее. Для CI/CD пайплайнов или micro-VM, которые запускаются и гасятся десятки раз в день, это ощутимая разница.</p>
<figure><img alt="Архитектура PVH boot: схема взаимодействия гипервизора QEMU и гостевой ОС NetBSD" /><figcaption>Схема: архитектура PVH boot — между паравиртуализацией и аппаратной виртуализацией</figcaption></figure>
<h2>Почему PVH появился в NetBSD 11</h2>
<p>Исторически PVH boot в BSD-мире был вотчиной Xen. NetBSD поддерживала его под Xen уже несколько лет. Но мир движется в сторону QEMU, KVM и лёгких гипервизоров вроде Firecracker — особенно в облачных средах и CI/CD инфраструктуре.</p>
<p>В NetBSD 11 разработчики расширили поддержку PVH boot на <strong>QEMU/KVM</strong>. Это открывает несколько новых сценариев использования:</p>
<ul>
<li>NetBSD как лёгкая гостевая ОС в облачной инфраструктуре на базе QEMU</li>
<li>Быстрые одноразовые VM для тестирования и разработки</li>
<li>NetBSD в роли micro-VM в Firecracker-совместимых средах</li>
</ul>
<p>В сочетании с новым <strong>MICROVM kernel</strong> (тоже из NetBSD 11) получается по-настоящему лёгкий стек виртуализации. Подробнее о MICROVM kernel — в нашей статье про <a href="#">что нового в NetBSD 11.0-RC2</a>.</p>
<h2>Что понадобится для запуска NetBSD в QEMU</h2>
<p>Прежде чем переходить к командам — быстрый чеклист:</p>
<ul>
<li><strong>Хост-система:</strong> Linux (предпочтительно), FreeBSD или macOS</li>
<li><strong>Процессор с поддержкой виртуализации:</strong> Intel VT-x или AMD-V, включённое в BIOS/UEFI</li>
<li><strong>QEMU:</strong> версия 6.0 и выше (для корректной поддержки PVH рекомендуется 7.0+)</li>
<li><strong>KVM:</strong> модуль ядра kvm_intel или kvm_amd (только на Linux — для аппаратного ускорения)</li>
<li><strong>ISO-образ NetBSD 11:</strong> скачаем ниже</li>
<li><strong>Свободное место на диске:</strong> минимум 5 ГБ, рекомендуется 20 ГБ</li>
<li><strong>RAM для гостевой VM:</strong> минимум 512 МБ, комфортно — 2 ГБ</li>
</ul>
<p>Проверить наличие <a href="https://it-apteka.com/apache-guacamole-odin-portal-dlja-vseh-udalennyh-podkljuchenij/" title="Apache Guacamole: Один портал для всех удаленных подключений" target="_blank" rel="noopener" data-wpil-monitor-id="1693">KVM на Linux</a>:</p>
<pre><code class="language-bash">
lsmod | grep kvm
# Должно быть: kvm_intel или kvm_amd
# Если модуль не загружен:
sudo modprobe kvm-intel
# или
sudo modprobe kvm-amd
</code></pre>
<h2>Установка QEMU на хост-систему</h2>
<p>Устанавливаем QEMU в зависимости от вашей платформы.</p>
<h3>Ubuntu / Debian</h3>
<pre><code class="language-bash">
sudo apt update
sudo apt install qemu-system-x86 qemu-utils
</code></pre>
<h3>Arch Linux</h3>
<pre><code class="language-bash">
sudo pacman -S qemu-full
</code></pre>
<h3>Fedora / RHEL / Rocky Linux</h3>
<pre><code class="language-bash">
sudo dnf install qemu-kvm qemu-img
</code></pre>
<h3>FreeBSD</h3>
<pre><code class="language-bash">
pkg install qemu
</code></pre>
<h3>macOS (через Homebrew)</h3>
<pre><code class="language-bash">
brew install qemu
</code></pre>
<p>После установки проверяем версию:</p>
<pre><code class="language-bash">
qemu-system-x86_64 --version
# QEMU emulator version 8.x.x
</code></pre>
<h2>Скачивание ISO-образа NetBSD 11</h2>
<p>Берём образ с официального CDN NetBSD. На момент написания статьи актуален RC2:</p>
<pre><code class="language-bash">
# 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
</code></pre>
<p>Когда выйдет финальный релиз NetBSD 11.0, путь изменится на <code>/pub/NetBSD/NetBSD-11.0/</code>. Актуальные ссылки всегда есть на <a href="https://www.netbsd.org/releases/" target="_blank" rel="noopener">официальной странице релизов NetBSD</a>.</p>
<h2>Создание образа диска для виртуальной машины</h2>
<p>Создаём виртуальный диск в формате qcow2 — это стандартный формат QEMU с поддержкой снапшотов и динамическим выделением места:</p>
<pre><code class="language-bash">
qemu-img create -f qcow2 netbsd.qcow2 20G
</code></pre>
<p>Почему qcow2, а не raw:</p>
<ul>
<li>Динамически растёт по мере заполнения — 20G на диске не занимает сразу</li>
<li>Поддерживает снапшоты — удобно для экспериментов</li>
<li>Поддерживает сжатие и шифрование</li>
</ul>
<p>Если нужна максимальная производительность дискового ввода-вывода — можно использовать raw, но для лабораторных задач qcow2 оптимален.</p>
<figure><img alt="Схема виртуализации QEMU: гостевая NetBSD, виртуальный диск qcow2 и гипервизор KVM" /><figcaption>Схема: как QEMU организует виртуальную машину NetBSD — от образа диска до гипервизора KVM</figcaption></figure>
<h2>Запуск NetBSD в QEMU: стандартный режим (установка)</h2>
<p>Сначала запускаем <a title="Docker Compose - установка, команды и настройка контейнеров" href="https://it-apteka.com/docker-compose-ustanovka-komandy-i-nastrojka-kontejnerov/" target="_blank" rel="noopener" data-wpil-monitor-id="723">установку в обычном режиме HVM —</a> загружаемся с ISO и устанавливаем систему на виртуальный диск:</p>
<pre><code class="language-bash">
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
</code></pre>
<p>Разбираем параметры:</p>
<ul>
<li><code>-enable-kvm</code> — включить аппаратное ускорение через KVM (только Linux)</li>
<li><code>-m 2048</code> — 2 ГБ RAM для гостевой системы</li>
<li><code>-smp 2</code> — 2 виртуальных CPU</li>
<li><code>-hda netbsd.qcow2</code> — виртуальный диск</li>
<li><code>-cdrom</code> — путь к ISO-образу</li>
<li><code>-boot d</code> — загрузка с CD-ROM</li>
<li><code>-net nic -net user</code> <a title="DHCP Snooping - что это такое и как защитить сеть от Rogue DHCP сервера" href="https://it-apteka.com/dhcp-snooping-chto-jeto-takoe-i-kak-zashhitit-set-ot-rogue-dhcp-servera-2/" target="_blank" rel="noopener" data-wpil-monitor-id="724">— простая сеть</a> через NAT (интернет внутри VM работает)</li>
<li><code>-nographic</code> — вывод в терминал вместо окна GUI</li>
</ul>
<p>Установщик NetBSD — текстовый, но вполне дружелюбный. Следуем инструкциям: выбираем диск, раскладку, набор устанавливаемых компонентов. Для лабораторной VM достаточно базового набора. После завершения установки выключаем VM и <a title="Настройка динамической маршрутизации: переход со статики на OSPF и BGP [2026]" href="https://it-apteka.com/nastrojka-dinamicheskoj-marshrutizacii-perehod-so-statiki-na-ospf-i-bgp-2026/" target="_blank" rel="noopener" data-wpil-monitor-id="725">переходим к настройке</a> PVH boot.</p>
<h2>Запуск NetBSD в QEMU с PVH boot</h2>
<p>Для PVH boot нам нужно запускать VM напрямую через загрузку ядра NetBSD, минуя BIOS и bootloader. QEMU поддерживает это через параметр <code>-kernel</code>.</p>
<h3>Шаг 1: Извлекаем ядро NetBSD из установленной системы</h3>
<p>После установки NetBSD ядро находится в корне файловой системы — файл <code>netbsd</code>. Нам нужно его достать. Самый простой способ — примонтировать образ диска на хосте:</p>
<pre><code class="language-bash">
# Находим смещение раздела внутри 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
</code></pre>
<h3>Шаг 2: Запускаем VM с PVH boot</h3>
<pre><code class="language-bash">
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
</code></pre>
<p>Ключевые отличия от стандартного запуска:</p>
<ul>
<li><code>-machine q35</code> — современная архитектура чипсета, лучше подходит для PVH</li>
<li><code>-cpu host</code> — пробрасываем реальные флаги CPU хоста в гостевую VM</li>
<li><code>-drive ...,if=virtio</code> — паравиртуализированный диск вместо эмулированного IDE</li>
<li><code>-kernel netbsd-kernel</code> — прямая загрузка ядра, минуя BIOS</li>
<li><code>-append "root=wd0a console=com0"</code> — параметры ядра: корневой раздел и консоль</li>
<li><code>-net nic,model=virtio</code> — паравиртуализированная сетевая карта</li>
</ul>
<figure><img alt="Схема загрузки NetBSD VM в QEMU с PVH boot: прямая загрузка ядра без BIOS" /><figcaption>Схема: цепочка загрузки NetBSD в QEMU — PVH boot обходит BIOS и загружает ядро напрямую</figcaption></figure>
<h2>Проверка работы PVH boot внутри NetBSD</h2>
<p>После загрузки проверяем, что PVH boot работает корректно. Заходим в систему и смотрим dmesg:</p>
<pre><code class="language-bash">
dmesg | grep -i pvh
dmesg | grep -i xen
dmesg | grep -i hypervisor
</code></pre>
<p>Также полезно проверить параметры машины через sysctl:</p>
<pre><code class="language-bash">
sysctl machdep
sysctl machdep.cpu
</code></pre>
<p>Если загрузка прошла через PVH — в dmesg будет соответствующая информация об обнаруженном гипервизоре и режиме инициализации. Скорость загрузки по сравнению со стандартным HVM-режимом должна быть заметно выше — особенно на слабом железе или при частых перезапусках VM.</p>
<h2>Три практических кейса использования NetBSD в QEMU</h2>
<h3>Кейс 1: NetBSD как тестовый сервер для сетевых конфигураций</h3>
<p><strong>Задача:</strong> Нужно проверить поведение BSD-стека TCP/IP под нагрузкой или протестировать сетевые конфигурации без риска для продакшн-железа.</p>
<p><strong>Решение:</strong> NetBSD VM в QEMU с двумя виртуальными сетевыми интерфейсами — один в NAT (для доступа в интернет), второй в изолированную сеть для тестов.</p>
<pre><code class="language-bash">
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
</code></pre>
<p>Внутри NetBSD получаем два интерфейса: <code>vioif0</code> (NAT) и <code>vioif1</code> (изолированная сеть). Конфигурируем как нужно — без последствий для хоста.</p>
<h3>Кейс 2: NetBSD как окружение для разработки и портирования BSD-приложений</h3>
<p><strong>Задача:</strong> Разработчику нужно проверить, что приложение корректно компилируется и работает на NetBSD, не имея под рукой физического железа с этой системой.</p>
<p><strong>Решение:</strong> VM с общей папкой между хостом и гостем через 9P/VirtFS.</p>
<pre><code class="language-bash">
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
</code></pre>
<p>Внутри NetBSD монтируем общую папку:</p>
<pre><code class="language-bash">
mount_9p hostshare /mnt/hostshare
</code></pre>
<p>Теперь можно редактировать код на хосте в любимом редакторе, а компилировать и тестировать — внутри NetBSD. Удобно и быстро.</p>
<h3>Кейс 3: NetBSD как lightweight VM для CI/CD</h3>
<p><strong>Задача:</strong> Запускать быстрые одноразовые VM для прогона тестов в CI/CD пайплайне. <a title="Uptime Kuma - алертинг без заморочек для админа, который ценит время" href="https://it-apteka.com/uptime-kuma-alerting-bez-zamorochek-dlja-admina-kotoryj-cenit-vremja/" target="_blank" rel="noopener" data-wpil-monitor-id="726">Время жизни VM —</a> минуты. Скорость запуска критична.</p>
<p><strong>Решение:</strong> Используем PVH boot + MICROVM kernel + snapshot базового образа. Запуск нового инстанса — из готового снапшота за секунды.</p>
<pre><code class="language-bash">
# Создаём базовый образ (делается один раз)
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
</code></pre>
<p>Каждый CI-прогон получает чистую VM за секунды. Базовый образ не затрагивается. PVH boot обеспечивает минимальное время старта.</p>
<h2>Преимущества PVH boot: подводим итог</h2>
<ul>
<li><strong>Быстрый запуск VM</strong> — загрузка ядра напрямую, без BIOS-инициализации и многоступенчатого bootloader’а.</li>
<li><strong>Меньше эмулированного железа</strong> — нет фиктивных PCI-устройств, нет ISA-шины, нет legacy-компонентов. Меньше точек отказа.</li>
<li><strong>Меньше overhead гипервизора</strong> — паравиртуализированные драйверы работают эффективнее полной эмуляции.</li>
<li><strong>Идеален для micro-VM</strong> <a title="NetBSD 11.0-RC2 - что нового: RISC-V, MICROVM и улучшенная виртуализация" href="https://it-apteka.com/netbsd-11-0-rc2-chto-novogo-risc-v-microvm-i-uluchshennaja-virtualizacija/" target="_blank" rel="noopener" data-wpil-monitor-id="727">— в связке с MICROVM</a> kernel получается минимальный стек без лишнего.</li>
<li><strong>Предсказуемое поведение</strong> — цепочка загрузки короче и проще, меньше мест где может что-то пойти не так.</li>
</ul>
<h2>Возможные проблемы и troubleshooting</h2>
<h3>VM не загружается: kernel panic или зависание</h3>
<p><strong>Причина:</strong> Неправильные параметры <code>-append</code>. Чаще всего — неверное имя корневого устройства.</p>
<p><strong>Решение:</strong> Проверьте имя корневого диска. В NetBSD при virtio-диске это <code>wd0a</code> или <code>sd0a</code> в зависимости от драйвера. Попробуйте оба варианта:</p>
<pre><code class="language-bash">
-append "root=wd0a console=com0"
# или
-append "root=sd0a console=com0"
</code></pre>
<h3>Нет вывода в терминале при использовании -nographic</h3>
<p><strong>Причина:</strong> Консоль ядра не перенаправлена на последовательный порт.</p>
<p><strong>Решение:</strong> Убедитесь, что в параметрах ядра указано <code>console=com0</code>. На некоторых конфигурациях NetBSD нужно дополнительно прописать консоль в <code>/etc/ttys</code> внутри гостевой системы.</p>
<h3>Ошибка: «KVM not available» или медленная работа</h3>
<p><strong>Причина:</strong> KVM не загружен или виртуализация отключена в BIOS.</p>
<pre><code class="language-bash">
# Проверяем поддержку виртуализации процессором
grep -E '(vmx|svm)' /proc/cpuinfo
# Проверяем загружен ли модуль KVM
lsmod | grep kvm
# Загружаем вручную
sudo modprobe kvm_intel # для Intel
sudo modprobe kvm_amd # для AMD
</code></pre>
<h3>Ошибка при монтировании qcow2 для извлечения ядра</h3>
<p><strong>Причина:</strong> Смещение раздела определено неверно или образ не конвертирован в raw.</p>
<pre><code class="language-bash">
# Альтернативный способ - использовать 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
</code></pre>
<h3>Сеть не работает внутри VM</h3>
<p><strong>Причина:</strong> Виртуальный сетевой интерфейс не настроен автоматически.</p>
<p><strong>Решение:</strong> Внутри NetBSD настраиваем интерфейс вручную:</p>
<pre><code class="language-bash">
# vioif0 - имя virtio-сетевого интерфейса в NetBSD
ifconfig vioif0 up
dhcpcd vioif0
</code></pre>
<p>Для автоматической настройки при каждой загрузке добавляем в <code>/etc/rc.conf</code>:</p>
<pre><code class="language-bash">
dhcpcd=YES
</code></pre>
<h2>Когда стоит использовать PVH boot</h2>
<p>PVH boot — не серебряная пуля, но в ряде сценариев он явно лучше стандартного HVM:</p>
<ul>
<li><strong>CI/CD окружения</strong> — частые запуски и остановки VM. Каждая секунда запуска на счету.</li>
<li><strong>Micro-VM и serverless</strong> — минимальные VM с коротким временем жизни. PVH + MICROVM kernel = минимальный overhead.</li>
<li><strong>Облачные лаборатории</strong> — если запускаете NetBSD VM десятками для тестирования, быстрый старт экономит реальное время.</li>
<li><strong>Разработка и отладка ядра NetBSD</strong> — быстрый цикл перезапуска VM ускоряет итерации.</li>
</ul>
<p>Для долгоживущих серверных VM (бэкенд, база данных, файловый сервер) разница во времени загрузки некритична. Там важнее runtime-производительность, и HVM с virtio-драйверами справляется отлично.</p>
<h2>Заключение</h2>
<p>Мы прошли полный путь: от установки <a href="https://it-apteka.com/zapusk-skripta-ustanovki-microsoft-directx-net-framework-i-vc-v-steam-chto-jeto-i-kak-ispravit-zavisanie/" target="_blank" rel="noopener" data-wpil-monitor-id="775">QEMU и скачивания NetBSD</a> 11 до запуска виртуальной машины с PVH boot и трёх практических кейсов. <strong>PVH boot в NetBSD 11</strong> — это реальное ускорение запуска VM и уменьшение накладных расходов гипервизора, особенно заметное в сценариях с частыми перезапусками.</p>
<p>В связке с MICROVM kernel, virtio-устройствами и overlay-образами на qcow2 получается лёгкий и быстрый стек виртуализации на базе NetBSD — вполне конкурентоспособный для CI/CD и облачных лабораторий.</p>
<p>Запустили NetBSD в QEMU? Столкнулись с нестандартным поведением PVH? Пишите в комментарии — разберём. А в следующей статье поговорим про <a href="#">настройку сети в NetBSD: от базовой конфигурации до VLAN и bridge</a>.</p>
Если вы когда-нибудь пробовали запустить 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 boot — между паравиртуализацией и аппаратной виртуализацией
Почему 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 ГБ
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 оптимален.
Схема: как QEMU организует виртуальную машину NetBSD — от образа диска до гипервизора KVM
Запуск NetBSD в QEMU: стандартный режим (установка)
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
Также полезно проверить параметры машины через sysctl:
sysctl machdep
sysctl machdep.cpu
Если загрузка прошла через PVH — в dmesg будет соответствующая информация об обнаруженном гипервизоре и режиме инициализации. Скорость загрузки по сравнению со стандартным HVM-режимом должна быть заметно выше — особенно на слабом железе или при частых перезапусках VM.
Три практических кейса использования NetBSD в QEMU
Кейс 1: NetBSD как тестовый сервер для сетевых конфигураций
Задача: Нужно проверить поведение BSD-стека TCP/IP под нагрузкой или протестировать сетевые конфигурации без риска для продакшн-железа.
Решение: NetBSD VM в QEMU с двумя виртуальными сетевыми интерфейсами — один в NAT (для доступа в интернет), второй в изолированную сеть для тестов.
Внутри NetBSD получаем два интерфейса: vioif0 (NAT) и vioif1 (изолированная сеть). Конфигурируем как нужно — без последствий для хоста.
Кейс 2: NetBSD как окружение для разработки и портирования BSD-приложений
Задача: Разработчику нужно проверить, что приложение корректно компилируется и работает на NetBSD, не имея под рукой физического железа с этой системой.
Решение: VM с общей папкой между хостом и гостем через 9P/VirtFS.
Теперь можно редактировать код на хосте в любимом редакторе, а компилировать и тестировать — внутри 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 и облачных лабораторий.