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