から出よchroot
うとします。ARM
x86_64
qemu
バイナリをchrootシステムにコピーしてstaticを使用できることがわかりました。
$ 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 で) バイナリを実行できます。 x86(およびx86_64)でARMバイナリを実行すると、「実行形式エラー」が発生します。
さまざまなアーキテクチャのバイナリを実行するには、エミュレータが必要です。 Qemuは素晴らしいオプションですが、使い方を学ぶ必要があります。これには、RootFSを作成し、ARM用のカーネルをコンパイルすることが含まれます。 ARMバイナリ(およびカーネル)をコンパイルするには、ツールチェーンが必要になる場合があります。 1つのことは、chrootメソッドを忘れた場合、x86(x86_64)でARM用にコンパイルされたバイナリを実行できないことです。
編集する: @UrichDangelと数回会話した後、chroot環境に入るにはqemu-userプログラム(この場合はqemu-arm)を使用することが可能でなければならないことに気づきました。 Chrootはホストアーキテクチャ用にコンパイルされたqemu-armを実行する必要があり、その後qemu-armは/ bin / sh(arm用にコンパイル済み)を実行できます。
答え3
アーチに設置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とサービスの起動)を実行することはできませんが、「ホスト」システムの一部を含むすべての設定ファイルにアクセスして、「自然な」場所でいくつかのバイナリを実行するだけで十分です。など。