Я пытаюсь 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
Я знаю, это означает, что архитектура отличается. Я делаю что-то неправильно?
binfmt
Сначала вы должны настроить , взгляните на wiki.debian.org/QemuUserEmulation для краткого вступления. Пример для настройки binfmt_misc можно найти по адресу svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh-static
в опции компоновщикаОтветы:
Вы не можете получить доступ к другой архитектуре. Используя 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).
источник
binfmt
и qemu в комбинации для запуска не собственных целей - wiki.debian.org/QemuUserEmulationbinfmt
/qemu-user
- это именно то, что описал OP, будучи в состоянии выполнить chroot в arm chroot и запускать команды без необходимости создавать специальные rootfs и т. Д.Время от времени я использую chroot ARM: мой телефон работает под управлением Linux Deploy, и образ умирает время от времени. Затем я копирую его на свой компьютер и изучаю ситуацию с chroot следующим образом:
источник
/bin/ls
? В этом случае ваша$PATH
переменная не установлена или искажена. Попробуйexport PATH=/sbin:/usr/sbin:/usr/bin:/bin
. Могут быть и другие пути, которые вы должны добавить, но это, вероятно, хорошее начало. Если это не сработает, вы, вероятно, забыли скопировать двоичные файлы в среду chroot. Вы также можете использовать bash для просмотра файловой системы, чтоecho /*
примерно соответствуетls /*
. Я не знаю, может ли мешать SELinux, опыта там нет./bin/ls: no such file or directory
. экспорт показывает хороший путь. Но echo / * работает, echo / usr / bin / qemu-arm * выводит список файлов. Я также смонтировать sys, proc, devbla/usr/bin
вместоbla/bin
. Когда я бегу,which qemu-arm-static
это дает мне,/bin/usr
так что я думаю, это должно быть последовательным?Я думаю, что проблема в том, что вы не должны копировать,
qemu-arm
ноqemu-arm-static
. Это статический скомпилированный исполняемый файл, способный запускаться из chroot без каких-либо библиотек.Вы также можете посмотреть,
/proc/sys/fs/binfmt_misc
существует ли файлqemu-arm
. Если нет, перезапустите сервисbinfmt_support
.источник
Чтобы заставить это работать я установил
qemu-static-arm
иbinfmt-support
из AUR.Прочитайте комментарии для
qemu-user-static
. Мне пришлось обновитьPKGBUILD
последний URL-адрес для загрузки и хэши для завершения makepkg.(Чтобы установить из AUR, скачать архив,
untar
,cd
, бегmakepkg -i
)Ответ Кристиана Вольфа важен.
update-binfmts
не выполняется должным образом, чтобы включить эти форматы. Для этого я побежал:как описано в man-странице для update-binfmts. После этого
cat /proc/sys/fs/binfmt_misc
покажет различные binfmts.Затем убедитесь , чтобы скопировать
qemu-*-static
вusr/bin/
каталог , в вещь , которую вы хотите , чтобы Chroot и тоchroot
должно работать.источник
Вы можете определенно «зашить» в (смонтированную) файловую систему, предназначенную для другой архитектуры, и выполнить значимую работу, вам просто нужны правильные инструменты.
Взгляните на PRoot, который является реализацией пользовательского пространства для chroot, mount --bind и binfmt_misc: https://proot-me.github.io/
Вместе с эмуляторами пользовательского режима QEMU все готово.
Хотя вы обычно не можете выполнить «полную» загрузку (т. Е. Запустить init и службы), достаточно запустить некоторые двоичные файлы из их «естественного» места с доступом ко всем их файлам конфигурации, в том числе к тем, которые смонтированы с привязкой из система хоста и т. д.
источник
источник
Добавление к ответу Люка: вам нужно убедиться, что местоположение интерпретатора в chroot такое же, как и в основной файловой системе. Это связано с тем, что ядро определяет архитектуру исполняемого файла и затем использует местоположение интерпретатора, как показано на рисунке,
update-binfmts --display
для его запуска. Итак, линиядолжно быть на самом деле
В противном случае вы можете получить ошибки «Not found» внутри вашего chroot, поскольку ваше ядро не может найти требуемого интерпретатора, если местоположение вашей системы
qemu-arm-static
не внутри/usr/bin
.источник
Я просто столкнулся с той же проблемой на Ubuntu. Я
binfmt
настроил иqemu-arm-static
скопировал на тот же путь chroot-ed, что и в хост-системе.Через час я это сделал
set|grep bash
на хост-машине. Я обнаружил, что у меня есть/bin/bash
две переменные env:SHELL
иSUDO_COMMAND
. После замены переменных мой chroot в ARM работал:источник
Я считаю, что для этого OP все, что ему нужно было сделать, это настроить binfmts, просто запустив:
После запуска chroot в файловой системе arm было бы возможно.
источник