Qemu-user-binfmt misc

Материал из ALT Linux Wiki
Примечание: С версии 2.10.1-alt1 qemu-user-binfmt_misc переименован в qemu-user-binfmt

Создание chroot-окружения для запуска программ некоторой архитектуры, поддерживаемой Qemu в режиме User.

Постановка задачи

  • имеется необходимость запускать linux-программы под некоторую архитектуру
    • не обязательно все и всякие
  • установка дистрибутива в полную виртуалку qemu-system-платформа либо невозможно. либо идёт чересчур долго
    • вариант: получившая виртуалка работает очень медленно

Пример

Компиляция, дезассемблирование и запуск небольших программ на Си/Ассемблере MIPS в учебных целях (это была моя задача)

Проект решения

  1. Используем частичную эмуляцию «qemu-платформа» для запуска бинарников
  2. Используем binfmt_misc (регистрацию загрузчика) для прозрачного запуска бинарников
  3. Используем 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:
: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 (тогда программы запускаться не будут), а может — с ключом nosuid (тогда программы не станут setUID-ными).
  • ВНИМАНИЕ Следующий шаг — синхронный, требуется внимание. Debootstrap сначала скачивает и проверяет некоторые пакеты, затем распаковывает их, а заитем начинает устанавливать остальные пакеты с помощью уже распакованного dpkg. Чтобы этот dpkg (и другие бинарники из croot) вообще запустился, надо дождаться начала распаковки, приостановить debootstraop с помощью ^Z, например, положить в chroot qemu-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.