QEMU эмулятор для микропроцессоров Baikal-M и Baikal-S
⤓ Скачать документПеред тем как начать установку QEMU, вам потребуется:
Если у вас не установлен 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 необходимо установить следующие пакеты:
- Для Debian 11
- Для Ubuntu
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
sudo apt-get install qemu-utils nbd-client ninja-build git \
libglib2.0-dev libfdt-dev libpixman-1-dev zlib1g-dev git-email \
libaio-dev libbluetooth-dev libbrlapi-dev libbz2-dev libcap-dev \
libcap-ng-dev libcurl4-gnutls-dev libgtk-3-dev libibverbs-dev \
libjpeg8-dev libncurses5-dev libnuma-dev librbd-dev librdmacm-dev \
libsasl2-dev libsdl1.2-dev libseccomp-dev libsnappy-dev libssh2-1-dev \
libvde-dev libvdeplug-dev libvte-2.91-dev libxen-dev liblzo2-dev \
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 необходимо выполнить следующие действия:
Запросить актуальную ссылку на скачивание в support@baikalelectronics.ru
Поместить установочный файл QEMU
baikal-arm64-<sdk_version>-qemu_addon-<addon_version>.run
в ту же директорию, где находится установочный файл Baikal ARM64 SDKbaikal-arm64-<sdk_version>.run
ПримечаниеЕсли установочный файл Baikal ARM64 SDK размещен в рабочей директории (например
/home/SDK/
), то после его распаковки в этой директории автоматически будет создана директорияbaikal-arm64-<sdk_version>/
.
Для корректной установки и дальнейшей работы пакет расширения QEMU должен находиться и запускаться в той же рабочей директории (например/home/SDK/
).Открыть рабочую директорию с установочными файлами в терминале следующей командой:
cd /home/SDK/
Установить разрешение на запуск файла как исполняемого следующей командой:
chmod +x ./baikal-arm64-<sdk_version>-qemu_addon-<addon_version>.run
Распаковать пакет расширения 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 выглядит следующим образом:
- Linux kernel 5.4
- Linux kernel 6.1
sudo ${SDK_ROOT}/tools/build-boot-img.sh <target> \
--clean --defconfig --kernel --initrd --uefi \
--tfa --qemu -dbk=<опция dbk> --empties --bootrom-linux
sudo ${SDK_ROOT}/tools/build-boot-img.sh <target> \
--clean --defconfig --kernel --initrd --uefi \
--tfa --qemu -dbk=<опция dbk> --empties --bootrom-padding
Для параметра <target>
может использоваться одно из следующих значений:
qemu-m
– для сборки эмулируемой системы с микропроцессором Байкал-Mqemu-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.xz
1 и<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
, для эмуляции системы с микропроцессором Байкал-Mbaikal-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.
- Запуск загрузчика через UEFI
- Запуск загрузчика через Shell
Для запуска загрузчика GRUB через UEFI необходимо выполнить следующие действия:
Во время загрузки системы, при появлении сообщения
Press <Esc> or <F2> to enter setup, <S> to enter shell, <Enter> to continue...
нажать F2 для входа в UEFI.В окне 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 необходимо выбрать нужную опцию запуска.
Для запуска загрузчика GRUB через Shell необходимо выполнить следующие действия:
Во время загрузки системы, при появлении сообщения
Press <Esc> or <F2> to enter setup, <S> to enter shell, <Enter> to continue...
нажать S для входа в UEFI ShellПри появлении сообщения
Press ESC in 2 seconds to skip startup.nsh or any other key to continue.
нажать любую кнопку для входаВыбрать загрузочный носитель, введя следующую команду в UEFI Shell
Shell> fs0:
ПримечаниеПо умолчанию загрузочный носитель
fs0:
, но он может быть иным, напримерfs1:
,fs2:
или другим. Необходимо выбрать загрузочный носитель с вашей ОС.Ввести следующую команду для запуска загрузчика GRUB:
FS0:\> efi\boot\bootaa64.efi
В появившемся меню GNU GRUB выбрать нужную опцию запуска.
Подключение сторонних загрузочных образов
Начиная с Baikal ARM64 SDK версии 5.6, в эмуляторе QEMU вы можете установить собственную версию ОС на виртуальный жесткий диск вашей виртуальной машины. Для этого необходимо:
Собрать QEMU для выбранного типа эмулируемого микропроцессора
<target>
, дополнительно указав параметр--empty=<size>
.
Данный параметр позволяет создать образ "диска по умолчанию" (см. Сборка QEMU)Запустить 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.0 | 26.05.2022 | Начальная версия |
1.1 | 14.06.2022 | В раздел Запуск QEMU с Debian-kit добавлен ручной запуск загрузки Debian для Байкал-S |
1.3 | 22.09.2022 | Добавлены разделы Ручной запуск загрузчика GRUB, Подключение сторонних загрузочных образов и Требования к гостевой ОС |
1.4 | 17.11.2022 | В раздел Введение добавлен рисунок |
1.5 | 15.02.2023 | Для Baikal ARM64 SDK 5.8 и QEMU-ADDON добавлена возможность эмулировать работу четырех ядер Байкал-S для слабых рабочих станций |
1.6 | 11.07.2023 | В разделе Установка пакета расширения QEMU расширен список пакетов, необходимых для работы актуальной версией QEMU. Добавлена информация по сборке и запуску QEMU для Baikal ARM64 SDK на базе ядра Linux 6.1. |
- Timestamp - временная метка запуска скрипта.↩