Кросс платформенный 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]