Как выполнить chroot в файловую систему с другой архитектурой?

Как выполнить chroot в файловую систему с другой архитектурой?

Я пытаюсь chrootперейти в файловую систему Arch Linux ARMиз x86_64.

Я видел, что это можно сделать с помощью static, qemuскопировав двоичный файл в chroot-систему:

$ cp /usr/bin/qemu-arm archarm-chroot/usr/bin    

Но несмотря на это я всегда получаю следующую ошибку:

chroot: failed to run command ‘/bin/bash’: Exec format error

Я знаю, что это означает, что архитектуры различаются. Я что-то делаю не так?

решение1

Я время от времени использую ARM chroot: на моем телефоне запущен Linux Deploy, и образ время от времени умирает. Затем я копирую его на свой компьютер и изучаю ситуацию с chroot следующим образом:

# This provides the qemu-arm-static binary
apt-get install qemu-user-static

# Mount my target filesystem on /mnt
mount -o loop fs.img /mnt

# Copy the static ARM binary that provides emulation
cp $(which qemu-arm-static) /mnt/usr/bin
# Or, more simply: cp /usr/bin/qemu-arm-static /mnt/usr/bin

# Finally chroot into /mnt, then run 'qemu-arm-static bash'
# This chroots; runs the emulator; and the emulator runs bash
chroot /mnt qemu-arm-static /bin/bash

решение2

ВАЖНЫЙ:Пожалуйста, посмотрите другие ответы. Это старый и неточный ответ.

Вы не можете chroot в другую архитектуру. Используя chroot, вы выполняете двоичные файлы (из chroot) на своей архитектуре. Выполнение двоичных файлов ARM на x86 (и x86_64 в этом отношении) приведет к "Exec format error".

Если вы хотите запускать двоичные файлы с другой архитектуры, вам понадобится эмулятор. Qemu — хороший кандидат для этого, но вам нужно будет научиться им пользоваться. Это потребует создания RootFS и компиляции ядра для ARM. Вам понадобится набор инструментов для компиляции двоичных файлов ARM (и ядра), возможно. Одно можно сказать наверняка: забудьте о методе chroot, вы не сможете запускать двоичные файлы, скомпилированные для ARM, на x86 (x86_64).

Редактировать: После небольшого разговора с @UrichDangel я понял, что должно быть возможно войти в среду chroot с помощью программ qemu-user (в данном случае qemu-arm). Chroot должен выполнять qemu-arm, скомпилированный для архитектуры вашего хоста, тогда qemu-arm сможет выполнить ваш /bin/sh (скомпилированный для arm).

решение3

На Arch, Установитьqemu-user-staticиbinfmt-qemu-staticиз АУР.

Затем обязательно скопируйте qemu-*-staticв usr/bin/каталог, в который вы хотите выполнить chroot, и тогда chrootдолжно получиться что-то вроде этогоchroot /mnt qemu-arm-static /bin/bash

решение4

Вы определенно можете выполнить chroot в (смонтированной) файловой системе, предназначенной для другой архитектуры, и выполнить какую-то значимую работу, вам просто понадобятся правильные инструменты.

Взгляните на PRoot, который представляет собой реализацию chroot, mount --bind и binfmt_misc в пользовательском пространстве:https://proot-me.github.io/

Вместе с эмуляторами пользовательского режима QEMU все готово.

Хотя обычно невозможно выполнить «полную» загрузку (т. е. запустить init и службы), вполне достаточно запустить некоторые двоичные файлы из их «естественного» места, имея доступ ко всем их файлам конфигурации, включая некоторые, которые смонтированы с помощью bind-mount из «хостовой» системы и т. д.

Связанный контент