Автор Тема: Эмуляция SoC в QEMU  (Прочитано 663 раз)

Оффлайн Olej

Эмуляция SoC в QEMU
« : Июнь 04, 2018, 04:00:14 pm »
Собственно, вопросы:
Как запустить на выполнение образ, подготовленный для SoC в виртуальной машине QEMU? ... не так важно:
а). либо из файла образа .img;
б). либо с SD-карточки, записанной из этого образа + смонтированных из этой карточки разделов .../boot & .../root;
в). ибо с тех же образов разделов .../boot & .../root, смонтированных утилитой partx (Образы и карточки);
Одно, другое и третье - это одно и то же, если одно получится, то и все остальные тоже.
P.S. Всё это относится и имеет смысл для Linux, QEMU/KVM под Linux ... Windows пользователей просят не беспокоиться. ;D

Делал ли кто такое?
Вопрос в том, какие параметры и как определить для QEMU (qemu-system-arm)? ... возможно, как это зависит от версии QEMU?
P.S. Чтоб не поощрять срач в теме, и предвосхитить крик: "зачем" - затем, чтобы можно было любой образ Orange Pi или Rasbery Pi посмотреть, не покупая заранее конкретную модель SoC.

Оффлайн Olej

Re: Эмуляция SoC в QEMU
« Ответ #1 : Июнь 04, 2018, 05:11:27 pm »
Вопрос в том, какие параметры и как определить для QEMU (qemu-system-arm)? ... возможно, как это зависит от версии QEMU?
Фокус в том, что QEMU может эмулировать практически все существующие в природе архитектуры + очень многие IDE как-раз и используют код виртуализации QEMU (для исполнения и отладки), вот только некоторые: VirtualBox, AndroidStudio, BuildRoot, ARM SDK, IntelIDEA, ...
Весь вопрос в том, как определить многочисленные параметры запуска QEMU?!

Например, вот такой командой (очень черновой вид) можно запустить один из образов Rasberi Pi, записанный на SD-карту /dev/mmcblk0:
[olej@dell Raspberry_Pi]$ sudo qemu-system-arm -m 1G -M raspi2 -smp 4 -hda /dev/mmcblk0 -serial stdio -append "root=/dev/mmcblk0p2 rootfstype=ext4 rw init=/bin/bash" -kernel kernel7.img -netdev tap,id="ras"
...
root@(none):/# whoami
root
root@(none):/# uname -a
Linux (none) 4.1.21-v7+ #4 SMP Sat Jul 15 06:39:14 CEST 2017 armv7l GNU/Linux
root@(none):/# lsb_release -a
No LSB modules are available.
Distributor ID: Raspbian
Description: Raspbian GNU/Linux 8.0 (jessie)
Release: 8.0
Codename: jessie
...

Оффлайн Olej

Re: Эмуляция SoC в QEMU
« Ответ #2 : Июнь 04, 2018, 05:33:15 pm »
Весь вопрос в том, как определить многочисленные параметры запуска QEMU?!
Вот есть такой образ, из числа самых известных, стандартных, компактных для Orange Pi One - Armbian: Armbian_5.38_Orangepione_Debian_stretch_next_4.14.14.img.
Смонтируем образ:
[root@dell Armbian_5.38]# kpartx -a -v Armbian_5.38_Orangepione_Debian_stretch_next_4.14.14.img
add map loop0p1 (253:1): 0 2719744 linear /dev/loop0 8192

[root@dell Armbian_5.38]# ls -l /dev/mapper
итого 0
crw------- 1 root root 10, 236 июн  2 16:21 control
lrwxrwxrwx 1 root root       7 июн  2 16:21 cryptswap1 -> ../dm-0
lrwxrwxrwx 1 root root       7 июн  4 17:15 loop0p1 -> ../dm-1

[root@dell Armbian_5.38]# mount /dev/mapper/loop0p1 /mnt/root

[root@dell Armbian_5.38]# ls /mnt/root
bin  boot  dev  etc  home  lib  lost+found  media  mnt  opt  proc  root  run  sbin  selinux  srv  sys  tmp  usr  var

[root@dell boot]# ls /mnt/root/boot/
armbianEnv.txt                  boot-desktop.png      dtb-4.14.14-sunxi         uInitrd
armbian_first_run.txt.template  boot.scr              initrd.img-4.14.14-sunxi  uInitrd-4.14.14-sunxi
boot.bmp                        config-4.14.14-sunxi  overlay-user              vmlinuz-4.14.14-sunxi
boot.cmd                        dtb                   System.map-4.14.14-sunxi  zImage
Что меня удивляет в этом .img?
Что здесь нет 2-х разделов диска, из которых 1-й это /boot типа FAT32 ... а здесь всё в единственном разделе типа EXT4.
[olej@dell ~]$ mount | grep /mnt/root
/dev/mapper/loop0p1 on /mnt/root type ext4 (rw,relatime)
Но пусть будет...

Вот как это чудо запустить из QEMU?
« Последнее редактирование: Июнь 04, 2018, 05:34:47 pm от Olej »

Оффлайн Olej

