Як я можу вписатись у файлову систему з іншою архітектурою?


38

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

Я бачив, що можна зробити статичну qemu, скопіювавши двійкове в систему chroot:

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

Але незважаючи на це, я завжди отримую таку помилку:

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

Я знаю, це означає, що архітектури відрізняються. Я щось роблю не так?


2
binfmtСпочатку потрібно налаштувати , ознайомитись з wiki.debian.org/QemuUserEmulation для короткого короткого вступу. Приклад налаштування binfmt_misc можна знайти за адресою svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
Ульріх

Статичні пакети Qemu, схоже, не знаходяться в сховищах Arch.
Jivings

2
Вибачте, я не використовую арку, але ви, ймовірно, зможете створити статичний пакет 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).


6
Ви повинні мати можливість використовувати binfmtта qemu у поєднанні для запуску невідроджених
Ульріх

2
Я знаю, як використовувати Qemu для емуляції. Мабуть, ви можете використовувати це з chroot, хоча явно не можу розробити як.
Jivings

@UlrichDangel, Так, це гарна інформація. Але я думаю, що ОП не шукали цього царя рішення. binfmt стане можливим, як тільки він належним чином встановить qemu з емуляцією qemu-arm, але я вважаю, що він хоче увійти в своє середовище емуляції ARM (наприклад, Raspberry Pi), де йому знадобиться qemu-system-arm.
0xAF

@ 0xAF, але binfmt/ qemu-userрішення саме те, що описано в ОП, маючи змогу ввійти в рукоятку і запустити команди без необхідності складання виділених руфів тощо
Ульріх Дангел,

1
@UlrichDangel, хоч на секунду, я вважаю, ти маєш рацію. Можна ввести емульований chroot за допомогою qemu-arm (або повинно бути). Я відредагую свій коментар до цього.
0xAF

33

Я час від часу використовую 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так що я думаю, він повинен бути послідовним?
dafnahaktana

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

як описано на сторінці для оновлення-binfmts. Після цього cat /proc/sys/fs/binfmt_miscпокажуть різні binfmts.

Потім переконайтесь, що скопіюйте файл qemu-*-staticдо usr/bin/каталогу в тій справі, яку ви хочете хронувати, і тоді це chrootповинно працювати.


6

Ви, безумовно, можете "chroot" у (змонтованій) файловій системі, призначеній для іншої архітектури, і виконати якісь значущі роботи, просто потрібні правильні інструменти.

Подивіться на PRoot, що є реалізацією користувача chroot, mount --bind та binfmt_misc: https://proot-me.github.io/

Разом з емуляторами режиму користувача QEMU все готово.

Хоча зазвичай ви не можете виконати "повний" завантаження (тобто запуск init та служб), досить добре запустити деякі бінарні файли зі свого "природного" місця з доступом до всіх їхніх конфігураційних файлів, включаючи деякі, які прив’язані до система "хост" тощо.



1

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

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

насправді має бути

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

В іншому випадку, ви можете отримати «не найден» -errors всередині вашого 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

Я вважаю, що для цієї ОП все, що йому потрібно було зробити, це налаштувати binfmts, просто запустивши:

update-binfmts --enable qemu-arm

Після запуску цього процесу можливе chroot у файловій системі arm.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.