Эльбрус/rtc: различия между версиями
(→Применение: TCB when host/guest doesn't support it) |
|||
(не показано 13 промежуточных версий 2 участников) | |||
Строка 15: | Строка 15: | ||
Всё то, что мы запускаем из-под транслятора, должно лежать внутри гостевого образа (из-под транслятора, как и из-под chroot-а, получить доступ без дополнительных усилий к файловой системе хоста в общем случае нельзя). | Всё то, что мы запускаем из-под транслятора, должно лежать внутри гостевого образа (из-под транслятора, как и из-под chroot-а, получить доступ без дополнительных усилий к файловой системе хоста в общем случае нельзя). | ||
{{note|в ядре 5.10 существенно изменился механизм взаимодействия с бинарным транслятором, потребуется версия 4.4 и выше (mcst#8448) либо установка/загрузка ядра 5.4 для версий до 4.3 включительно.}} | |||
== Применение == | == Применение == | ||
Строка 20: | Строка 22: | ||
Требуется установленный пакет {{pkg|rtc}}. | Требуется установленный пакет {{pkg|rtc}}. | ||
Как правило, также требуется архив x86-корня, полученный [[#Создание окружений|тем или иным образом]] -- исключением является случай запуска статических бинарников (типично для golang). | Как правило, также требуется архив x86-корня, полученный [[#Создание окружений|тем или иным образом]] -- исключением является случай запуска [[эльбрус/rtc/storcli|статических бинарников]] (типично для golang). | ||
При наличии, например, в {{path|/opt/x86/}} развёрнутого окружения для x86_64<ref>например, распакованного командой {{cmd|rm -rf /opt/x86; mkdir /opt/x86; tar -C /opt/x86 -xf имя-архива.tar}}</ref> можно запустить (на машинах на базе [[модели процессоров Эльбрус|процессоров]] "Эльбрус-8С" или "Эльбрус-1С+") командную оболочку такой командой: | При наличии, например, в {{path|/opt/x86/}} развёрнутого окружения для x86_64<ref>например, распакованного командой {{cmd|rm -rf /opt/x86; mkdir /opt/x86; tar -C /opt/x86 -xf имя-архива.tar}}</ref> можно запустить (на машинах на базе [[модели процессоров Эльбрус|процессоров]] "Эльбрус-8С" или "Эльбрус-1С+") командную оболочку такой командой: | ||
Строка 66: | Строка 68: | ||
== Запуск графических приложений и приложений, работающих с оборудованием == | == Запуск графических приложений и приложений, работающих с оборудованием == | ||
Для доступа к <tt>$DISPLAY</tt> может потребоваться либо предварительно отключить авторизацию командой {{cmd|xhost localhost}} или {{cmd|xhost +}}, либо обеспечить наличие у пользователя в домашнем каталоге под <tt>path_prefix</tt> такого же {{path|~/.Xauthority}}, как на основной системе. | Для доступа к <tt>$DISPLAY</tt> может потребоваться либо предварительно отключить авторизацию командой {{cmd|xhost localhost}} или {{cmd|xhost +}} (в родном окружении от имени пользователя, под которым запущена сессия), либо обеспечить наличие у пользователя в домашнем каталоге под <tt>path_prefix</tt> такого же {{path|~/.Xauthority}}, как на основной системе. | ||
Работа с [[эльбрус/hcl/hba|RAID-контроллерами]] megaraid (например, с помощью утилиты {{cmd|storcli}}) поддерживается в rtc 3.1 или более новой версии. | Работа с [[эльбрус/hcl/hba|RAID-контроллерами]] megaraid (например, с помощью утилиты {{cmd|storcli}}) поддерживается в rtc 3.1 или более новой версии. | ||
Строка 78: | Строка 80: | ||
Работа с {{pkg|pulseaudio}} поддерживается в rtc 3.1 или более новой версии, при этом нужно пробросить в гостевой chroot каталог {{path|/run/user/`id -u`/pulse}}. | Работа с {{pkg|pulseaudio}} поддерживается в rtc 3.1 или более новой версии, при этом нужно пробросить в гостевой chroot каталог {{path|/run/user/`id -u`/pulse}}. | ||
<div id="wine"></div>Можно запускать Windows-приложения с помощью {{pkg|wine}} и {{pkg|rtc}} 3.1 или более нового. Следует иметь в виду, что 32-битные приложения можно запускать только 32-битным {{pkg|wine}} из-под 32-битного гостевого образа и 32-битного исполняемого файла rtc, работающего с ним, а 64-битные -- соответственно 64-битным {{pkg|wine}} из-под 64-битного образа и 64-битного rtc. К сожалению, многие win64-программы имеют win32-инсталляторы, что делает их установку под wine64 нереальной без специальных усилий. | <div id="wine"></div>Можно запускать Windows-приложения с помощью {{pkg|[[wine]]}} и {{pkg|rtc}} 3.1 или более нового. Следует иметь в виду, что 32-битные приложения можно запускать только 32-битным {{pkg|wine}} из-под 32-битного гостевого образа и 32-битного исполняемого файла rtc, работающего с ним, а 64-битные -- соответственно 64-битным {{pkg|wine}} из-под 64-битного образа и 64-битного rtc. К сожалению, многие win64-программы имеют win32-инсталляторы, что делает их установку под wine64 нереальной без специальных усилий. | ||
== Создание окружений == | == Создание окружений == | ||
Строка 88: | Строка 90: | ||
Можно взять готовую виртуальную машину VMWare и распаковать содержимое основного файла виртуального диска .vmdk с помощью команды {{cmd|7z e}} (необходим установленный p7zip), предварительно просмотрев содержимое {{cmd|7z l}}. Распакованный файл .img смонтировать {{cmd|mount -o loop file.img path_to_mount}} и скопировать содержимое корня в папку /opt/x86 или любую другую, которую укажите в --path_prefix. | Можно взять готовую виртуальную машину VMWare и распаковать содержимое основного файла виртуального диска .vmdk с помощью команды {{cmd|7z e}} (необходим установленный p7zip), предварительно просмотрев содержимое {{cmd|7z l}}. Распакованный файл .img смонтировать {{cmd|mount -o loop file.img path_to_mount}} и скопировать содержимое корня в папку /opt/x86 или любую другую, которую укажите в --path_prefix. | ||
Также можно взять подходящий [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] или архив [[chroot|чрута]] -- например, из [[starterkits]]: [http://ftp.altlinux.org/pub/distributions/ALTLinux/p10/images/cloud/x86_64/alt-p10-rootfs-minimal-x86_64.tar.xz x86_64], [http://ftp.altlinux.org/pub/distributions/ALTLinux/p10/images/cloud/i586/alt-p10-rootfs-minimal-i586.tar.xz i586]. <!-- p9: [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]. --> | ||
По состоянию на rtc 4. | По состоянию на rtc 4.3 в таком окружении стоит отдать от имени root команду {{cmd|sed -i 's,\[p10\] ,,' /etc/apt/sources.list.d/{alt,yandex}.list}}<ref>это отключит сверку подписи репозитория; см. баг #5364</ref>, после чего заработает {{pkg|apt}}; во избежание проблем с переменными TMP и TMPDIR, выставленными<ref>см. тж. [[pam_mktemp]]; характерная диагностика: <tt>cannot create temp file for here-document: No such file or directory</tt></ref> в существующий на хосте, но не в чруте, каталог следует либо их сбросить командой {{cmd|unset TMP TMPDIR}}, либо при вызове {{cmd|rtc}} указать подключение хостового каталога: {{cmd|-b /tmp}}. | ||
На альте под x86 можно задействовать предварительно настроенный [[hasher]]: | На альте под x86 можно задействовать предварительно настроенный [[hasher]]: | ||
Строка 101: | Строка 103: | ||
Заархивировать полученное содержимое можно так: | Заархивировать полученное содержимое можно так: | ||
hsh-run --rooter -- tar --numeric-owner --exclude .in --exclude .out --exclude .host --exclude /dev/log -cf - / > ''имя-архива''.tar | hsh-run --rooter -- tar --numeric-owner --exclude .in --exclude .out --exclude .host --exclude /dev/log -cf - / > ''имя-архива''.tar | ||
Также обратите внимание на подход к созданию [[эльбрус/rtc/перепаковка|rtc-пакетов]], дающих возможность непосредственного запуска соответствующих бинарников -- как статических, так и изначально динамических в ряде случаев -- прозрачно для пользователя. | |||
=== пример === | |||
<pre> | |||
# apt-get install rtc | |||
# mkdir /opt/x86 | |||
# cd /opt/x86 | |||
# wget http://ftp.altlinux.org/pub/distributions/ALTLinux/p10/images/cloud/x86_64/alt-p10-rootfs-sysvinit-x86_64.tar.xz | |||
# tar xf alt-p10-rootfs-sysvinit-x86_64.tar.xz | |||
# rm -f alt-p10-rootfs-sysvinit-x86_64.tar.xz | |||
# rtc --path_prefix /opt/x86 -- /bin/bash | |||
## uname -m | |||
</pre> | |||
удаление: | |||
<pre> | |||
# cd | |||
# rm -rf /opt/x86 | |||
# apt-get remove rtc | |||
</pre> | |||
= Ссылки = | = Ссылки = | ||
* [http://mcst.ru/rtc mcst.ru/rtc] | * [http://mcst.ru/rtc mcst.ru/rtc] | ||
* [http://mcst.ru/lintel mcst.ru/lintel] | * [http://mcst.ru/lintel mcst.ru/lintel] | ||
* [http://storage.mcst.ru/index.php/s/ekZcC2IxjkNEOoB Загрузка] | |||
* [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) | ||
* [http:// | * [[эльбрус/rtc/перепаковка]] | ||
* Dynamic binary translation (ссылка более недоступна из-за санкций) | |||
* [http://youtube.com/watch?v=wJrpAQVJxxY Митап №1 | Артист и лентяй | Ge0gr4f] ([https://t.me/e2k_fans/242 @e2k_fans]) (видеорассказ про rtc и lintel) | |||
= Примечания = | = Примечания = |
Текущая версия от 17:40, 11 октября 2024
Бинарный транслятор
Для решения задачи совместимости с унаследованным ПО для платформы 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 на хостовой системе.
В случае работы не под рутом стоит прокидывать файлы /etc/passwd, /etc/group, возможно также /etc/shadow, а также свой каталог $HOME. Очевидно, uid и gid файлов, к котором должен иметь доступ пользователь в хосте и госте должны совпадать.
Если в качестве хостовой системы используется альт, а в качестве гостя - другая, где не поддерживается TCB (или наоборот), то в альте его также стоит отключить (командой control passwd traditional
).
Примечание: RTC может работать с гостевыми системами на других разделах ext4. Необязательно располагать гостевой образ на том же разделе ext4, с которого загружена и хостовая операционная система. Однако нужно иметь в виду, что монтирование раздела, на котором расположено гостевое окружение, необходимо выполнять без параметра user. Например, если в /etc/fstab у вас настроено автоматическое монтирование раздела следующим образом, может возникнуть ошибка apl_ElfMmap: memory mapping failed!
UUID=64f077ca-f530-4e05-a966-79806bc73d87 /mnt/shared/ ext4 defaults,nofail,user,errors=remount-ro,auto,x-systemd.mount-timeout=30 1 2
Если же производить подключение/монтирование раздела без опции "user", как показано ниже, такой ошибки не будет:
UUID=64f077ca-f530-4e05-a966-79806bc73d87 /mnt/shared/ ext4 defaults,nofail,errors=remount-ro,auto,x-systemd.mount-timeout=30 1 2
Соответственно если вы производите монтирование вручную через терминал, в команде также должна отсутствовать опция user:
mount -t ext4 -o defaults,nofail,errors=remount-ro,auto /dev/sda7 /mnt/shared/
Работая из терминала, можете не указывать дополнительные параметры, т.к. по умолчанию опция user при монтировании не используется:
mount -t ext4 /dev/sda7 /mnt/shared/
Запуск графических приложений и приложений, работающих с оборудованием
Для доступа к $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 и нужное лучше на этой стадии.
Можно взять готовую виртуальную машину VMWare и распаковать содержимое основного файла виртуального диска .vmdk с помощью команды 7z e (необходим установленный p7zip), предварительно просмотрев содержимое 7z l. Распакованный файл .img смонтировать mount -o loop file.img path_to_mount и скопировать содержимое корня в папку /opt/x86 или любую другую, которую укажите в --path_prefix.
Также можно взять подходящий шаблон контейнера OpenVZ или архив чрута -- например, из starterkits: x86_64, i586.
По состоянию на rtc 4.3 в таком окружении стоит отдать от имени root команду sed -i 's,\[p10\] ,,' /etc/apt/sources.list.d/{alt,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
Также обратите внимание на подход к созданию rtc-пакетов, дающих возможность непосредственного запуска соответствующих бинарников -- как статических, так и изначально динамических в ряде случаев -- прозрачно для пользователя.
пример
# apt-get install rtc # mkdir /opt/x86 # cd /opt/x86 # wget http://ftp.altlinux.org/pub/distributions/ALTLinux/p10/images/cloud/x86_64/alt-p10-rootfs-sysvinit-x86_64.tar.xz # tar xf alt-p10-rootfs-sysvinit-x86_64.tar.xz # rm -f alt-p10-rootfs-sysvinit-x86_64.tar.xz # rtc --path_prefix /opt/x86 -- /bin/bash ## uname -m
удаление:
# cd # rm -rf /opt/x86 # apt-get remove rtc
Ссылки
- mcst.ru/rtc
- mcst.ru/lintel
- Загрузка
- МЦСТ > Тэги > Двоичный транслятор
- Аппаратная поддержка двоичной трансляции x86 вещественной арифметики в процессорах "Эльбрус" (PDF)
- эльбрус/rtc/перепаковка
- Dynamic binary translation (ссылка более недоступна из-за санкций)
- Митап №1 | Артист и лентяй | Ge0gr4f (@e2k_fans) (видеорассказ про rtc и lintel)
Примечания
- ↑ кстати, сам wine под rtc тоже работает
- ↑ в старых версиях требовал для своей установки и хранения внутренних данных -- кэша откомпилированного кода -- установленную CF-карточку; в более новых версиях мог устанавливаться на отдельный SATA-диск; в современных версиях может устанавливаться на тот же диск, что и гостевая ОС, в последние 16-64 гигабайт, если их оставить неразмеченными
- ↑ например, распакованного командой rm -rf /opt/x86; mkdir /opt/x86; tar -C /opt/x86 -xf имя-архива.tar
- ↑ здесь "e2s" -- внутреннее обозначение процессора "Эльбрус-4С";
"p1" -- одно из внутренних обозначений процессора "Эльбрус-8С";
"x64" -- синоним x86_64/amd64 (то бишь 64-битная x86-совместимая архитектура) - ↑ ср.: WINE#32-битные видеодрайверы
- ↑ обратите внимание: в версии rtc 3.4 известна регрессия (#4825), приводящая к неработоспособности wine; предыдущая известно пригодная для такой задачи версия -- 3.1; после 3.4 было исправлено.
- ↑ это отключит сверку подписи репозитория; см. баг #5364
- ↑ см. тж. pam_mktemp; характерная диагностика: cannot create temp file for here-document: No such file or directory