Эльбрус/qemu

Материал из ALT Linux Wiki

Аппаратная виртуализация (kvm) есть только на v6; для v3+ (v2+?) потихоньку пилят paravirt.

Пока нет виртуализованного бута -- приходится вытаскивать из образа ядро с initrd и подсовывать вручную.

qemu-system-e2k

установка

p10_e2k (ядро 5.10, qemu 7.2):

# apt-get install qemu seavgabios

образ жёсткого диска

Пример запуска системы с образа жёсткого диска (qemu >= 7.2.0-alt4.e2kv6 научился kernel/initrd брать из образа; ядро здесь 5.10-1.23 на хосте и в "коробочке"; сериалка в терминалке):

$ qemu-system-e2k -m 4G -vga std -display none -nographic -object iothread,id=iothread0 -drive if=none,id=drive0,file=$HOME/qemu/alt-rescue-20240711-e2kv6.img,format=raw,cache=none,aio=native -device virtio-blk-pci,iothread=iothread0,drive=drive0 -netdev bridge,id=n1,br=vmbr0 -device virtio-net-pci,netdev=n1,mac=52:54:00:00:01:01

(далее можно сделать sed -i 's,console=tty0 ,,' /boot/boot.conf для получения вывода загрузки в COM-консоль)

$ qemu-system-e2k -m 4G -vga std -display none -object iothread,id=iothread0 -drive if=none,id=drive0,file=$HOME/qemu/20231108/alt-rescue-10.2-20231108-e2kv6.img,format=raw,cache=none,aio=native -device virtio-blk-pci,iothread=iothread0,drive=drive0 -kernel ~/qemu/20231108/image -initrd ~/qemu/20231108/initrd.img -append "console=ttyS0 hardreset root=UUID=7c32e7aa-e2bf-40eb-9457-e51b085aa6a5" -serial stdio

и с инсталятором (графика через vncviewer 127.0.0.1:5900):

$ qemu-system-e2k -m 4G -vga virtio -drive id=cdrom0,if=none,format=raw,readonly=on,file=$HOME/qemu/20231108/slinux-10.2-20231108-e2kv6.iso -device virtio-scsi-pci,id=scsi0 -device scsi-cd,bus=scsi0.0,drive=cdrom0 -kernel ~/qemu/20231108/live-image.0 -initrd ~/qemu/20231108/live-initrd.img -append "fastboot live automatic=method:cdrom lang=ru_RU"

сеть (см. тж. etcnet#bridge и PVE#Настройка_сетевой_подсистемы; eth5 ниже -- пример имени опорного интерфейса моста vmbr0):

# echo "TYPE=eth" > /etc/net/ifaces/eth5/options
# mkdir -p /etc/net/ifaces/vmbr0
# cat > /etc/net/ifaces/vmbr0/options << EOF
BOOTPROTO=static
TYPE=bri
HOST=eth5
CONFIG_WIRELESS=no
CONFIG_IPV4=yes
# cat > /etc/net/ifaces/vmbr0/ipv4address << EOF
10.2.0.1/24
EOF
# mkdir -p /etc/qemu
# echo "allow vmbr0" >> /etc/qemu/bridge.conf
$ ...  -netdev bridge,id=n1,br=vmbr0 -device virtio-net-pci,netdev=n1,mac=52:54:00:12:34:56

В запущенной виртуалке можно сконфигурировать, скажем, 10.2.0.14/24 на полученный сетевой интерфейс и обмениваться пакетами с системой-хозяином.

Запуская вторую виртуалку с сетью, не забудьте дать ей свой MAC (52:54:xx:xx:xx:xx) во избежание конфликтов на мосту с сопутствующими таймаутами.

qemu-user-e2k

На x86 можно воспользоваться программным эмулятором qemu-e2k от сообщества, который, по словам сотрудника МЦСТ, "эмулирует что-то напоминающее архитектуру эльбрус" (при этом для ряда практических задач уже вполне пригоден).

I

Краткая вводная от разработчиков (тест подразумевает доступность кроссового lcc):

$ git clone --depth=1 -b e2k https://git.mentality.rip/OpenE2K/qemu-e2k.git
$ cd qemu-e2k
$ mkdir build
$ cd build
$ ../configure --target-list=e2k-linux-user --static --disable-capstone --disable-werror
$ nice ninja
$ sudo cp qemu-e2k /usr/local/bin

$ cat hello.c
#include <stdio.h>
int main(int argc, char *argv[]) {
        const char *name = argc > 1 ? argv[1] : "world";
        printf("Hello, %s!\n", name);
        return 0;
}
$ lcc -O2 -static hello.c -o hello-e2k
$ qemu-e2k hello-e2k $USER
Hello, denis!

# setup binfmt
$ cat /etc/binfmt.d/qemu-e2k.conf 
:qemu-e2k:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xaf\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-e2k:OC
:qemu-e2k-old:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x31\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-e2k:OC
:qemu-e2k32:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xaf\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-e2k32:OC
:qemu-e2k32-old:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x31\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/local/bin/qemu-e2k32:OC
$ ./hello-e2k $USER
Hello, denis!

Можно собрать без static, если не планируется запускать что-то в chroot. Можно добавить e2k32-linux-user в --target-list для запуска 32-битных программ, но особого смысла в них нет. :)

