Saya mencoba chroot
menjadi ARM
filesystem Arch Linux dari x86_64
.
Saya telah melihat bahwa mungkin menggunakan statis qemu
dengan 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?
binfmt
terlebih 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-static
opsiJawaban:
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).
sumber
binfmt
dan qemu dalam kombinasi untuk menjalankan target yang bukan asli - wiki.debian.org/QemuUserEmulationbinfmt
/qemu-user
solusi persis seperti yang dijelaskan OP, bisa chroot menjadi arm chroot dan menjalankan perintah tanpa perlu membuat rootfs khusus dll.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:
sumber
/bin/ls
pekerjaan? Dalam hal itu,$PATH
variabel Anda tidak disetel atau dikacaukan. Cobaexport 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, sepertiecho /*
kira-kira setara denganls /*
. Saya tidak tahu apakah SELinux mungkin menghalangi, tidak ada pengalaman di sana./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, devbla/usr/bin
bukanbla/bin
. Ketika saya menjalankannyawhich qemu-arm-static
memberi saya/bin/usr
jadi saya kira itu harus konsisten?Saya pikir masalahnya adalah bahwa Anda tidak boleh menyalin
qemu-arm
tetapiqemu-arm-static
. Ini adalah executable terkompilasi statis yang dapat dijalankan dari dalam chroot tanpa pustaka.Anda juga dapat melihat
/proc/sys/fs/binfmt_misc
apakah ada fileqemu-arm
. Jika tidak me-restart layananbinfmt_support
.sumber
Agar ini berfungsi, saya menginstal
qemu-static-arm
danbinfmt-support
dari AUR.Baca komentar untuk
qemu-user-static
. Saya harus memperbaruiPKGBUILD
dengan URL unduhan dan hash terbaru agar makepkg selesai.(Untuk menginstal dari AUR, download tarball,
untar
,cd
, runmakepkg -i
)Jawaban Christian Wolf penting.
update-binfmts
tidak dijalankan dengan benar untuk mengaktifkan format ini. Untuk melakukannya saya berlari:seperti yang dijelaskan dalam halaman manual untuk pembaruan-binfmts. Setelah itu,
cat /proc/sys/fs/binfmt_misc
akan muncul berbagai binfmts.Kemudian pastikan untuk menyalin
qemu-*-static
keusr/bin/
direktori di hal yang Anda ingin chroot dan kemudianchroot
harus berfungsi.sumber
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.
sumber
sumber
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 --display
untuk memulai. Jadi intinyaseharusnya benar-benar
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-static
tidak ada di dalam/usr/bin
sistem Anda.sumber
Saya baru saja mengalami masalah yang sama di Ubuntu. Saya memang telah
binfmt
mengkonfigurasi danqemu-arm-static
menyalin ke jalur chroot-ed yang sama seperti pada sistem host.Setelah satu jam, saya melakukan
set|grep bash
pada mesin host. Saya menemukan bahwa saya memiliki/bin/bash
dua variabel env:SHELL
danSUDO_COMMAND
. Setelah mengganti variabel, chroot saya ke ARM berfungsi:sumber
Saya percaya, untuk OP ini, yang perlu dia lakukan adalah mengkonfigurasi binfmts, cukup dengan menjalankan:
Setelah menjalankan ini, chroot ke sistem file lengan akan mungkin.
sumber