LINUX.ORG.RU

lxc + qemu-arm + rootfs

 , ,


0

2

Достаточно давно вместо sandbox и т.п. использую для сборки и отладки всяких штуковин для ARM под x86 lxc контейнер с армовой rootfs и qemu собранный с --target-list=arm-linux-user (user space emulator) чтобы запускать на x86 ядре arm'овые бинарники через binfmt_misc. Пока endianness хоста и эмулируемой системы совпадает, а сисколлы остаются неизменными между версиями ядра хоста и ядра под которое рассчитана армовая rootfs, всё работает как часики.

В контейнере запускается шелл, типа

lxc-execute -n sb -f /var/lib/lxc/sb/config — /bin/su - stanson — --login

Ну и дальше делай что угодно, как будто ты залогинился в армовую систему. Всё достаточно шустро и удобно, но есть нюанс.

Изнутри выглядит так:

stanson@sb:~$ ps -eo pid,vsz,args
  PID    VSZ COMMAND
    1   1008 /init.lxc.static — /bin/su - stanson — --login
    4  73648 /usr/bin/qemu-arm /bin/bash --login
  130  60412 /bin/ps -eo pid,vsz,args

Фига себе размерчик у bash и ps, не правда ли? Дело в том, что на каждый запущенный армобинарник запускается qemu. Если, например, запустить man bash в контейнере и посмотреть «снаружи», то будет так:

stanson@amilo:~$ ps -eo lxc,pid,vsz,args --sort lxc | grep '^sb'
sb       21030   1008 /init.lxc.static — /bin/su - stanson — --login
sb       21033  73648 /usr/bin/qemu-arm /bin/bash --login
sb       21073  61436 /usr/bin/qemu-arm /usr/bin/man bash
sb       21090  60284 /usr/bin/qemu-arm /usr/bin/pager -s

Вот откуда по 60-70 мегов на процесс. Сам qemu-arm невелик,

stanson@amilo:~$ ls -la `which qemu-arm`
-rwxr-xr-x 1 root root 3205596 Mar 21 19:29 /usr/bin/qemu-arm*
но памяти жрёт прилично, насколько я понял - из-за pre-allocation

Собственно вопросы

1. - есть ли более оптимальный способ делать то же самое?

2. - можно ли заставить qemu не заниматься pre-allocation?

Пока сам не копался в qemu, может кто уже решил этот вопрос?

★★★★★

Последнее исправление: Stanson (всего исправлений: 2)

Ответ на: комментарий от makoven

Оно в несколько раз тормознее чем lxc+qemu на T61 с Core2 Duo T7300 @ 2GHz. Причём не из-за процессора, а из-за периферии.

Был бы на RPi полноценный SATA - было бы не так грустно.

Stanson ★★★★★
() автор топика
Последнее исправление: Stanson (всего исправлений: 3)
Ответ на: комментарий от Stanson

Был бы на RPi полноценный SATA - было бы не так грустно.

Скорость флешки не устраивает? В Orange Pi есть SATA. Да много где есть

makoven ★★★★★
()
Ответ на: комментарий от Stanson

Оно в несколько раз тормознее чем lxc+qemu на T61 с Core2 Duo T7300 @ 2GHz. Причём не из-за процессора, а из-за периферии.

Это да) На G4520 3.6 Ghz тоже еле движется. Но конпелять можно. А из-за какой периферии? Я не вдавался в подробности

makoven ★★★★★
()
Ответ на: комментарий от makoven

Да, Allwinner может быть вариантом.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от makoven

Ну флешка/SD на RPi и всё такое. При компиляции 100500 файлов читаются-пишутся и становится грустно.

G4520 должен быть гоаздо шустрее RPi как минимум для компиляции.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от Stanson

Как вариант подключить папку с большого компа в малину по sshfs. Все-равно как-то надо доставлять файлы в малину

Я тож думал что возьму комп помощнее и эмуляция залетает. Нифига. Может что-то настроить надо. Но мне было лень, воткнул кубиборд

makoven ★★★★★
()
Последнее исправление: makoven (всего исправлений: 1)
Ответ на: комментарий от makoven

Как вариант подключить папку с большого компа в малину по sshfs. Все-равно как-то надо доставлять файлы в малину

В малине сеть на USB, так что это тормоза. Да и вообще в малине почти всё через жопу. Так что если и рассматривать какие-то билд-серверы, то скорее на Allwinner или других.

Я тож думал что возьму комп помощнее и эмуляция залетает. Нифига. Может что-то настроить надо. Но мне было лень, воткнул кубиборд

Ну у меня на T61 всё вполне адекватно собирается. Конечно медленнее чем нативно для x86, но бытсрее чем на RPi. Напрягает только ужор памяти если запускается 100500 процессов, что, кстати, тоже даёт доп. задержки.

Кубик, наверно, будет быстрее.

В sandbox'e с этим борются используя нативные бинарники, которые лежат в отдельной директории и путь к ним прописан в PATH, чтобы при вызове gzip вместо армового /bin/gzip например, запускался x86 /host/bin/gzip, но это как-то не очень красиво и работает если только в софте нет полных путей к бинарникам.

Stanson ★★★★★
() автор топика
Ответ на: комментарий от Stanson

Напрягает только ужор памяти если запускается 100500 процессов, что, кстати, тоже даёт доп. задержки

Наверное мы о разных эмуляциях. user-static у меня вечно ломалось и выкидывало из nspawnd-контейнера. Я про qemu-system-arm

makoven ★★★★★
()
Ответ на: комментарий от makoven

Не, я user-static пользую. Ядро нативно бегает, что даёт весьма ощутимый прирост скорости.

Stanson ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.