Re: Эмуляция SoC в QEMU
« Ответ #3 : Июнь 04, 2018, 05:45:50 pm »
Вот как это чудо запустить из QEMU?
1-я попытка:
[root@dell boot]# sudo qemu-system-arm -m 1G -M raspi2 -smp 4 -hda /dev/mapper/loop0p1 -serial stdio -append "root=/mnt/root rootfstype=ext4 rw init=/bin/bash" -kernel /mnt/root/boot/vmlinuz-4.14.14-sunxi 
WARNING: Image format was not specified for '/dev/mapper/loop0p1' and probing guessed raw.
         Automatically detecting the format is dangerous for raw images, write operations on block 0 will be restricted.
         Specify the 'raw' format explicitly to remove the restrictions.
...
При этом происходит старт Linux.
Но!
Даже в отличие от примера для Rasberi Pi 2 (выше) поток консольного вывода не переадресуется в терминал, старт происходит глух-немым образом. Загрузка процессора огромная (видно по top), очень продолжительная ... но что происходит за чёрным экраном - неизвестно.

Оффлайн AlDemin

  • Житель
  • ****
  • Сообщений: 488
  • Лайков: 160
  • Карма: +23/-1
  • OPi, OPi+, OPiOne, OPiZero, OPiPC2, BPi, RPiB.
    • Просмотр профиля
Re: Эмуляция SoC в QEMU
« Ответ #4 : Июнь 05, 2018, 02:08:28 pm »
Ну в выводе:
qemu-system-arm -M help
я как то не наблюдаю ни одной конфигурации на SoC H3.
Система у тебя возможно стартует, но вывод из  /dev/ttyS0 ( -serial stdio) в stdio не попадают, по причине несоответствия реализации последовательного порта в SoC малинки и SoC H3.
Аналогично не будет работать ни сеть, ни видео, ничего...

Оффлайн Olej

Re: Эмуляция SoC в QEMU
« Ответ #5 : Июнь 05, 2018, 08:49:20 pm »
Ну в выводе:
qemu-system-arm -M help
я как то не наблюдаю ни одной конфигурации на SoC H3.
Это хелп по "машине". Там его действительно нет.
Но кроме машины, можно, не указывая её, указать (параметрами) отдельные её составляющие: процессор и др.
Или как-то по-другому детализировать параметрами оборудование: QEMU умеет создавать виртуальную среду практически под любое железо, под сотни конфигураций.

Оффлайн AlDemin

  • Житель
  • ****
  • Сообщений: 488
  • Лайков: 160
  • Карма: +23/-1
  • OPi, OPi+, OPiOne, OPiZero, OPiPC2, BPi, RPiB.
    • Просмотр профиля
Re: Эмуляция SoC в QEMU
« Ответ #6 : Июнь 06, 2018, 08:49:07 am »
Цитата: Olej
QEMU умеет создавать виртуальную среду практически под любое железо, под сотни конфигураций.
Умеет то он умеет, но где взять тот файл конфигурации оборудования?
Попробуй вместо -M raspi2 использовать -M cubieboard, тк SoC того-же производителя, и у А20 и Н3 регистры первых 4-х UART-ов и контроллеров SD совпадают. Возможно получишь вывод в консоль и rootfs не потеряется.

Оффлайн Olej

Re: Эмуляция SoC в QEMU
« Ответ #7 : Июнь 06, 2018, 12:29:25 pm »
Умеет то он умеет, но где взять тот файл конфигурации оборудования?
Вот я о том и спросил, тему создал: может кто делал, встречал в обсуждениях, публикациях?
Потому что опция -M (описание машины) - это ничего более, как набор опций, каждая из которых отвечает за свой тип оборудования.
Попробуй вместо -M raspi2 использовать -M cubieboard, тк SoC того-же производителя, и у А20 и Н3 регистры первых 4-х UART-ов и контроллеров SD совпадают. Возможно получишь вывод в консоль и rootfs не потеряется.
Попробую, спасибо.

Оффлайн AlDemin

  • Житель
  • ****
  • Сообщений: 488
  • Лайков: 160
  • Карма: +23/-1
  • OPi, OPi+, OPiOne, OPiZero, OPiPC2, BPi, RPiB.
    • Просмотр профиля
Re: Эмуляция SoC в QEMU
« Ответ #8 : Июнь 06, 2018, 04:06:45 pm »
Цитата: Olej
Потому что опция -M (описание машины) - это ничего более, как набор опций, каждая из которых отвечает за свой тип оборудования.
Нифига себе "ничего более" - Это как раз то самое основное, что задает эмуляцию железа.
Вот ты пробовал:
 ...-hda /dev/mapper/loop0p1 -append "root=/mnt/root rootfstype=ext4 rw init=/bin/bash" -kernel /mnt/root/boot/vmlinuz-4.14.14-sunxi 
  таким образом ты пытаешься загрузить систему неестественным способом в обход BROM, SPL и u-BOOT.
Куда в память загрузиться ядро, initrd и dtb? где у ядра будет точка входа?
даже если оно и стартанет, оно же не знает, что оно в эмуляции, где будет искать рутфс? где то на mmcblk0p1, а у тебя "-hda /dev/mapper/loop0p1" что эмулятор подсунет ядру в качестве "-hda" - я не представляю, особенно кода qemu эмулирует SoC broadcom а не allwinner.