Кросс платформенный chroot в x86_64 Linux системе

Кросс платформенный chroot в x86_64 Linux системе


Тем кто часто сталкивается с обслуживанием и конфигурированием систем на базе различных архитектур, приходится решать вопрос среды запуска операционной системы и приложений.

Часто данный вопрос решается с помощью виртуальных машин или отладка ведётся прямо на “железе”, в некоторых, специфических, случаях, конечно не обойтись без отладки на “железе” (к примеру на плате имеется специфический GPIO контроллер) но таковые случаи до воли редки.

Большинство операций по начальной конфигурации, тестам или просто компиляции приложений, можно выполнить на хост системе - с помощью chroot и qemu-static (aka qemu-userspace) и тем самым работая с локальной, файловой системой, с всеми вытекающими плюсами.

Сегодня я хочу рассмотреть вариант chroot в rootfs ALT Linux armh (32bit). Не смотря на то, что такая возможность существует давно, тем не менее почему-то о ней часто забывают.

Для этого нам понадобится архив с rootfs ALT Linux armh (systemd) или ALT Linux armh (sysVinit) и бинарник qemu-arm-static (или другой, в соответствии с вашей embedded платформой)

Все действия выполняются из под пользователя root - не sudo

Подготавливаем rootfs

$ su - 
password: ****
# mkdir alt-rootfs
# curl -O -L https://mirror.yandex.ru/altlinux/p10/images/cloud/armh/alt-p10-rootfs-systemd-armh.tar.xz
# tar -xpf alt-p10-rootfs-systemd-armh.tar.xz -C alt-rootfs

Установка qemu-arm-static

Ядро на вашей хост системе, должно быть сконфигурировано с параметром BINFMT_MISC=y или m.

Конфигурация текущего ядра находится в файле /proc/config.gz, проверить необходимый параметр можно командой zgrep BINFMT_MISC /proc/config.gz.

qemu-arm-static должен присутствовать как в хост системе так и chroot окружении, после окончания работ, его необходимо удалить из rootfs или оставить на будущее.

Загружаем бинарник qemu-arm-static и устанавливаем в системе, и в ранее подготовленный rootfs

# curl -O -L https://github.com/multiarch/qemu-user-static/releases/download/v7.0.0-7/qemu-arm-static

В хостовой системе
# install -m755 qemu-arm-static /usr/bin/qemu-arm

В rootfs
# install -m755 qemu-arm-static alt-rootfs/usr/bin/qemu-arm

Если хостовой системой является ALT Linux, то намного проще (и лучше) будет использовать пакеты qemu-user-binfmt-arm и qemu-user-static-binfmt-arm из репозитория:
# apt-get install qemu-user-binfmt-arm qemu-user-static-binfmt-arm
И скопировать установленный бинарник в подготовленный rootfs
# cp /usr/bin/qemu-arm.static alt-rootfs/usr/bin/qemu-arm

Регистрируем обработчик qemu-static для архитектуры arm

# echo ":arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/.host/qemu-arm:" > /proc/sys/fs/binfmt_misc/register

CHROOT

После регистрации qemu-static в системе у нас уже должен работать chroot.

В зависимости от предполагаемых действий, вам может понадобится так-же смонтировать в chroot окружение /proc, /dev, /dev/pts, /sys, этого можно не делать если не предполагается настройка сети, фаервола, systemd, etc.

# mount -t proc /proc alt-rootfs/proc
# mount -o bind /dev alt-rootfs/dev
# mount -o bind /dev/pts alt-rootfs/dev/pts
# mount -o bind /sys alt-rootfs/sys

# chroot alt-rootfs /bin/bash
# uname -a
[root@alt10ws /]# uname -a
Linux alt10ws 5.10.113-std-def-alt1 #1 SMP Thu May 5 19:24:26 UTC 2022 armv7l GNU/Linux

Если при выполнении chroot alt-rootfs /bin/bash получаете ошибку chroot: failed to run command ‘/bin/bash’: Exec format error - не зарегистрирован qemu-static в binfmt_misc.

При ошибке chroot: failed to run command ‘/bin/bash’: No such file or directory - забыли скопировать qemu-alt-static в /usr/bin/ chroot окружения.

Регистрация qemu-static для других архитектур

Что-бы не делать регистрацию руками, можно воспользоваться скриптом

# REGISTER
# aarch64
echo ':aarch64:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\xb7:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-aarch64-static:' > /proc/sys/fs/binfmt_misc/register

# arm
echo ':arm:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-arm-static:' > /proc/sys/fs/binfmt_misc/register

# rmeb
echo ':armeb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x28:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-armeb-static:' > /proc/sys/fs/binfmt_misc/register

# alpha
echo ':alpha:M::\x7fELF\x02\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x26\x90:\xff\xff\xff\xff\xff\xfe\xfe\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-alpha-static:' > /proc/sys/fs/binfmt_misc/register

# mips
echo ':mips:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x08:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-mips-static:' > /proc/sys/fs/binfmt_misc/register

# mipsel
echo ':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\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff\xff:/usr/bin/qemu-mipsel-static:' > /proc/sys/fs/binfmt_misc/register

# ppc
echo ':ppc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x14:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-ppc-static:' > /proc/sys/fs/binfmt_misc/register

# sh4
echo ':sh4:M::\x7fELF\x01\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a\x00:\xff\xff\xff\xff\xff\xff\xff\x00\xff\xff\xff\xff\xff\xff\xff\xff\xfb\xff\xff\xff:/usr/bin/qemu-sh4-static:' > /proc/sys/fs/binfmt_misc/register

# sh4eb
echo ':sh4eb:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x2a:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sh4eb-static:' > /proc/sys/fs/binfmt_misc/register

# sparc
echo ':sparc:M::\x7fELF\x01\x02\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x02\x00\x02:\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xfe\xff\xff:/usr/bin/qemu-sparc-static:' > /proc/sys/fs/binfmt_misc/register

# UNREGISTER
echo -1 > /proc/sys/fs/binfmt_misc/ARCH [arm,aarch64...etc]


Report Page