Ещё можно в /usr/gnemul создать символическую ссылку на chroot в cross-lcc, или на реальный chroot от Эльбрусов.

$ readlink -f /usr/gnemul/qemu-e2k/
/opt/mcst/lcc-1.26.14.e2k-v4.5.4/fs

Это чтобы не прописывать окружения QEMU_LD_PREFIX или qemu-e2k -L /opt/mcst/..../fs.

II

Более подробная инструкция от сообщества -- точнее, Артёма Солопия (@entityfx):

Сборка QEMU e2k (не является эмуляцией всего компьютера, а только исполнения приложений) и использование с chroot контейнером ALT Linux e2k. Пример сборки и запуска в Alt Linux (Подойдёт любой ваш любимый дистрибутив).

Установите необходимые пакеты для сборки Qemu:

apt-get install gcc
apt-get install glibc-devel-static
apt-get install glib2-devel
apt-get install glib2-devel-static
apt-get install libpcre2-devel
apt-get install libpcre2-devel-static
apt-get install zlib-devel
apt-get install ninja-build

Склонируйте qemu-e2k:

git clone --depth=1 -b e2k-v8.1.3 https://git.mentality.rip/OpenE2K/qemu-e2k.git

Сконфигурируйте и соберите qemu-e2k (static):

../configure --target-list=e2k-linux-user --static --disable-capstone --disable-werror
nice ninja


Распаковка контейнера chroot с Alt e2k (либо другой e2k Linux).

Создать директорию в корне, например:

sudo mkdir /alt-e2k-chroot

Получите архив tar c контейнером e2k (Elbrus OS, Alt Linux, ...)

Распакуйте tar c контейнером:

sudo tar xf alt-e2k-chroot.tar.xz -C /alt-e2k-chroot

Скопируйте исполняемый файл qemu в контейнер chroot:

sudo cp qemu-e2k/build/qemu-e2k /alt-e2k-chroot/usr/local/bin

Смонтируйте директории в контейнер chroot:

sudo mount --rbind /dev /alt-e2k-chroot/dev
sudo mount --make-rslave /alt-e2k-chroot/dev
sudo mount --rbind /sys /alt-e2k-chroot/sys
sudo mount --make-rslave /alt-e2k-chroot/sys
sudo mount --rbind /tmp /alt-e2k-chroot/tmp
sudo mount -t proc /proc /alt-e2k-chroot/proc

Выполните скрипт binfmt из qemu-e2k:

sudo ./qemu-e2k/scripts/qemu-binfmt-conf.sh /usr/local/bin

Запуск эмулятора контейнера с bash:

sudo chroot /alt-e2k-chroot /bin/bash

Дополнительная инструкция