Я пытаюсь 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 из «хостовой» системы и т. д.