Bagaimana saya bisa chroot ke sistem file dengan architechture yang berbeda?


38

Saya mencoba chrootmenjadi ARMfilesystem Arch Linux dari x86_64.

Saya telah melihat bahwa mungkin menggunakan statis qemudengan menyalin biner ke sistem chroot:

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

Tetapi meskipun demikian saya selalu mendapatkan kesalahan berikut:

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

Saya tahu ini berarti bahwa arsitekturnya berbeda. Apakah saya melakukan sesuatu yang salah?


2
Anda harus mengonfigurasi binfmtterlebih dahulu, lihat di wiki.debian.org/QemuUserEmulation untuk pengenalan singkat yang tenang. Contoh untuk mengkonfigurasi binfmt_misc dapat ditemukan di svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
Ulrich Dangel

Paket statis Qemu sepertinya tidak ada di repositori Arch.
Jivings

2
Maaf saya tidak menggunakan lengkungan, tetapi Anda mungkin harus dapat membangun paket qemu statis dengan menambahkan -staticopsi
tautan

Jawaban:


15

Anda tidak dapat melakukan chroot ke arsitektur yang berbeda. Dengan chroot, Anda mengeksekusi binari (dari chroot) pada arsitektur Anda. Menjalankan binari ARM pada x86 (dan x86_64 dalam hal ini) akan mengarah ke "Kesalahan format Exec".

Jika Anda ingin menjalankan binari dari arsitektur yang berbeda, Anda memerlukan Emulator. Qemu adalah kandidat yang bagus untuk ini, tetapi Anda harus belajar cara menggunakannya. Ini akan melibatkan pembuatan RootFS dan kompilasi kernel untuk ARM. Anda mungkin memerlukan toolchain untuk mengkompilasi binari ARM (dan kernel). Satu hal yang pasti: Lupakan metode chroot, Anda tidak dapat menjalankan binari yang dikompilasi untuk ARM pada x86 (x86_64).

Sunting: Setelah obrolan ringan dengan @UrichDangel, saya menyadari, seharusnya dimungkinkan untuk memasuki lingkungan chroot dengan program-program qemu-user (qemu-arm dalam kasus ini). Chroot seharusnya mengeksekusi qemu-arm yang dikompilasi untuk arsitektur host Anda, maka qemu-arm dapat mengeksekusi / bin / sh Anda (dikompilasi untuk arm).


6
Anda harus dapat menggunakan binfmtdan qemu dalam kombinasi untuk menjalankan target yang bukan asli - wiki.debian.org/QemuUserEmulation
Ulrich Dangel

2
Saya tahu cara menggunakan Qemu untuk emulasi. Rupanya Anda bisa menggunakannya dengan chroot, walaupun jelas saya tidak tahu caranya.
Jivings

@UlrichDangel, Ya, ini informasi yang bagus. Tapi saya pikir OP tidak mencari raja solusi ini. binfmt akan mungkin setelah dia menginstal qemu dengan benar dengan emulasi qemu-arm, tapi saya percaya dia ingin memasuki lingkungan emulasi ARM-nya (misalnya Raspberry Pi) di mana dia akan membutuhkan qemu-system-arm.
0xAF

@ 0xAF tetapi binfmt/ qemu-usersolusi persis seperti yang dijelaskan OP, bisa chroot menjadi arm chroot dan menjalankan perintah tanpa perlu membuat rootfs khusus dll.
Ulrich Dangel

1
@UlrichDangel, sekarang tunggu sebentar, saya yakin Anda benar. Dimungkinkan untuk memasukkan chroot yang dicontoh dengan qemu-arm (atau seharusnya). Saya akan Edit komentar saya tentang itu.
0xAF

33

Saya menggunakan chroot ARM dari waktu ke waktu: ponsel saya menjalankan Linux Deploy dan gambar mati sesekali. Saya kemudian menyalinnya ke komputer saya dan memeriksa situasinya dengan chroot seperti ini:

# 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

Yang ini berfungsi, tetapi setelah chroot semua perintah tidak memberikan file atau direktori tersebut. Saya menggunakan Fedora 24, masalah selinux? Perlu bantuan
Superbiji

