Перейти к основному содержимому

QEMU эмулятор для микропроцессоров Baikal-M и Baikal-S

⤓ Скачать документ

Перед тем как начать установку QEMU, вам потребуется:

Компоненты Baikal ARM64 SDK Требование

Если у вас не установлен Baikal ARM64 SDK:

Установка Baikal ARM64 SDK Загрузка Baikal ARM64 SDK

Введение

QEMU (Quick Emulator) – эмулятор, который позволяет запускать виртуальную машину под операционной системой Linux. Эмулятор предназначен для работы на ОС GNU/Linux.

SDK (Software Development Kit) ARM64 предназначен для создания сборок образов и различных модулей (таких как образ файловой системы, UEFI образ, модули ядра VDec или ядра Linux с определенной конфигурацией), а так же файловых систем с дополнительными пакетами утилит для микропроцессоров Байкал-М и Байкал-S.

DBK (Debian-kit) – набор компонентов для создания образа с ОС Debian Linux, предназначенного для работы на платформах Байкал-М и Байкал-S.

SDK QEMU-ADDON – пакет расширения Baikal ARM64 SDK, включающий эмулятор на основе QEMU, набор компонентов DBK, а так же некоторые пакеты обновлений, которые необходимы для работы элементов SDK в QEMU. Этот пакет расширения позволяет собрать и запустить виртуальную машину, эмулирующую набор устройств и функционал платформы на базе Байкал-М и Байкал-S.

На следующей схеме показано, как при отсутствии физического устройства на базе Байкал-M или Байкал-S программисты могут использовать эмулятор QEMU на рабочей станции x86-64 для разработки и отладки кода, предназначенного для исполнения на этих микропроцессорах с архитектурой ARM64.

Данный документ содержит краткое описание процесса установки пакета расширения QEMU (Установка пакета расширения QEMU), описание процесса сборки QEMU (Сборка QEMU), a также описание запуска QEMU с Debian-kit.

Примечание

Работа с Baikal ARM64 SDK и QEMU должна производиться на компьютере с операционной системой GNU/Linux. Все описанные в данном документе команды (для установки, сборки и запуска) производятся через терминал или командную строку операционной системы.

Установка пакета расширения QEMU

Пакет расширения QEMU предназначен для работы с Baikal ARM64 SDK.

Внимание

Для работы QEMU необходимо установить Baikal ARM64 SDK (см. Обзор Baikal ARM64 SDK).

Для работы QEMU необходимо установить следующие пакеты:

sudo apt-get install acpica-tools autoconf automake bc bison \
build-essential clang flex fonts-freefont-ttf genext2fs imagemagick \
libarchive-zip-perl libfdt-dev libglib2.0-dev libncurses-dev \
libpixman-1-dev libssl-dev m4 mtools uuid-dev xxd zlib1g-dev \
make gcc dosfstools parted ninja-build qemu-utils nbd-client \
valgrind xfslibs-dev libslirp-dev python3-venv

Внимание

В состав QEMU входят некоторые файлы, которые имеются в базовом Baikal ARM64 SDK. При установке QEMU такие файлы будут обновлены. Если в исходном коде SDK были произведены изменения, то после установки пакета расширения QEMU (в зависимости от версии SDK и версии QEMU) они могут быть удалены из следующих файлов:

  • ${SDK_ROOT}/tools/build-boot-img.sh
  • ${SDK_ROOT}/tools/build-initrd-img.sh
  • ${SDK_ROOT}/tools/environment.sh
  • ${SDK_ROOT}/tools/run-qemu.sh
  • ${SDK_ROOT}/src/arm-tf/plat/baikal/bs1000/drivers/bs1000_cmu.c
  • ${SDK_ROOT}/src/kernel/arch/arm64/boot/dts/baikal/bs1000-qemu-s.dts
  • ${SDK_ROOT}/src/uefi/Platform/Baikal/BS1000Rdb/BS1000Rdb.fdf

Если в указанных файлах производились изменения, необходимо выполнить следующие действия:

  • Сохранить внесенные в код изменения
  • Установить пакет расширения QEMU
  • Восстановить внесенные изменения с учетом обновления кода, вызванного установкой QEMU (обычное копирование файлов может привести к некорректной работе SDK)
  • Повторно собрать SDK с опцией --clean

