Эльбрус/rtc: различия между версиями

Материал из ALT Linux Wiki
м (+mcst.ru/rtc и поправил насчёт chroot/контейнер, образ/окружение)
Строка 2: Строка 2:
= Бинарный транслятор =
= Бинарный транслятор =


Для решения проблемы совместимости с унаследованным ПО для платформы x86 в МЦСТ разработали бинарный транслятор, работающий в двух режимах, чем-то напоминающих гипервизор (когда можно установить и запустить целую ОС) и нечто, имеющее черты [[wine]] и chroot (когда требуется запустить отдельное приложение)<ref>кстати, сам wine под rtc тоже работает</ref>.
Для решения проблемы совместимости с унаследованным ПО для платформы x86 в МЦСТ разработали [http://mcst.ru/rtc бинарный транслятор], работающий в двух режимах, чем-то напоминающих гипервизор (когда можно установить и запустить целую ОС) и нечто, имеющее черты [[wine]] и контейнера (когда требуется запустить отдельное приложение)<ref>кстати, сам wine под rtc тоже работает</ref>.


Первый режим реализован в <tt>lintel</tt><ref>в старых версиях требовал для своей установки и хранения внутренних данных -- кэша откомпилированного кода -- установленную CF-карточку; в более новых версиях мог устанавливаться на отдельный SATA-диск; в современных версиях может устанавливаться на тот же диск, что и гостевая ОС, в последние 16-64 гигабайт, если их оставить неразмеченными</ref>; второй -- в {{pkg|rtc}} и работает под управлением уже запущенной операционной системы.
Первый режим реализован в <tt>lintel</tt><ref>в старых версиях требовал для своей установки и хранения внутренних данных -- кэша откомпилированного кода -- установленную CF-карточку; в более новых версиях мог устанавливаться на отдельный SATA-диск; в современных версиях может устанавливаться на тот же диск, что и гостевая ОС, в последние 16-64 гигабайт, если их оставить неразмеченными</ref>; второй -- в {{pkg|rtc}} и работает под управлением уже запущенной операционной системы.
Строка 12: Строка 12:
: -- ОС, под которой мы запускаем транслятор, в которую кладём образ гостевой системы и т.п. Имеет архитектуру e2k, в файловой системе лежат бинарники под e2k.
: -- ОС, под которой мы запускаем транслятор, в которую кладём образ гостевой системы и т.п. Имеет архитектуру e2k, в файловой системе лежат бинарники под e2k.
; гость (гостевой образ, гостевой chroot)
; гость (гостевой образ, гостевой chroot)
: -- операционное окружение, файловую систему которого (в виде подкаталога в файловой системе хоста) мы подсовываем транслятору, и в которую {{pkg|rtc}} делает chroot при запуске. Имеет архитектуру x86 или x86_64, в файловой системе лежат бинарники такой же архитектуры.  Ядро не требуется.
: -- операционное окружение, файловую систему которого (в виде подкаталога в файловой системе хоста) мы подсовываем транслятору и в которую {{pkg|rtc}} "делает chroot" при запуске. Имеет архитектуру x86 или x86_64, в файловой системе лежат бинарники такой же архитектуры.  Ядро не требуется.


Всё то, что мы запускаем из-под транслятора, должно лежать внутри гостевого образа (из-под транслятора, как и из-под chroot-а, получить доступ без дополнительных усилий к файловой системе хоста в общем случае нельзя).
Всё то, что мы запускаем из-под транслятора, должно лежать внутри гостевого образа (из-под транслятора, как и из-под chroot-а, получить доступ без дополнительных усилий к файловой системе хоста в общем случае нельзя).
Строка 22: Строка 22:
Как правило, также требуется архив x86-корня, полученный [[#Создание окружений|тем или иным образом]] -- исключением является случай запуска статических бинарников (типично для golang).
Как правило, также требуется архив x86-корня, полученный [[#Создание окружений|тем или иным образом]] -- исключением является случай запуска статических бинарников (типично для golang).


При наличии, например, в {{path|/opt/x86/}} развёрнутого окружения для x86_64<ref>например, распакованного командой {{cmd|rm -rf /opt/x86; mkdir /opt/x86; tar -C /opt/x86 -xf имя-архива.tar}}</ref> можно запустить (на машинах на базе процессоров "Эльбрус-1С+" или "Эльбрус-") командную оболочку такой командой:
При наличии, например, в {{path|/opt/x86/}} развёрнутого окружения для x86_64<ref>например, распакованного командой {{cmd|rm -rf /opt/x86; mkdir /opt/x86; tar -C /opt/x86 -xf имя-архива.tar}}</ref> можно запустить (на машинах на базе [[модели процессоров Эльбрус|процессоров]] "Эльбрус-" или "Эльбрус-1С+") командную оболочку такой командой:


  /usr/bin/rtc_opt_rel_p1_x64_ob --path_prefix /opt/x86 -- /bin/bash
  /usr/bin/rtc_opt_rel_p1_x64_ob --path_prefix /opt/x86 -- /bin/bash
Строка 32: Строка 32:
При успешном запуске под бинарной трансляцией отданная в полученном приглашении команда {{cmd|arch}} сообщит не "e2k", а "x86_64".
При успешном запуске под бинарной трансляцией отданная в полученном приглашении команда {{cmd|arch}} сообщит не "e2k", а "x86_64".


Разумеется, путь {{path|/opt/x86}} не фиксирован, ничто не мешает иметь на машине множество гостевых образов в разных каталогах.
Разумеется, путь {{path|/opt/x86}} не фиксирован, ничто не мешает иметь на машине множество гостевых окружений в разных каталогах.


Вместо {{cmd|/bin/bash}} можно подставить любую другую команду, которую нужно будет запустить под бинарным транслятором. Путь к бинарнику необходимо указывать полный относительно места расположения образа. Например, если образ расположен в {{path|/opt/x86}} и мы хотим запустить {{cmd|/opt/x86/usr/bin/mc}}, можно отдать команду вида:
Вместо {{cmd|/bin/bash}} можно подставить любую другую команду, которую нужно будет запустить под бинарным транслятором. Путь к бинарнику необходимо указывать полный относительно места расположения образа. Например, если образ расположен в {{path|/opt/x86}} и мы хотим запустить {{cmd|/opt/x86/usr/bin/mc}}, можно отдать команду вида:
Строка 42: Строка 42:
Иногда требуется необходимость прокинуть какой-нибудь каталог внутрь chroot-а гостевого образа. Например, рассмотрим это на примере прокидывания каталога {{path|/run/pulse}} (это применяется для того, чтобы в гостевых приложениях работало PulseAudio) внутрь образа {{path|/opt/x86}}. Нужно:
Иногда требуется необходимость прокинуть какой-нибудь каталог внутрь chroot-а гостевого образа. Например, рассмотрим это на примере прокидывания каталога {{path|/run/pulse}} (это применяется для того, чтобы в гостевых приложениях работало PulseAudio) внутрь образа {{path|/opt/x86}}. Нужно:


* Создать пустой каталог {{path|/opt/x86/run/pulse}} (если его ещё нет);
* создать пустой каталог {{path|/opt/x86/run/pulse}} (если его ещё нет);
* Запустить бинарный транслятор с параметром <tt>-b <имя каталога для прокидывания></tt>, например:
* запустить бинарный транслятор с параметром <tt>-b <имя каталога для прокидывания></tt>, например:


  /usr/bin/rtc_opt_rel_p1_ob --path_prefix /opt/x86 -b /run/pulse -- /bin/bash
  /usr/bin/rtc_opt_rel_p1_ob --path_prefix /opt/x86 -b /run/pulse -- /bin/bash
Строка 69: Строка 69:
Получаем [[#Применение|искомый]] ''имя-архива.tar''.
Получаем [[#Применение|искомый]] ''имя-архива.tar''.


Можно установить любой линукс в нужный вид в любой виртуальной машине и сделать архив файловой системы (изнутри VM при помощи [[rescue]] или экспортировав образ диска, подключив и сделав архив снаружи).  Если предполагаете использовать связку rtc+[[wine]]<ref>обратите внимание: в версии rtc 3.4 известна регрессия (#4825), приводящая к неработоспособности wine; предыдущая известно пригодная для такой задачи версия -- 3.1; после 3.4 было исправлено.</ref>, установить {{pkg|wine}} и нужное лучше на этой стадии.
Можно установить любой линукс в нужный вид в любой виртуальной машине и сделать архив файловой системы (изнутри VM при помощи [[rescue]]-загрузки или экспортировав образ диска, подключив и сделав архив снаружи).  Если предполагаете использовать связку rtc+[[wine]]<ref>обратите внимание: в версии rtc 3.4 известна регрессия (#4825), приводящая к неработоспособности wine; предыдущая известно пригодная для такой задачи версия -- 3.1; после 3.4 было исправлено.</ref>, установить {{pkg|wine}} и нужное лучше на этой стадии.


Также можно взять подходящий [https://download.openvz.org/template/precreated/contrib/ шаблон контейнера OpenVZ] -- например, из [[starterkits]]: [http://nightly.altlinux.org/p9/permalink/alt-p9-ovz-generic-latest-x86_64.tar.xz x86_64], [http://nightly.altlinux.org/p9/permalink/alt-p9-ovz-generic-latest-i586.tar.xz i586].
Также можно взять подходящий [https://download.openvz.org/template/precreated/contrib/ шаблон контейнера OpenVZ] -- например, из [[starterkits]]: [http://nightly.altlinux.org/p9/permalink/alt-p9-ovz-generic-latest-x86_64.tar.xz x86_64], [http://nightly.altlinux.org/p9/permalink/alt-p9-ovz-generic-latest-i586.tar.xz i586].
Строка 86: Строка 86:


= Ссылки =
= Ссылки =
* [http://mcst.ru/rtc mcst.ru/rtc]
* [http://www.mcst.ru/tag/50c89dcf64871a2115000000 МЦСТ > Тэги > Двоичный транслятор]
* [http://www.mcst.ru/tag/50c89dcf64871a2115000000 МЦСТ > Тэги > Двоичный транслятор]
* [http://www.mcst.ru/files/5a9eb8/a30cd8/50681b/000000/rodzevich_s._a._apparatnaya_podderzhka_dvoichnoy_translyatsii_x86_veshchestvennoy_arifmetiki.pdf Аппаратная поддержка двоичной трансляции x86 вещественной арифметики в процессорах "Эльбрус"] (PDF)
* [http://www.mcst.ru/files/5a9eb8/a30cd8/50681b/000000/rodzevich_s._a._apparatnaya_podderzhka_dvoichnoy_translyatsii_x86_veshchestvennoy_arifmetiki.pdf Аппаратная поддержка двоичной трансляции x86 вещественной арифметики в процессорах "Эльбрус"] (PDF)

Версия от 11:14, 16 ноября 2020

Stub.png
Данная страница находится в разработке.
Эта страница ещё не закончена. Информация, представленная здесь, может оказаться неполной или неверной.

Бинарный транслятор

Для решения проблемы совместимости с унаследованным ПО для платформы x86 в МЦСТ разработали бинарный транслятор, работающий в двух режимах, чем-то напоминающих гипервизор (когда можно установить и запустить целую ОС) и нечто, имеющее черты wine и контейнера (когда требуется запустить отдельное приложение)[1].

Первый режим реализован в lintel[2]; второй -- в rtc и работает под управлением уже запущенной операционной системы.

В этой статье мы рассмотрим второй вариант.

Здесь:

хост (хостовая операционная система)
-- ОС, под которой мы запускаем транслятор, в которую кладём образ гостевой системы и т.п. Имеет архитектуру e2k, в файловой системе лежат бинарники под e2k.
гость (гостевой образ, гостевой chroot)
-- операционное окружение, файловую систему которого (в виде подкаталога в файловой системе хоста) мы подсовываем транслятору и в которую rtc "делает chroot" при запуске. Имеет архитектуру x86 или x86_64, в файловой системе лежат бинарники такой же архитектуры. Ядро не требуется.

Всё то, что мы запускаем из-под транслятора, должно лежать внутри гостевого образа (из-под транслятора, как и из-под chroot-а, получить доступ без дополнительных усилий к файловой системе хоста в общем случае нельзя).

Применение

Требуется установленный пакет rtc.

Как правило, также требуется архив x86-корня, полученный тем или иным образом -- исключением является случай запуска статических бинарников (типично для golang).

При наличии, например, в /opt/x86/ развёрнутого окружения для x86_64[3] можно запустить (на машинах на базе процессоров "Эльбрус-8С" или "Эльбрус-1С+") командную оболочку такой командой:

/usr/bin/rtc_opt_rel_p1_x64_ob --path_prefix /opt/x86 -- /bin/bash

То же самое, но для окружения i386 (x86, i686, ia32):

/usr/bin/rtc_opt_rel_p1_ob --path_prefix /opt/x86 -- /bin/bash

При успешном запуске под бинарной трансляцией отданная в полученном приглашении команда arch сообщит не "e2k", а "x86_64".

Разумеется, путь /opt/x86 не фиксирован, ничто не мешает иметь на машине множество гостевых окружений в разных каталогах.

Вместо /bin/bash можно подставить любую другую команду, которую нужно будет запустить под бинарным транслятором. Путь к бинарнику необходимо указывать полный относительно места расположения образа. Например, если образ расположен в /opt/x86 и мы хотим запустить /opt/x86/usr/bin/mc, можно отдать команду вида:

/usr/bin/rtc_opt_rel_p1_ob --path_prefix /opt/x86 -- /usr/bin/mc

На машинах на базе процессоров "Эльбрус-4С" следует запускать /opt/mcst/rtc/rtc_opt_rel_e2s_ob[4] или /opt/mcst/rtc/rtc_opt_rel_e2s_x64_ob в зависимости от разрядности образа.

Иногда требуется необходимость прокинуть какой-нибудь каталог внутрь chroot-а гостевого образа. Например, рассмотрим это на примере прокидывания каталога /run/pulse (это применяется для того, чтобы в гостевых приложениях работало PulseAudio) внутрь образа /opt/x86. Нужно:

  • создать пустой каталог /opt/x86/run/pulse (если его ещё нет);
  • запустить бинарный транслятор с параметром -b <имя каталога для прокидывания>, например:
/usr/bin/rtc_opt_rel_p1_ob --path_prefix /opt/x86 -b /run/pulse -- /bin/bash

После запуска транслятора каталог /run/pulse внутри гостевого chroot-а будет отражать содержимое /run/pulse на хостовой системе.

Запуск графических приложений и приложений, работающих с оборудованием

Для доступа к $DISPLAY может потребоваться либо предварительно отключить авторизацию командой xhost localhost или xhost +, либо обеспечить наличие у пользователя в домашнем каталоге под path_prefix такого же ~/.Xauthority, как на основной системе.

Работа с RAID-контроллерами megaraid (например, с помощью утилиты storcli) поддерживается в rtc 3.1 или более новой версии.

Работа с OpenGL поддерживается в rtc 3.1 или более новой версии; требуется наличие соответствующего видеокарте DRI-драйвера в чруте (например, xorg-dri-radeon)[5].

Работа с OpenCL должна поддерживаться в rtc 3.4 или более новой версии.

Работа с ALSA поддерживается в rtc 3.3 или более новой версии.

Работа с pulseaudio поддерживается в rtc 3.1 или более новой версии, при этом нужно пробросить в гостевой chroot каталог /run/user/`id -u`/pulse.

Можно запускать Windows-приложения с помощью wine и rtc 3.1 или более нового. Следует иметь в виду, что 32-битные приложения можно запускать только 32-битным wine из-под 32-битного гостевого образа и 32-битного исполняемого файла rtc, работающего с ним, а 64-битные -- соответственно 64-битным wine из-под 64-битного образа и 64-битного rtc. К сожалению, многие win64-программы имеют win32-инсталляторы, что делает их установку под wine64 нереальной без специальных усилий.

Создание окружений

Получаем искомый имя-архива.tar.

Можно установить любой линукс в нужный вид в любой виртуальной машине и сделать архив файловой системы (изнутри VM при помощи rescue-загрузки или экспортировав образ диска, подключив и сделав архив снаружи). Если предполагаете использовать связку rtc+wine[6], установить wine и нужное лучше на этой стадии.

Также можно взять подходящий шаблон контейнера OpenVZ -- например, из starterkits: x86_64, i586.

По состоянию на rtc 4.0 в таком окружении стоит отдать от имени root команду sed -i 's,\[p9\] ,,' /etc/apt/sources.list.d/yandex.list[7], после чего заработает apt; во избежание проблем с переменными TMP и TMPDIR, выставленными[8] в существующий на хосте, но не в чруте, каталог следует либо их сбросить командой unset TMP TMPDIR, либо при вызове rtc указать подключение хостового каталога: -b /tmp.

На альте под x86 можно задействовать предварительно настроенный hasher:

hsh --init
hsh-install нужное возможно-также-нужное

где в возможно-также-нужное в случае графических приложений обычно попадают xauth и шрифты (например, fonts-otf-mozilla-fira); проверить функционирование приложения "не отходя от кассы" на той же машине, где собран чрут, можно так:

hsh-run -Y команда

Заархивировать полученное содержимое можно так:

hsh-run --rooter -- tar --numeric-owner --exclude .in --exclude .out --exclude .host --exclude /dev/log -cf - / > имя-архива.tar

Ссылки

Примечания

  1. кстати, сам wine под rtc тоже работает
  2. в старых версиях требовал для своей установки и хранения внутренних данных -- кэша откомпилированного кода -- установленную CF-карточку; в более новых версиях мог устанавливаться на отдельный SATA-диск; в современных версиях может устанавливаться на тот же диск, что и гостевая ОС, в последние 16-64 гигабайт, если их оставить неразмеченными
  3. например, распакованного командой rm -rf /opt/x86; mkdir /opt/x86; tar -C /opt/x86 -xf имя-архива.tar
  4. здесь "e2s" -- внутреннее обозначение процессора "Эльбрус-4С";
    "p1" -- одно из внутренних обозначений процессора "Эльбрус-8С";
    "x64" -- синоним x86_64/amd64 (то бишь 64-битная x86-совместимая архитектура)
  5. ср.: WINE#32-битные видеодрайверы
  6. обратите внимание: в версии rtc 3.4 известна регрессия (#4825), приводящая к неработоспособности wine; предыдущая известно пригодная для такой задачи версия -- 3.1; после 3.4 было исправлено.
  7. это отключит сверку подписи репозитория; см. баг #5364
  8. см. тж. pam_mktemp; характерная диагностика: cannot create temp file for here-document: No such file or directory