Получаем виртуальный raspberry pi с помощью QEMU. Часть 2

Моя цель - предложение широкого ассортимента товаров и услуг на постоянно высоком качестве обслуживания по самым выгодным ценам.

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

Материала накопилось на целый туториал, потому что QEMU версии 6.2 отказался работать. Изучив материал "Реализации машины в QEMU" я принялся собирать последнюю версию эмулятора из исходных кодов. Это оказалось на удивление легко и быстро. Все действия я провожу на Ubuntu 22.

Работать будем в папке myQEMU. Обозначим полный путь к ней через переменную MyBaseDir

mkdir myQEMU
MyBaseDir="$PWD/$_"
cd "$MyBaseDir"

Собственно сборка QEMU из исходных кодов

git clone https://github.com/qemu/qemu.git
mkdir build_QEMU && cd $_
../qemu/configure --target-list=aarch64-softmmu
make -j16
cd "$MyBaseDir"

Проверим как собралось.
build_QEMU/qemu-system-aarch64 -M ?
Видим в длинном списке заветную строчку, радуемся
raspi3b Raspberry Pi 3B (revision 1.2)

В моём случае собралась версия с таким номером
build_QEMU/qemu-system-aarch64 --version
QEMU emulator version 8.0.50 (v8.0.0-918-g6972ef1440)
Copyright (c) 2003-2022 Fabrice Bellard and the QEMU Project developers

Использование QEMU

Скачаем последнюю доступную на текущий момент версию Raspberry Pi OS. Скачивать будем через торрент, чтобы не грузить лишний раз сеть производителя. Собственно для этих целей я использую утилиту aria2.

export IMAGE_FILE="2023-05-03-raspios-bullseye-arm64.img"
aria2c --seed-time=0 "https://downloads.raspberrypi.org/raspios_arm64/images/raspios_arm64-2023-05-03/$IMAGE_FILE.xz.torrent"

После того как скачали сжатый образ, распакуем его и удалим сжатый (чтобы места не занимал).
unxz "$IMAGE_FILE.xz"

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

TMP=$(mktemp -d)
LOOP=$(sudo losetup --show -fP "${IMAGE_FILE}")
echo "Script use folder "$TMP
sudo mount ${LOOP}p2 $TMP
sudo mount ${LOOP}p1 $TMP/boot/

Далее назначим логин pi и пароль password

sudo bash -c "cat <<EOF > $TMP/boot/userconf
pi:\\\$6\\\$jc2UtTCtwjTQ1Ytt\\\$W62IeROzUmoYrBRDD5uhHCRj/LQKA9YDoX1qEJAmT7A9c./micgLlexIaIRRgIZR32krnv1wYbbW046lYwgpO0
EOF"

Возможно старожилы помнят, что у расбиана был дефолтный логин-пароль. Так вот, начиная с версии 11, дефолтного нет. Совсем нет.

Далее необходимо сделать размер нашего образа кратным степени двойки. Тут на ваше усмотрение, мне достаточно 8 GiB. В притык делать не стоит, а то не сможете программы устанавливать и так далее...
build_QEMU/qemu-img resize -f raw "$IMAGE_FILE" 8G

build_QEMU/qemu-system-aarch64 \
-m 1024 \
-M raspi3b \
-kernel $TMP/boot/kernel8.img \
-dtb "$TMP/boot/bcm2710-rpi-3-b-plus.dtb" \
-drive file="$IMAGE_FILE",if=sd,format=raw \
-append "console=ttyAMA0 root=/dev/mmcblk0p2 rw rootwait rootfstype=ext4" \
-device usb-net,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::5555-:22 \
-device usb-mouse -device usb-tablet -device usb-kbd

Опции -device usb-mouse и -device usb-kbd отвечают за проброс мышки и клавиатуры соответственно.
А вот без важной опции -device usb-tablet у меня работала правая кнопка мыши, но не работало перемещение курсора по рабочему столу.

Кстати конфигурации QEMU для различных архитектур можно посмотреть в buildroot/board/qemu/ в файлах readme.txt или в питоновском скрипте runqemu от Yocto (пример).

Включим ssh. Теперь можно будет обращаться к нашей виртуальной машине по ssh.
sudo systemctl start ssh

Включить ssh можно и так

sudo raspi-config nonint do_ssh 1

А если на конце написать 0 - то это stop.

Далее с помощью resize2fs займём всё свободное место диска (в нашем случае 4 GiB), для этого воспользуемся всем известным стандартным скриптом Raspberry Pi OS по имени raspi-config. Чтобы не копаться вручную в меню, вот так можно вызвать этот скрипт в неинтерактивном виде
sudo raspi-config nonint do_expand_rootfs

Работа в консоли виртуальной машины закончена. В рамках данной статьи к
этой консоли обращаться более не будем. Сейчас необходимо открыть другую
консоль и все действия выполнять в ней.

Перейдём в нашу рабочую папку.
cd "$MyBaseDir"

Подготовим авторизацию по ключу к нашей машине, чтобы не входить по логин-пароль каждый раз. Ключи (закрытый и публичный) будем хранить в своей папке

mkdir ssh_key

Генерация ssh key
(Если ключ уже существует по данному пути, этот код его перезапишет)

ssh-keygen -f ssh_key/my_ssh_key -N "" -C myKeyForQEMU <<< $'\ny' >/dev/null 2>&1

Поместим ключ на виртуальную машину (тут единожды придётся ввести пароль)
ssh-copy-id -p 5555 -i ssh_key/my_ssh_key.pub pi@127.0.0.1
Кстати, вместо явного указания IP адреса127.0.0.1во всех местах можно писать слово localhost

Зададим права на публичный ключ (иначе Ubuntu не даст им пользоваться)
chmod 600 ssh_key/my_ssh_key.pub

Подключимся к нашей виртуальной машине.
ssh pi@127.0.0.1 -p 5555 -i ssh_key/my_ssh_key

Когда вы закончите настраивать системы, выключите виртуальную машину
sudo poweroff

Отмонтируйте образ от вашей хост-машины

sudo umount -f $TMP/boot/
sudo umount -f $TMP

и перенесите файл IMAGE_FILE на карту памяти реального одноплатника. И все ваши действия окажутся там уже выполненными.

Кстати, если вы хотите поместить весь процесс настройки дебиана в один мега-скрипт, то процедуру отмонтирования лучше сделать так.

Заметка "Нативная компиляция внутри эмулятора" тут и там.

Источник: https://habr.com/ru/articles/735754/


Интересные статьи

Интересные статьи

Машинное обучение меняет способы использования данных компаниями для обеспечения прибыльного роста, предоставляя возможность опередить своих конкурентов. Ведущие игроки на вашем рынке уже используют н...
Визуализация мозга это революционное направление в неврологии, оно позволяет исследователям получать беспрецедентное представление о структуре и функциях человеческого мозга. Одной из областей, где ви...
Заметки по языку R - это серия статей, в которых я собираю наиболее интересные публикации канала R4marketing из рубрики "#заметки_по_R".В прошлый раз мы говорили о нетипичных визуализациях, сегодняшня...
Предыдущий пост см. здесь. Этот пост посвящен регрессии.Хотя, возможно, и полезно знать, что две переменные коррелируют, мы не можем использовать лишь одну эту информацию...
Еще раз здравствуйте! До старта занятий в группе по курсу «Разработчик С++» остается меньше недели. В связи с этим мы продолжаем делиться полезным материалом переведенным специально для студентов...