異なるアーキテクチャのファイルシステムに chroot するにはどうすればよいでしょうか?

異なるアーキテクチャのファイルシステムに chroot するにはどうすればよいでしょうか?

からchrootArch Linux ファイルシステムにインポートしようとしています。ARMx86_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-staticAUR から。

次に、 を chroot したいディレクトリqemu-*-staticにコピーし、次のように動作することを確認します。usr/bin/chrootchroot /mnt qemu-arm-static /bin/bash

答え4

異なるアーキテクチャ用の (マウントされた) ファイルシステムに 'chroot' して、意味のある作業を行うことはほぼ間違いなく可能です。必要なのは適切なツールだけです。

chroot、mount --bind、binfmt_misc のユーザー空間実装である PRoot を見てみましょう。https://proot-me.github.io/

QEMU のユーザー モード エミュレーターと組み合わせれば、準備は完了です。

通常、「完全な」ブート (つまり、init とサービスの起動) を実行することはできませんが、「ホスト」システムなどからバインドマウントされたものも含め、すべての構成ファイルにアクセスして、一部のバイナリを「自然な」場所から実行するには十分です。

関連情報