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

38

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

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

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

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

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

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

Jivings
источник
2
binfmtСначала вы должны настроить , взгляните на wiki.debian.org/QemuUserEmulation для краткого вступления. Пример для настройки binfmt_misc можно найти по адресу svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
Ульрих
Статические пакеты Qemu, по-видимому, отсутствуют в репозиториях Arch.
Jivings
2
Извините, я не использую arch, но вы, вероятно, сможете создать статический пакет qemu, добавив -staticв опции компоновщика
Ульрих Дангел

Ответы:

15

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

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

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

0xAF
источник
6
Вы должны быть в состоянии использовать binfmtи qemu в комбинации для запуска не собственных целей - wiki.debian.org/QemuUserEmulation
Ульрих
2
Я знаю, как использовать Qemu для эмуляции. Видимо, вы можете использовать его с chroot, хотя я не могу понять, как.
Jivings
@UlrichDangel, да, это хорошая информация. Но я думаю, что ОП не искали этого короля решения. binfmt будет возможен, как только он правильно установит qemu с эмуляцией qemu-arm, но я думаю, что он хочет войти в свою среду эмуляции ARM (например, Raspberry Pi), где ему понадобится qemu-system-arm.
0xAF
@ 0xAF, но решение binfmt/ qemu-user- это именно то, что описал OP, будучи в состоянии выполнить chroot в arm chroot и запускать команды без необходимости создавать специальные rootfs и т. Д.
Ulrich Dangel
1
@UlrichDangel, теперь на секунду, но я верю, что ты прав. Можно ввести эмулированный chroot с помощью qemu-arm (или должен быть). Я отредактирую свой комментарий по этому вопросу.
0xAF
34

Время от времени я использую chroot ARM: мой телефон работает под управлением 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
Люк
источник
Это работает, но после chroot вся команда не дает такого файла или каталога. Я использую Fedora 24, проблема selinux? Нужна помощь, пожалуйста
Superbiji
@Superbiji Работает ли бег /bin/ls? В этом случае ваша $PATHпеременная не установлена ​​или искажена. Попробуй export PATH=/sbin:/usr/sbin:/usr/bin:/bin. Могут быть и другие пути, которые вы должны добавить, но это, вероятно, хорошее начало. Если это не сработает, вы, вероятно, забыли скопировать двоичные файлы в среду chroot. Вы также можете использовать bash для просмотра файловой системы, что echo /*примерно соответствует ls /*. Я не знаю, может ли мешать SELinux, опыта там нет.
Люк
1
Даже лс дает /bin/ls: no such file or directory. экспорт показывает хороший путь. Но echo / * работает, echo / usr / bin / qemu-arm * выводит список файлов. Я также смонтировать sys, proc, dev
Superbiji
1
Спасибо за помощь .. нашел проблему, причина в том, что интерпретатор в binfmt указывает на неверный путь
Superbiji
1
хорошо, как-то это было решено копированием qemu-arm-static bla/usr/binвместо bla/bin. Когда я бегу, which qemu-arm-staticэто дает мне, /bin/usrтак что я думаю, это должно быть последовательным?
Дафнахактана
11

Я думаю, что проблема в том, что вы не должны копировать, qemu-armно qemu-arm-static. Это статический скомпилированный исполняемый файл, способный запускаться из chroot без каких-либо библиотек.

Вы также можете посмотреть, /proc/sys/fs/binfmt_miscсуществует ли файл qemu-arm. Если нет, перезапустите сервис binfmt_support.

Христианский волк
источник
Мне пришлось вручную запустить: update-binfmts --importdir / var / lib / binfmts / --import, после чего все обнаружилось в / proc / sys / fs / binfmt_misc, и chroot работает.
Мариано Альвира
7

Чтобы заставить это работать я установил qemu-static-armи binfmt-supportиз AUR.

Прочитайте комментарии для qemu-user-static. Мне пришлось обновить PKGBUILDпоследний URL-адрес для загрузки и хэши для завершения makepkg.

(Чтобы установить из AUR, скачать архив, untar, cd, бег makepkg -i)

Ответ Кристиана Вольфа важен. update-binfmtsне выполняется должным образом, чтобы включить эти форматы. Для этого я побежал:

update-binfmts --importdir /var/lib/binfmts/ --import

как описано в man-странице для update-binfmts. После этого cat /proc/sys/fs/binfmt_miscпокажет различные binfmts.

Затем убедитесь , чтобы скопировать qemu-*-staticв usr/bin/каталог , в вещь , которую вы хотите , чтобы Chroot и то chrootдолжно работать.

Мариано Альвира
источник
6

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

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

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

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

извед
источник
2
sudo apt-get update
sudo apt-get install debootstrap qemu qemu-user-static
sudo qemu-debootstrap --arch armhf bionic armhf-chroot
sudo chroot armhf-chroot

uname -m 
Максим Акристиный
источник
1

Добавление к ответу Люка: вам нужно убедиться, что местоположение интерпретатора в chroot такое же, как и в основной файловой системе. Это связано с тем, что ядро ​​определяет архитектуру исполняемого файла и затем использует местоположение интерпретатора, как показано на рисунке, update-binfmts --displayдля его запуска. Итак, линия

cp $(which qemu-arm-static) /mnt/usr/bin

должно быть на самом деле

cp $(which qemu-arm-static) /mnt/$(which qemu-arm-static)

В противном случае вы можете получить ошибки «Not found» внутри вашего chroot, поскольку ваше ядро ​​не может найти требуемого интерпретатора, если местоположение вашей системы qemu-arm-staticне внутри /usr/bin.

Мартен Джейкобс
источник
0

Я просто столкнулся с той же проблемой на Ubuntu. Я binfmtнастроил и qemu-arm-staticскопировал на тот же путь chroot-ed, что и в хост-системе.

Через час я это сделал set|grep bashна хост-машине. Я обнаружил, что у меня есть /bin/bashдве переменные env: SHELLи SUDO_COMMAND. После замены переменных мой chroot в ARM работал:

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd
Виктор Сергиенко
источник
0

Я считаю, что для этого OP все, что ему нужно было сделать, это настроить binfmts, просто запустив:

update-binfmts --enable qemu-arm

После запуска chroot в файловой системе arm было бы возможно.

user175914
источник