Для установки пакета QEMU необходимо выполнить следующие действия:

  1. Запросить актуальную ссылку на скачивание в support@baikalelectronics.ru

  2. Поместить установочный файл QEMU baikal-arm64-<sdk_version>-qemu_addon-<addon_version>.run в ту же директорию, где находится установочный файл Baikal ARM64 SDK baikal-arm64-<sdk_version>.run

    Примечание

    Если установочный файл Baikal ARM64 SDK размещен в рабочей директории (например /home/SDK/), то после его распаковки в этой директории автоматически будет создана директория baikal-arm64-<sdk_version>/.
    Для корректной установки и дальнейшей работы пакет расширения QEMU должен находиться и запускаться в той же рабочей директории (например /home/SDK/).

  3. Открыть рабочую директорию с установочными файлами в терминале следующей командой:

    cd /home/SDK/
  4. Установить разрешение на запуск файла как исполняемого следующей командой:

    chmod +x ./baikal-arm64-<sdk_version>-qemu_addon-<addon_version>.run
  5. Распаковать пакет расширения QEMU, введя следующую команду:

    ./baikal-arm64-<sdk_version>-qemu_addon-<addon_version>.run
    Внимание

    Необходимо полное совпадение <sdk_version> в имени установочного файла пакета расширения QEMU и самого Baikal ARM64 SDK. В противном случае пакет расширения QEMU будет установлен некорректно и работать не будет. Например, если установочный файл Baikal ARM64 SDK имеет имя baikal-arm64-5.6-20220727.run, то установочный файл пакета расширения QEMU должен иметь наименование baikal-arm64-5.6-20220727-qemu_addon-20220822.run.

Сборка QEMU

Запуск скрипта сборки осуществляется из директории, в которой были размещены установочные файлы SDK и пакета расширения QEMU, рядом с директорией ${SDK_ROOT}.

Примечание

Здесь и далее по тексту ${SDK_ROOT} будет использоваться для обозначения полного пути к корневой директории Baikal ARM64 SDK.

Команда сборки QEMU для Baikal ARM64 SDK в зависимости от версии ядра Linux выглядит следующим образом:

sudo ${SDK_ROOT}/tools/build-boot-img.sh <target> \
--clean --defconfig --kernel --initrd --uefi \
--tfa --qemu -dbk=<опция dbk> --empties --bootrom-linux

Для параметра <target> может использоваться одно из следующих значений:

  • qemu-m – для сборки эмулируемой системы с микропроцессором Байкал-M
  • qemu-s – для сборки эмулируемой системы с микропроцессором Байкал-S

Для сборки образа с Debian необходимо использовать следующий параметр:

  • -dbk=<опция dbk>

В качестве <опции dbk> может использоваться одно из следующих значений:

  • r – reset
    Данная опция используется для удаления существующего образ с системой и создания нового. Все изменения внутри виртуальной машины с Debian будут удалены.

  • e – erase
    Данная опция используется для удаления существующего образа.

  • u – update
    Данная опция используется для обновления ядра и модулей ядра в уже существующем образе с системой. Если образ системы не существует, то он будет создан автоматически.

  • empty=<size>
    Данная опция создает пустой образ диска с именем по умолчанию (далее диск по умолчанию) qemu_drive.iso и заданным размером <size> в Мб. Используется с вашим установочным образом (см. раздел Подключение сторонних загрузочных образов).

  • reverse
    Данная опция используется для создания ресурсов из существующего образа, если были внесены изменения в ходе работы с эмулятором. Таким образом вы можете сохранить изменения в ресурсах и в дальнейшем использовать их для создания образа по умолчанию. Данные ресурсы создаются в директории ${SDK_ROOT}/img в виде <timestamp>-efi.tar.xz1 и <timestamp>-rootfs.tar.xz. Для использования ресурсов, необходимо заменить оригинальные файлы в директории ${SDK_ROOT}/resources/debian-kit/, переименовав их соответственно. Рекомендуется сохранить оригинальные файлы для обеспечения возможности восстановления.

Внимание

При сборке QEMU с опцией –dbk скрипт необходимо запускать с правами супер пользователя.

Образ создается с рекомендованным размером 512MB для раздела UEFI и 2GB для rootfs. Вы можете изменить значения параметров DBK_IMG_UEFI_SIZE и DBK_IMG_ROOTFS_SIZE в файле ${SDK_ROOT}/tools/environment.sh, если хотите увеличить или уменьшить размеры разделов. Конечный образ системы будет занимать реальный суммарный объем этих двух разделов на вашем диске (скрипт сборки автоматически проверит, хватает ли свободного дискового пространства). При стандартных параметрах сборки объем собранного SDK составляет порядка 8,2GB.

Примечание

Чрезмерное заполнение диска может привести к сбоям в работе системы как хост-машины (при истощении свободного пространства физического жесткого диска), так и гостевой виртуальной машины (при выделении недостаточного объема раздела rootfs).

