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

Комментарии (6)


  1. quarckster
    27.09.2021 08:49

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


    1. edo1h Автор
      27.09.2021 10:58

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


      1. quarckster
        27.09.2021 11:01
        -2

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


        1. edo1h Автор
          27.09.2021 12:06
          +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 битый?


        1. GrgPlus93
          27.09.2021 12:37
          +5

          Хм.

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

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


          1. 13werwolf13
            28.09.2021 08:38
            +2

            неистово плюсую

            выросло поколение для которых chroot/lxc/etc сложно а солянка из докера и кучи всего на него натянутого это просто