Farklı bir mimariye sahip bir dosya sistemine nasıl girebilirim?


38

chrootArch Linux ARMdosya sistemine girmeye çalışıyorum x86_64.

qemuİkiliyi chroot sistemine kopyalayarak statik kullanarak yapmanın mümkün olduğunu gördüm :

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

Ancak buna rağmen her zaman aşağıdaki hatayı alıyorum:

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

Bunun mimarilerin farklı olduğu anlamına geldiğini biliyorum. Yanlış bir şey mi yapıyorum?


2
binfmtİlk önce yapılandırmanız gerekir, sessiz bir kısa tanıtım için wiki.debian.org/QemuUserEmulation adresini ziyaret edin. Binfmt_misc'i yapılandırmak için bir örnek svn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh adresinde bulunabilir
Ulrich Dangel

Qemu statik paketleri, Arch veri havuzlarında görünmüyor.
Jivings,

2
Üzgünüm arch kullanmıyorum, ama muhtemelen -staticlinker seçeneklerine ekleyerek statik qemu paketi
oluşturabiliyor olmalısın

Yanıtlar:


15

Farklı bir mimariye giremezsiniz. Chrooting yaparak, mimarınızdaki ikili dosyaları (chroot'tan) yürütüyorsunuz. ARM ikili dosyalarının x86'da (ve bu konuda x86_64) çalıştırılması "Exec format error" ile sonuçlanacaktır.

İkili dosyaları farklı mimariden çalıştırmak istiyorsanız, bir Emülatöre ihtiyacınız olacaktır. Qemu bunun için iyi bir aday, ancak nasıl kullanılacağını öğrenmen gerekecek. Bu, RootFS oluşturmayı ve ARM için bir çekirdeği derlemeyi içerir. Belki de ARM ikili dosyalarını (ve çekirdeği) derlemek için bir alet zincirine ihtiyacınız olacak. Kesin olan bir şey var: chroot yöntemini unutun, x86 (x86_64) 'te ARM için derlenmiş ikilileri çalıştıramazsınız.

Düzenleme: @UrichDangel ile yapılan küçük konuşmadan sonra, chemot ortamına qemu kullanıcı programlarıyla (bu durumda qemu-kol) girmenin mümkün olduğunu anladım. Chroot, ana bilgisayar mimariniz için derlenmiş qemu-arm'u çalıştırıyor olmalı, ardından qemu-arm / bin / sh komutunu çalıştırabilir (kol için derlenmiş).


6
binfmtYerli olmayan hedefleri çalıştırmak için bir arada kullanabilmeniz ve qemu kullanabilmeniz gerekir - wiki.debian.org/QemuUserEmulation
Ulrich Dangel

2
Qemu'nun öykünme için nasıl kullanılacağını biliyorum. Görünüşe göre chroot ile kullanabilirsin, ama açıkça nasıl çalışamayacağımı.
Jivings,

@UlrichDangel, Evet, bu iyi bir bilgi. Ancak OP'nin bu çözüm kralı için aramadığını düşünüyorum. binfmt, qemu'yu qemu-kol emülasyonu ile doğru bir şekilde kurduktan sonra mümkün olacaktı, ama ben onun qemu-sistem koluna ihtiyaç duyacağı ARM emülasyon ortamına (örneğin Raspberry Pi) girmek istediğine inanıyorum.
0xAF,

@ 0xAF ancak binfmt/ qemu-userçözümü, OP'nin tanımladığı şeydir, bir kol
chrootu

1
@UlrichDangel, şimdi bir saniye sonra, haklı olduğuna inanıyorum. Qemu-kol ile öykünülmüş chroot'a girmek mümkündür (veya olmalıdır). Bu konuda yorumumu düzenleyeceğim.
0xAF

33

Zaman zaman bir ARM chroot kullanıyorum: telefonum Linux Deploy kullanıyor ve görüntü şimdi ve sonra ölüyor. Daha sonra bilgisayarıma kopyalarım ve durumu şöyle chroot ile incelerim:

# 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

Bu çalışır, ancak chroot komutundan sonra tüm komut böyle bir dosya veya dizin vermez. Fedora 24, selinux sorunu kullanıyorum? Lütfen yardıma mı ihtiyacınız var
Superbiji 5:16

@ Superbiji çalışan /bin/lsçalışıyor mu? Bu durumda, $PATHdeğişkeniniz bozuk veya bozuktur. Dene export PATH=/sbin:/usr/sbin:/usr/bin:/bin. Eklemeniz gereken başka yollar olabilir, ancak bu muhtemelen iyi bir başlangıçtır. Bu işe yaramazsa, muhtemelen ikili dosyaları chroot ortamına kopyalamayı unutmuşsunuzdur. Sen gibi çok dosya sistemini dolaşabilirsiz bash kullanabilirsiniz echo /*denk düşüyor ls /*. SELinux’un bu duruma girip girmeyeceğini bilmiyorum, orada deneyim yok.
Luc,

1
Hatta bile verir /bin/ls: no such file or directory. ihracat iyi yol gösterir. Fakat echo / * çalışıyor, echo / usr / bin / qemu-arm * dosyayı listeler. Ayrıca sys, proc, dev
dağıttım

1
Yardımın için teşekkürler .. sorunu bulundu neden binfmt noktasında tercüman geçersiz yoludur
Superbiji

1
Tamam, bir şekilde qemu-arm-static bla/usr/binyerine kopyalayarak çözüldü bla/bin. Koştuğum zaman which qemu-arm-staticbana veriyor, /bin/usrsanırım tutarlı olmalı?
dafnahaktana

10

Sorunun kopyalamak gerektiğini düşünüyorum qemu-armama qemu-arm-static. Bu, herhangi bir kitaplık olmadan chroot içinden çalıştırılabilen statik bir derlenmiş çalıştırılabilir dosyadır.

/proc/sys/fs/binfmt_miscBir dosya olup olmadığına da bakabilirsiniz qemu-arm. Değilse servisi yeniden başlatın binfmt_support.


El ile çalıştırmak zorundaydım: update-binfmts --importdir / var / lib / binfmts / --import sonra her şey / proc / sys / fs / binfmt_misc içinde görünüyor ve chroot çalışıyor.
Mariano Alvira

7

Yüklü çalışma I Bu almak için qemu-static-armve binfmt-supportAUR.

İçin yorumları okuyun qemu-user-static. PKGBUILDMakepkg için bitirmek için en son indirme URL'sini ve karma değerlerini güncellemek zorunda kaldım .

(Arşivini indirecek, AUR yüklemek için untar, cd, run makepkg -i)

Christian Wolf'un cevabı önemlidir. update-binfmtsbu formatları etkinleştirmek için doğru şekilde yürütülmez. Bunu yapmak için koştum:

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

update-binfmts kılavuzunda açıklandığı gibi. Bundan sonra cat /proc/sys/fs/binfmt_misc, çeşitli binfmts gösterecektir.

Sonra kopyalamak emin qemu-*-staticiçin usr/bin/chroot istediğiniz şey dizin ve sonra chrootçalışması gerekir.


6

Kesinlikle farklı bir mimari için tasarlanmış (monte edilmiş) bir dosya sistemine 'chroot' yapabilir ve anlamlı işler yapabilirsiniz, sadece doğru araçlara ihtiyacınız vardır.

Chroot, mount --bind ve binfmt_misc kullanıcı alanı uygulaması olan PRoot'a bir göz atın: https://proot-me.github.io/

QEMU'nun kullanıcı modu emülatörleri ile birlikte, hepiniz hazırsınız.

Genellikle 'tam' bir önyükleme gerçekleştiremiyor olsanız da (örneğin, init ve servisleri başlatırken), bazı ikilileri 'doğal' konumlarından çalıştırmak yeterlidir; 'ev sahibi' sistemi vb.


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

Luc'un cevabına ekleme: tercüman konumunun ana dosya sisteminde olduğu gibi chroot ile aynı olduğundan emin olmanız gerekir. Bunun nedeni çekirdeğin çalıştırılabilir bir yapının mimarisini algılaması ve daha sonra update-binfmts --displaybaşlatmak için gösterildiği gibi yorumlayıcının konumunu kullanmasıdır . Yani çizgi

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

aslında olmalı

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

Sizin çekirdek gerekli tercüman bulamıyorum olarak yer Aksi takdirde, siz, chroot içindeki-hataları "Bulunamadı" alabilirsiniz qemu-arm-staticiçinde değil /usr/binsisteminizde.


0

Ubuntu'da da aynı konuya girdim. Ben var ki binfmtyapılandırılmış ve qemu-arm-staticana sistemdeki aynı chroot-ed yoluna kopyalandı.

Bir saat sonra bir set|grep bashana makinede yaptım . /bin/bashİki env değişkeninde olduğumu öğrendim : SHELLve SUDO_COMMAND. Değişkenleri değiştirdikten sonra chroot'tan ARM'e çalıştı:

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

0

Bu OP için yapması gereken tek şey sadece çalıştırarak binfmts'i yapılandırmak olduğuna inanıyorum:

update-binfmts --enable qemu-arm

Bunu çalıştırdıktan sonra, kol dosya sistemi içine chroot yapmak mümkün olurdu.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.