@ Superbiji Apakah menjalankan /bin/lspekerjaan? Dalam hal itu, $PATHvariabel Anda tidak disetel atau dikacaukan. Coba export PATH=/sbin:/usr/sbin:/usr/bin:/bin. Mungkin ada jalan lain yang harus Anda tambahkan, tetapi ini mungkin awal yang baik. Jika itu tidak berhasil, Anda mungkin lupa menyalin binari ke lingkungan chroot. Anda dapat menggunakan bash untuk menelusuri di sekitar filesystem juga, seperti echo /*kira-kira setara dengan ls /*. Saya tidak tahu apakah SELinux mungkin menghalangi, tidak ada pengalaman di sana.
Luc

1
Bahkan aku memberi /bin/ls: no such file or directory. ekspor menunjukkan jalur yang bagus. Tetapi echo / * berfungsi, echo / usr / bin / qemu-arm * daftarkan file. Saya juga me-mount sys, proc, dev
Superbiji

1
Terima kasih telah membantu .. menemukan masalahnya penyebabnya adalah interpreter di binfmt menunjuk ke jalur yang tidak valid
Superbiji

1
ok, entah bagaimana itu diselesaikan dengan menyalin qemu-arm-static ke bla/usr/binbukan bla/bin. Ketika saya menjalankannya which qemu-arm-staticmemberi saya /bin/usrjadi saya kira itu harus konsisten?
dafnahaktana

11

Saya pikir masalahnya adalah bahwa Anda tidak boleh menyalin qemu-armtetapi qemu-arm-static. Ini adalah executable terkompilasi statis yang dapat dijalankan dari dalam chroot tanpa pustaka.

Anda juga dapat melihat /proc/sys/fs/binfmt_miscapakah ada file qemu-arm. Jika tidak me-restart layanan binfmt_support.


Saya harus menjalankan secara manual: update-binfmts --importdir / var / lib / binfmts / --import lalu semuanya muncul di / proc / sys / fs / binfmt_misc dan chroot berfungsi.
Mariano Alvira

7

Agar ini berfungsi, saya menginstal qemu-static-armdan binfmt-supportdari AUR.

Baca komentar untuk qemu-user-static. Saya harus memperbarui PKGBUILDdengan URL unduhan dan hash terbaru agar makepkg selesai.

(Untuk menginstal dari AUR, download tarball, untar, cd, run makepkg -i)

Jawaban Christian Wolf penting. update-binfmtstidak dijalankan dengan benar untuk mengaktifkan format ini. Untuk melakukannya saya berlari:

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

seperti yang dijelaskan dalam halaman manual untuk pembaruan-binfmts. Setelah itu, cat /proc/sys/fs/binfmt_miscakan muncul berbagai binfmts.

Kemudian pastikan untuk menyalin qemu-*-staticke usr/bin/direktori di hal yang Anda ingin chroot dan kemudian chrootharus berfungsi.


6

Anda pasti bisa 'chroot' menjadi sistem file (mount) yang ditujukan untuk arsitektur yang berbeda dan melakukan beberapa pekerjaan yang bermakna, Anda hanya perlu alat yang tepat.

Lihat PRoot, yang merupakan implementasi ruang-pengguna chroot, mount --bind, dan binfmt_misc: https://proot-me.github.io/

Bersama dengan emulator mode pengguna QEMU, Anda siap.

Meskipun Anda biasanya tidak dapat melakukan boot 'penuh' (yaitu memulai init dan layanan), cukup baik untuk menjalankan beberapa binari dari tempat 'alami' mereka, dengan akses ke semua file konfigurasi mereka, termasuk beberapa yang diikat-mount dari sistem 'tuan rumah', dll.


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

Menambahkan ke jawaban Luc: Anda perlu memastikan lokasi juru bahasa sama di chroot seperti di sistem file utama. Ini karena kernel mendeteksi arsitektur yang dapat dieksekusi dan kemudian menggunakan lokasi interpreter seperti yang ditunjukkan oleh update-binfmts --displayuntuk memulai. Jadi intinya

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

seharusnya benar-benar

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

Jika tidak, Anda mungkin mendapatkan "Tidak ditemukan" - kesalahan di dalam chroot Anda karena kernel Anda tidak dapat menemukan penerjemah yang diperlukan, jika lokasi qemu-arm-statictidak ada di dalam /usr/binsistem Anda.


0

Saya baru saja mengalami masalah yang sama di Ubuntu. Saya memang telah binfmtmengkonfigurasi dan qemu-arm-staticmenyalin ke jalur chroot-ed yang sama seperti pada sistem host.

Setelah satu jam, saya melakukan set|grep bashpada mesin host. Saya menemukan bahwa saya memiliki /bin/bashdua variabel env: SHELLdan SUDO_COMMAND. Setelah mengganti variabel, chroot saya ke ARM berfungsi:

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd

0

Saya percaya, untuk OP ini, yang perlu dia lakukan adalah mengkonfigurasi binfmts, cukup dengan menjalankan:

update-binfmts --enable qemu-arm

Setelah menjalankan ini, chroot ke sistem file lengan akan mungkin.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.