Как стать автором
Обновить

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

Время на прочтение4 мин
Количество просмотров3.9K

Эта мини-статья родилась как ответ на статью Упрощаем эмуляцию 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

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

  • во второй строчке мы устанавливаем 32-битную версию Debian lenny в ./lenny, сразу устанавливаем pose и pose-covers (которые лежат в разделе contrib, который нам потребовалось подключить помимо стандартного main), используя стандартный репозиторий Debian для архивных релизов http://archive.debian.org/debian/

    На моём домашнем компьютере установка потребовала менее полутора минут (бо́льшая часть времени, очевидно, ушла на скачивание пакетов с не очень быстрого архивного репозитория), установленная система заняла 265 МБ;

  • в третьей строчке мы добавляем в chroot пользователя с тем же именем и UID, что и текущий пользователь (запускать приложения из-под root — не самая хорошая идея). Тот же UID нам нужен чтобы этот пользователь смог читать файлы из нашего домашнего каталога;

  • в четвертой строчке немного магии: мы пробрасываем служебные каталоги /dev, /sys, /proc в chroot (некоторым приложениям они могут понадобиться), кроме этого, мы пробрасываем домашний каталог текущего пользователя и каталог /tmp/.X11-unix.

    Последние два каталога обеспечивают работу X-приложений: эти приложения обычно используют /tmp/.X11-unix/X0 для общения с X-сервером и ~/.Xauthority для авторизации на нём (вместо монтирования всего домашнего каталога, можно было бы ограничиться этим файлом, но нам могут пригодиться другие файлы, например, образы ROM для POSE и файлы программы, которые мы хотим установить на эмулятор; поэтому я решил пробросить домашний каталог целиком).

    Внимание! В моём варианте домашний каталог монтируется в окружении chroot с полным доступом, при неаккуратном использовании вы можете удалить/повредить ценные файлы из своего домашнего каталога! Вы можете использовать опцию -o ro для монтирования только для чтения;

  • в пятой строчке мы непосредственно запускаем POSE в chroot-окружении;

  • ну и в шестой строчке мы удаляем созданные монтирования, теперь при желании каталог ./lenny можно просто удалить. Обязательно перед запуском rm -rf удостоверьтесь, что каталоги были отмонтированы!

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

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

Теги:
Хабы:
Всего голосов 21: ↑21 и ↓0+21
Комментарии6

Публикации

Истории

Работа

Ближайшие события

Антиконференция X5 Future Night
Дата30 мая
Время11:00 – 23:00
Место
Онлайн
OTUS CONF: GameDev
Дата30 мая
Время19:00 – 20:30
Место
Онлайн
Конференция «IT IS CONF 2024»
Дата20 июня
Время09:00 – 19:00
Место
Екатеринбург
Summer Merge
Дата28 – 30 июня
Время11:00
Место
Ульяновская область