web-dev-qa-db-ja.com

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

x86_64からArch Linux chrootファイルシステムにARMを挿入しようとしています。

バイナリーをchrootシステムにコピーすることで、静的qemuを使用して実行できることがわかりました。

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

しかし、これにもかかわらず、常に次のエラーが発生します。

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

これは、アーキテクチャが異なることを意味します。私は何か間違ったことをしていますか?

39
Jivings

重要:他の回答をご覧ください。これは古くて不正確な答えです。

別のアーキテクチャにchrootすることはできません。 chrootすることで、アーキテクチャでバイナリを(chrootから)実行します。 ARMバイナリをx86(さらに言えばx86_64)で実行すると、「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用にコンパイルされた)を実行できます。

15
0xAF

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
36
Luc

問題はコピーしてはいけないことだと思いますqemu-arm だが qemu-arm-static。これは、ライブラリなしでchroot内から実行できる静的にコンパイルされた実行可能ファイルです。

/proc/sys/fs/binfmt_miscファイルが存在する場合qemu-arm。サービスを再起動しない場合binfmt_support

11
Christian Wolf

これを機能させるために、AURから qemu-static-arm および binfmt-support をインストールしました。

qemu-user-staticのコメントを読んでください。 makepkgを完了するには、PKGBUILDを最新のダウンロードURLとハッシュで更新する必要がありました。

(AURからインストールするには、tarballをダウンロードし、untarcdを実行し、makepkg -iを実行します)

クリスチャンウルフの答えは重要です。 update-binfmtsは、これらの形式を有効にするために適切に実行されていません。そうするために私は走った:

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

update-binfmtsのマンページで説明されています。その後、cat /proc/sys/fs/binfmt_miscはさまざまなbinfmtsを表示します。

次に、qemu-*-staticをchroot先のusr/bin/ディレクトリにコピーしてください。そうすると、chrootが機能するはずです。

7
Mariano Alvira

間違いなく、異なるアーキテクチャ向けの(マウントされた)ファイルシステムに「chroot」して、意味のある作業を行うことができます。適切なツールが必要です。

Chroot、mount --bind、およびbinfmt_miscのユーザー空間実装であるPRootを見てください。 https://proot-me.github.io/

QEMUのユーザーモードエミュレーターと一緒に、すべての準備が整いました。

通常、「フル」ブート(つまり、initとサービスの開始)を実行することはできませんが、「自然」な場所からいくつかのバイナリを実行し、すべての構成ファイルにアクセスして、 「ホスト」システムなど.

6
ack
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 
2

Lucの答えに追加してください。インタープリターの場所が、メインファイルシステム内と同じようにchroot内で同じであることを確認する必要があります。これは、カーネルが実行可能ファイルのアーキテクチャを検出し、update-binfmts --displayで示されるインタープリタの場所を使用して起動するためです。だから行

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

実際に

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

そうしないと、qemu-arm-staticの場所がシステムの/usr/bin内にない場合、カーネルが必要なインタープリターを見つけられないため、chroot内で「見つかりません」エラーが発生する可能性があります。

1
Marten Jacobs

Ubuntuで同じ問題が発生しました。私はbinfmtを設定し、qemu-arm-staticは、ホストシステムと同じchrootされたパスにコピーされます。

1時間後、私はset|grep bashホストマシン上。私は/bin/bash 2つの環境変数:ShellおよびSudo_COMMAND。変数を置き換えた後、ARMへのchrootが機能しました:

Shell=/bin/sh Sudo_COMMAND=/bin/sh chroot hd
0

このOPで彼がする必要があるのは、単に次のコマンドを実行してbinfmtsを構成することだけだと思います。

update-binfmts --enable qemu-arm

これを実行した後、chrootをarmファイルシステムに入れることが可能でした。

0
user175914