Запуск X-приложения в chroot на примере POSE (или «QEMU не нужен»)

Эта мини-статья родилась как ответ на статью Упрощаем эмуляцию X86 с помощью Live CD, в которой для запуска старых 32-битных приложений на 64-битных дистрибутивах Linux предлагалось использовать QEMU + Live CD — по моему мнению «из пушки по воробьям». Опишу своё решение на chroot + debootstrap.

Должен оговориться, что QEMU очень мощный инструмент, который позволяет запускать фактически что угодно, он незаменим во многих случаях. Но именно для этой задачи он избыточен: ядро x64 прекрасно умеет запускать бинарники x86.

Начну с простого: в Debian поддерживается Multiarch — возможность в одной системе использовать как 64-битные приложения, так и 32-битные, для чего устанавливаются два комплекта библиотек. Аналогичные механизмы есть и в других дистрибутивах Linux, и в Windows.

Видимо, про этот способ в оригинальной статье было написано:

Типичный подход к эмулированию среды для запуска старых файлов с архитектурой i386 сопряжен со сложностями, в частности с поиском всех необходимых библиотек.

Да, не спорю. Такая проблема случается. Хотя часто всё и работает: в исходной статье одним из примеров был запуск POSE — эмулятора PalmOS, который не был портирован для 64-битного режима, именно с ним в bullseye у меня проблем не возникло.

Всё просто

Пошёл на http://archive.debian.org/debian/pool/contrib/, скачал pose_3.5-9.1_i386.deb, сказал

apt install ./pose_3.5-9.1_i386.deb

мне было предложено установить кучку библиотек для i386 (уже из текущего релиза bullseye), ответил y, POSE поставился, проверил — запускается. Повезло.

Но, всё-таки, этот способ действительно не всегда работает: нужных версий пакетов, которые необходимы для запуска приложения (библиотеки, python, etc), может не оказаться в текущем релизе, а прописывать в sources.list несколько релизов и делать «микс» категорически не рекомендуется, особенно, если речь идёт о настолько далеко отстоящих друг от друга релизах, как bullseye и lenny.

К счастью, есть простой способ, который я использую в подобных случаях: поставить в отдельный каталог другой релиз Debian и запускать приложения оттуда с помощью chroot.

До релиза lenny (включительно) POSE входил в состав дистрибутива Debian. Покажем, как мы можем установить 32-битную сборку Debian lenny и запустить этот эмулятор:

mkdir lenny
sudo sudo debootstrap --arch i386 --components=main,contrib --include=pose,pose-skins lenny ./lenny http://archive.debian.org/debian/
sudo chroot ./lenny useradd -u $UID $USER
for D in /dev /sys /proc /tmp/.X11-unix/ $HOME; do sudo mkdir -p ./lenny/$D; sudo mount --bind $D ./lenny/$D; done
sudo chroot  --userspec=$USER ./lenny pose
for D in /dev /sys /proc /tmp/.X11-unix/ $HOME; do sudo mkdir -p ./lenny/$D; sudo umount ./lenny/$D; done

Небольшие пояснения:

Можно, конечно, совместно с chroot использовать и систему из livecd, однако, на мой взгляд, deboostrap как минимум не хуже для большинства применений: он прост в использовании, выкачивает только нужные пакеты, это не ro дистрибутив — можно, например, поставить пакет используя стандартный apt-get install, и после перезагрузки изменения останутся на месте (при этом всё так же несложно откатиться назад, достаточно просто удалить каталог и запустить debootstrap ещё раз).

Разумеется, этот подход можно использовать не только для запуска POSE, и не только в Debian. Более того, основная система и система в chroot могут быть разными, например, с помощью той же последовательности команд можно из CentOS запустить Debian или Ubuntu, а для установки не deb-based дистрибутивов в chroot debootstrap нужно будет заменить на соответствующие утилиты для этих дистрибутивов.

@edo1h
27.09.2021 02:17 UTC
Первоисточник

Комментарии

@quarckster
27.09.2021 05:49 UTC
0

Почему не использовать контейнеры для этой задачи?

@edo1h
27.09.2021 07:58 UTC
0

да можно и с контейнерами сделать, но не думаю, что будет проще в итоге.
а какой именно контейнер вы имеете в виду?

27.09.2021 08:01 UTC
-2

Обычный докер контейнер. Взять любой базовый образ, установить необходимые зависимости и пробросить иксы через VNC или через x11docker. Премущество перед вашим решением - это переносимость.

27.09.2021 09:06 UTC
+1
Преимущество перед вашим решением — это переносимость.

хм… debootstrap есть под все мажорные дистрибутивы, например
https://src.fedoraproject.org/rpms/debootstrap
https://archlinux.org/packages/community/any/debootstrap/
про sudo и chroot уже не говорю )


под windows с wsl тоже всё должно работать.


разве что с маками докер прячет от пользователя запуск виртуалки с линуксом, без него же придётся явно запускать виртуалку с linux, вы это имели в виду под переносимостью?


P. S. решил попробовать, написал вот такой Dockerfile:


FROM --platform=linux/386 debian/eol:lenny-slim
RUN echo 'deb http://archive.debian.org/debian lenny main contrib non-free' > /etc/apt/sources.list
RUN apt-get update
RUN apt-get install -y pose pose-skins
CMD pose

получаю


The command '/bin/sh -c echo 'deb http://archive.debian.org/debian lenny main contrib non-free' > /etc/apt/sources.list' returned a non-zero code: 139

с etch работает. образ lenny битый?

27.09.2021 09:37 UTC
+5

Хм.

Что "переносимей" - chroot или chroot+overlayfs+cgroups+namespaces+dockerd + VNC/x11docker?

Срочно несите докер, а то chroot - это сложно!

28.09.2021 05:38 UTC
0
НЛО прилетело и опубликовало эту надпись здесь
@zVlad909
30.08.2025 15:31 UTC
0

На современных МФ (тех что появились после 2000 года) в ОС z/OS одновременно можно использовать три разрядности адресации: 24 бит, 31 бит, и 64 бит. Причем в одном и том же алрессном пространсте.

В z/VM можно конфигурировать виртуальные машины с разными архитектурами под ОС или программы для устаревших вариантов архитектур МФ. Архитектур, вместе с Z архитектурой, четыре. Это не по поводу адресации, а несколько глубже.

С адресацией всегда есть правило что выше разраядная архитектура включает в себя все низжие. Именно включает, а не эмулирует. Таким образом удается наряду с достоинствами боле разрядной адресации использовать достоинства менее разрядных. И такие достоинства имеются.