Запуск QEMU с Debian-kit

Команда запуска эмулятора выглядит следующим образом:

${SDK_ROOT}/tools/run-qemu.sh <target> <option>

В качестве параметра <target> может использоваться одно из следующих значений:

  • baikal-m – запуск QEMU, собранного с параметром qemu-m, для эмуляции системы с микропроцессором Байкал-M
  • baikal-s – запуск QEMU, собранного с параметром qemu-s, для эмуляции системы с микропроцессором Байкал-S

Для параметра <option> может использоваться одно единственное значение:

  • -dbk – запуск эмулируемой системы с выбранным микропроцессором (параметр <target>) и гостевой операционной системой Debian.

    Например, для эмуляции системы с микропроцессором Байкал-M и гостевой операционной системой Debian используется следующая команда:

    ${SDK_ROOT}/tools/run-qemu.sh baikal-m -dbk
    Примечание

    Эмулятор QEMU для Baikal ARM64 SDK с ядром Linux 5.4 поддерживает возможность запуска гостевой операционной системы Baikal Embedded Linux (BEL). Для запуска BEL в качестве гостевой ОС необходимо собрать QEMU с параметром --bootrom-linux и выполнить следующую команду:

    ${SDK_ROOT}/tools/run-qemu.sh <target>

После успешного запуска эмулятора, вам будет предложено авторизоваться в системе.

Примечание

Демон авторизации не производит очистку экрана и начинает писать приглашение авторизации поверх вывода журнала. После того как будет доступен вход в систему, для удобства можно удерживать клавишу "Enter" до тех пор, пока приглашение авторизации не переместится в нижнюю часть экрана.

Для авторизации используются следующие данные:

  • Baikal login: root
  • Password: 12345678

Система по умолчанию будет ожидать попытку авторизации в течение одного часа. Если вычислительных мощностей вашей хост-машины не хватает для выполнения авторизации в течение этого времени, вы можете изменить параметр LOGIN_TIMEOUT в файле /etc/login.defs вашей гостевой машины, зайдя в режим recovery через GRUB при запуске QEMU.

QEMU эмулятор не подходит для отладки сложных систем, таких как базы данных или веб-серверы. На эмуляторе можно отлаживать простые приложения или начальные загрузчики. Всю основную отладку лучше проводить на реальном оборудовании.

Примечание

Для эмуляции работы всех 48 ядер микропроцессора Байкал-S необходимо иметь на рабочей станции x86-64 процессор с числом потоков не менее 16 (например, AMD Ryzen 7 3700).
Для менее мощных рабочих станций в Baikal ARM64 SDK версии 5.8 и актуальной версии QEMU-аддона к SDK добавлена возможность эмуляции работы четырех ядер Байкал-S. Для этого в GRUB необходимо выбрать пункт Baikal-S [trim cpu’s], для которого установлено ограничение числа запускаемых ядер (maxcpus=4).

Данный эмулятор QEMU был протестирован со следующими дистрибутивами Linux:

  • Debian 11
  • Ubuntu server 22.04
  • Linux Mint
  • Arch Linux
  • Manjaro Linux

Ручной запуск загрузчика GRUB

Если по каким-то причинам при эмуляции системы в автоматическом режиме не запустился загрузчик, для выбора загрузки Debian возможен вариант ручного запуска загрузчика GRUB через UEFI или Shell.

Для запуска загрузчика GRUB через UEFI необходимо выполнить следующие действия:

  1. Во время загрузки системы, при появлении сообщения
    Press <Esc> or <F2> to enter setup, <S> to enter shell, <Enter> to continue...
    нажать F2 для входа в UEFI.

  2. В окне UEFI необходимо последовательно выбрать следующие пункты:
    a. Boot Maintenance Manage
    b. Boot From File
    c. Первый раздел на диске (имя раздела может быть немного другим):
    NO VOLUME LABEL,[VenHw(0D51905B-B77E-452A-A2C0-ECA0CC8D514A,0000A100 0000000000)/USB(0x0,0x0)/HD(1,GPT,54E6BEEF-E14D-4E4F -9477-42EB1F39CBAF,0x22,0xF421F)]
    d. <efi>
    e. <boot>
    f. bootaa64.efi

После выбора пункта bootaa64.efi откроется меню загрузчика GNU GRUB. В меню GRUB необходимо выбрать нужную опцию запуска.

Подключение сторонних загрузочных образов

