からchroot
Arch Linux ファイルシステムにインポートしようとしています。ARM
x86_64
qemu
バイナリを chroot システムにコピーすることで、静的に実行できることがわかりました。
$ cp /usr/bin/qemu-arm archarm-chroot/usr/bin
しかし、それにもかかわらず、常に次のエラーが発生します。
chroot: failed to run command ‘/bin/bash’: Exec format error
これはアーキテクチャが異なることを意味することはわかっています。何か間違っているのでしょうか?
答え1
私は時々 ARM chroot を使用します。私の携帯電話は 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
答え2
重要:他の回答を見てください。これは古くて不正確な回答です。
異なるアーキテクチャに chroot することはできません。chroot すると、アーキテクチャ上でバイナリ (chroot から) が実行されます。x86 (および x86_64) 上で ARM バイナリを実行すると、「Exec 形式エラー」が発生します。
異なるアーキテクチャのバイナリを実行する場合は、エミュレータが必要です。Qemu はこれに適していますが、使用方法を学ぶ必要があります。これには、RootFS の作成と ARM 用のカーネルのコンパイルが含まれます。おそらく、ARM バイナリ (およびカーネル) をコンパイルするためのツールチェーンが必要になります。1 つ確かなことは、chroot メソッドを忘れてください。ARM 用にコンパイルされたバイナリを x86 (x86_64) で実行することはできません。
編集: @UrichDangel との雑談の後、qemu-user プログラム (この場合は qemu-arm) で chroot 環境に入ることができるはずだと気付きました。chroot はホスト アーキテクチャ用にコンパイルされた qemu-arm を実行する必要があり、その後 qemu-arm は /bin/sh (arm 用にコンパイル) を実行できます。
答え3
Archでインストールqemu-user-static
そしてbinfmt-qemu-static
AUR から。
次に、 を chroot したいディレクトリqemu-*-static
にコピーし、次のように動作することを確認します。usr/bin/
chroot
chroot /mnt qemu-arm-static /bin/bash
答え4
異なるアーキテクチャ用の (マウントされた) ファイルシステムに 'chroot' して、意味のある作業を行うことはほぼ間違いなく可能です。必要なのは適切なツールだけです。
chroot、mount --bind、binfmt_misc のユーザー空間実装である PRoot を見てみましょう。https://proot-me.github.io/
QEMU のユーザー モード エミュレーターと組み合わせれば、準備は完了です。
通常、「完全な」ブート (つまり、init とサービスの起動) を実行することはできませんが、「ホスト」システムなどからバインドマウントされたものも含め、すべての構成ファイルにアクセスして、一部のバイナリを「自然な」場所から実行するには十分です。