Сегодня я решил показать процесс создания "виртуального клона" raspberry pi (точнее raspberry pi 3b), хотя написанное будет актуально и для других компьютеров и не только одноплатных и слабеньких.

Зачастую новички используют поставляемую производителем операционную систему, систему на базе Debian. Загрузившись, новичок начинает настройку системы "под себя". При этом происходит и износ microsd. А также для многих действий (например, сборка программного обеспечения из исходных кодов) не хватает памяти... Также зачастую для работы требуется интернет, который на одноплатник может быть проблематично подвести по различным причинам. Например, интернет нужен только 1 раз при настройке, при этом нежелательно оставлять логины-пароли от используемой Wi-Fi сети... Уверен, читатель легко предложит ещё множество ситуаций, когда хотелось бы подготовить образ заранее и перенести на одноплатник уже "всё готовое". (Для этих целей лучше бы конечно использовать Buildroot или Yocto, но давайте предположим, что мы не умеем). Давайте попробуем подготовить систему в эмуляторе. Все действия я провожу на Ubuntu 22. Собственно перед началом работы нужно эмулятор QEMU установить

Я узнаю свою версию эмулятора таким образом
$qemu-system-aarch64 --version
QEMU emulator version 6.2.0 (Debian 1:6.2+dfsg-2ubuntu6.8)
Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers

Это нужно в случае обнаружения проблем.

Работать будем в папке myQEMU
mkdir myQEMU && cd $_

Скачаем последнюю доступную на текущий момент консольную версию Raspberry Pi OS.

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

export IMAGE_FILE="2023-05-03-raspios-bullseye-arm64-lite.img"
aria2c --seed-time=0 "https://downloads.raspberrypi.org/raspios_lite_arm64/images/raspios_lite_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/
распространенный недочет у многих авторов

Почему-то многие авторы пытаются делать этот шаг через
fdisk -l "$IMAGE_FILE"
не надо так делать, это очень неудобно.

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

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

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

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

QEMU не имеет драйвера virtio для raspi3b, но имеет USB emulation, который и даст интернет от хост-системы на виртуалку. Далее произведем запуск эмулятора 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" \
-nographic \
-device usb-net,netdev=net0 \
-netdev user,id=net0,hostfwd=tcp::5555-:22

Конфиг для запуска дистрибутива с рабочим столом "2023-05-03-raspios-bullseye-arm64.img" приведен в Части 2.

Кстати конфигурации 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 myQEMU

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

mkdir 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 на карту памяти реального одноплатника. И все ваши действия окажутся там уже выполненными.

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

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

Комментарии (7)


  1. 13werwolf13
    16.05.2023 10:04
    +2

    статья оказалась полезной для меня
    я реально не знал про существование переменной $_.. спасибо!


    1. Quartz32
      16.05.2023 10:04
      -2

      Это единственное что для вас было полезно, или что-то ещё? Не стесняйтесь, расскажите нам подробней.


      1. 13werwolf13
        16.05.2023 10:04
        +2

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


        1. DungeonLords Автор
          16.05.2023 10:04
          -1

          Спасибо за ваш отзыв. Предлагаю вам подополнить статью: привести конфиг для запуска графического образа "2023-05-03-raspios-bullseye-arm64.img".


          1. 13werwolf13
            16.05.2023 10:04
            +1

            И я бы даже согласился если бы мне это было интересно, но у меня и на реальных малинах система без иксов живёт за ненадобностью, нагружать этой безполезной прослойкой тестовое окружение смысла (для себя) не вижу.


  1. aborouhin
    16.05.2023 10:04
    +1

    Только QEMU, а не QEMO всё-таки. А то я по заголовку подумал, что форк какой-то появился, что ли :)


    1. DungeonLords Автор
      16.05.2023 10:04

      thanks. I fixed