Qemu-user-binfmt misc
Версия от 21:27, 12 октября 2017; Tora-bora (обсуждение | вклад) (qemu-user-binfmt_misc переименован в qemu-user-binfmt)
Примечание: С версии 2.10.1-alt1 qemu-user-binfmt_misc переименован в qemu-user-binfmt
Создание chroot-окружения для запуска программ некоторой архитектуры, поддерживаемой Qemu в режиме User.
Постановка задачи
- имеется необходимость запускать linux-программы под некоторую архитектуру
- не обязательно все и всякие
- установка дистрибутива в полную виртуалку qemu-system-платформа либо невозможно. либо идёт чересчур долго
- вариант: получившая виртуалка работает очень медленно
Пример
Компиляция, дезассемблирование и запуск небольших программ на Си/Ассемблере MIPS в учебных целях (это была моя задача)
Проект решения
- Используем частичную эмуляцию «qemu-платформа» для запуска бинарников
- Используем binfmt_misc (регистрацию загрузчика) для прозрачного запуска бинарников
- Используем DebianBootstrap для быстрого развёртывания полного дистрибутива
- В процессе развёртывания понадобится подложить соответствующий загрузчик в debootstrap chroot — либо с вместе его библиотеками, либо статически собранный
Реализация (на примере платформы mipsel)
- Устанавливаем qemu-user-binfmt_misc
# apt-get install qemu-user-binfmt_misc
- Создадим файл настроек
/etc/binfmt.d/mipsel.conf
- (для платформ ниже p8) копируем файл настройки qemu.binfmt в
/etc/binfmt.d/mipsel.conf
. Можно оставить только нужную нам строку относительно mipsel:
- (для платформ ниже p8) копируем файл настройки qemu.binfmt в
:qemu-mipsel:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xfe\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel:
- Перезагружаем сервис, которой регистрирует загрузчики
# systemctl restart systemd-binfmt.service
- Поверяем, что загрузчик зарегистрирован
# cat /proc/sys/fs/binfmt_misc/qemu-mipsel enabled interpreter /usr/bin/qemu-mipsel flags: offset 0 magic 7f454c4601010100000000000000000002000800 mask ffffffffffffff00fefffffffffffffffeffffff
- Устанавливаем DebianBootstrap
# apt-get install debootstrap
- Начинаем развёртывать окружение
# debootstrap --verbose --arch mipsel stable /opt/debian_mipsel http://mirror.yandex.ru/debian
- Файловая система с chroot-ом (в примере
/opt
) может быть смонтирована с ключомnoexec
(тогда программы запускаться не будут), а может — с ключомnoexec
(тогда программы не станут setUID-ными).
- Файловая система с chroot-ом (в примере
- ВНИМАНИЕ Следующий шаг — синхронный, требуется внимание. Debootstrap сначала скачивает и проверяет некоторые пакеты, затем распаковывает их, а заитем начинает устанавливать остальные пакеты с помощью уже распакованного
dpkg
. Чтобы этотdpkg
(и другие бинарники из croot) вообще запустился, надо дождаться начала распаковки, приостановить debootstraop с помощью ^Z, например, положить в chrootqemu-mipsel.static
под именем загрузчика, указанного в файле настроек, а затем продолжить debootstrap:
I: Retrieving liblzma5 I: Validating liblzma5 I: Retrieving zlib1g I: Validating zlib1g I: Chosen extractor for .deb packages: dpkg-deb I: Extracting acl... I: Extracting libacl1... I: Extracting adduser... I: Extracting libattr1... ^Z
[1] + 7774 suspended debootstrap --verbose --arch mipsel stable /opt/debian_mipsel # cp /usr/bin/qemu-mipsel.static /opt/debian_mipsel/usr/bin/qemu-mipsel # fg
I: Extracting libaudit-common... I: Extracting libaudit1... … I: Installing core packages... I: Unpacking required packages... I: Unpacking acl... … : Configuring systemd... I: Base system installed successfully.
Готово.
Можно пользоваться (правда, пока только из-под root):
# chroot /opt/debian_mipsel /bin/bash root@localhost:/# root@localhost:/# uname -m mips root@localhost:/#
TODO
- Доступ обычного пользователя — sudo?
- systemd-окружение автоматом
Недостатки
- В окружении не работают некоторые системные вызовы
- В частности, не работает
dtrace
, а следовательно,gdb
иstrace
- В частности, не работает
- Для платформ ниже p8 надо использовать debian oldstable, на stable в процессе получаем сообщение об ошибке:
I: Configuring libc-bin... W: Failure while configuring required packages.