Начиная с Baikal ARM64 SDK версии 5.6, в эмуляторе QEMU вы можете установить собственную версию ОС на виртуальный жесткий диск вашей виртуальной машины. Для этого необходимо:

  1. Собрать QEMU для выбранного типа эмулируемого микропроцессора <target>, дополнительно указав параметр --empty=<size>.
    Данный параметр позволяет создать образ "диска по умолчанию" (см. Сборка QEMU)

  2. Запустить QEMU следующей командой:

    ${SDK_ROOT}/tools/run-qemu.sh <target> --qemu_drive --custom_drive=<path>
    • --qemu_drive - Подключение "диска по умолчанию"
    • --custom_drive=<path> - Подключение вашего загрузочного образа, расположенного по пути <path>

Пример команды запуска эмулятора со сторонним загрузочным образом представлен ниже.

${SDK_ROOT}/tools/run-qemu.sh baikal-m --qemu_drive --custom_drive=/home/my_boot_drive.iso

После выполнения данной команды, эмулятор запустится в штатном режиме, и вам необходимо выбрать загрузочный файл через UEFI Shell, как описано в разделе
Запуск загрузчика через Shell.

После установки вашей ОС на "диск по умолчанию" вы можете опустить параметр запуска --custom_drive=<path> или использовать его для подключения любого образа диска (справедливо и для запуска эмулятора с параметром --dbk).

Внимание

Параметр запуска --qemu_drive несовместим c параметром --dbk.

Требования к гостевой ОС

Эмулятор выставляет определенные требования к гостевой ОС, а именно – настройку консоли вывода и сессии авторизации.

Для того, чтобы получить корректный вывод информации из эмулятора "на экран", вам необходимо запустить ядро вашей гостевой ОС со следующими параметрами:

  • Для запуска ядра Linux на платформе Байкал-M

    earlycon=uart8250,mmio32,0x20230000 console=uart8250,mmio32,0x20230000 initcall_debug ignore_loglevel
  • Для запуска ядра Linux на платформе Байкал-S:

    earlycon=pl011,0xc00000 console=ttyAMA0,115200n8 initcall_debug ignore_loglevel

Так же возможных настроек потребует сервис авторизации. Например, для связки getty и systemd вам потребуется создать файл getty@ttyS0.service для Байкал-M или getty@ttyAMA0.service для Байкал-S по пути /etc/systemd/system, со следующим содержимым:

# SPDX-License-Identifier: LGPL-2.1-or-later
[Unit]
Description=Getty on %I
Documentation=man:agetty(8) man:systemd-getty-generator(8)
Documentation=http://0pointer.de/blog/projects/serial-console.html
After=systemd-user-sessions.service plymouth-quit-wait.service getty-pre.target
After=rc-local.service
Before=getty.target
IgnoreOnIsolate=yes
Conflicts=rescue.service
Before=rescue.service
ConditionPathExists=/dev/tty0
[Service]
ExecStart=-/sbin/agetty %I $TERM Type=idle
Restart=always
RestartSec=0
UtmpIdentifier=%I
TTYPath=/dev/%I
TTYReset=yes
TTYVHangup=yes
TTYVTDisallocate=yes
IgnoreSIGPIPE=no
SendSIGHUP=yes
UnsetEnvironment=LANG LANGUAGE LC_CTYPE LC_NUMERIC LC_TIME LC_COLLATE LC_MONETARY LC_MESSAGES LC_PAPER LC_NAME LC_ADDRESS LC_TELEPHONE LC_MEASUREMENT LC_IDENTIFICATION
[Install]
WantedBy=getty.target
DefaultInstance=tty1

После создания файла, необходимо активировать его следующей командой:

systemctl enable <file_name>

Также можно создать ссылку на него вручную в директории /etc/systemd/system/getty.target.wants/.

История изменений

ВерсияДатаОписание
1.026.05.2022Начальная версия
1.114.06.2022В раздел Запуск QEMU с Debian-kit добавлен ручной запуск загрузки Debian для Байкал-S
1.322.09.2022Добавлены разделы Ручной запуск загрузчика GRUB, Подключение сторонних загрузочных образов и Требования к гостевой ОС
1.417.11.2022В раздел Введение добавлен рисунок
1.515.02.2023Для Baikal ARM64 SDK 5.8 и QEMU-ADDON добавлена возможность эмулировать работу четырех ядер Байкал-S для слабых рабочих станций
1.611.07.2023В разделе Установка пакета расширения QEMU расширен список пакетов, необходимых для работы актуальной версией QEMU.

Добавлена информация по сборке и запуску QEMU для Baikal ARM64 SDK на базе ядра Linux 6.1.

  1. Timestamp - временная метка запуска скрипта.