アーキテクチャが別のファイルシステムにルートを変更する方法は?

アーキテクチャが別のファイルシステムにルートを変更する方法は?

から出よchrootうとします。ARMx86_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-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とサービスの起動)を実行することはできませんが、「ホスト」システムの一部を含むすべての設定ファイルにアクセスして、「自然な」場所でいくつかのバイナリを実行するだけで十分です。など。

関連情報