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


38

からchrootArch Linux 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

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


2
binfmt最初に設定する必要があります。静かな短い紹介のためにwiki.debian.org/QemuUserEmulationを見てください。binfmt_miscを設定するための例はで見つけることができますsvn.kju-app.org/trunk/qemu/qemu/qemu-binfmt-conf.sh
ウルリッヒDangel

Qemu静的パッケージはArchリポジトリにないようです。
-Jivings

2
申し訳ありませんが、私はアーチ使いませんが、あなたはおそらく追加することにより、静的QEMUパッケージを構築することができるはず-staticリンカオプションに
ウルリッヒDangel

回答:


15

異なるアーキテクチャにchrootできません。chrootすることにより、アーキテクチャ上で(chrootから)バイナリを実行します。x86(およびその点でx86_64)でARMバイナリを実行すると、「Exec format error」が発生します。

異なるアーキテクチャのバイナリを実行する場合は、エミュレーターが必要です。Qemuはこれに適した候補ですが、使用方法を学ぶ必要があります。これには、RootFSの作成とARM用のカーネルのコンパイルが含まれます。おそらくARMバイナリ(およびカーネル)をコンパイルするためのツールチェーンが必要になります。1つ確かなことは、chrootメソッドを忘れて、x86(x86_64)でARM用にコンパイルされたバイナリを実行できないことです。

編集: @UrichDangelとのちょっとした話の後、qemu-userプログラム(この場合はqemu-arm)でchroot環境に入ることができるはずだと気付きました。Chrootはホストアーキテクチャ用にコンパイルされたqemu-armを実行している必要があります。その後、qemu-armは/ bin / sh(arm用にコンパイル済み)を実行できます。


6
binfmt非ネイティブターゲットを実行するには、qemuと組み合わせて使用できるはずです-wiki.debian.org/QemuUserEmulation
Ulrich Dangel

2
Qemuをエミュレーションに使用する方法を知っています。どうやらあなたはchrootでそれを使うことができるようですが、どうやったら解決できないのでしょうか。
Jivings

@UlrichDangel、はい、これは良い情報です。しかし、私はOPがこの解決策の王を探していなかったと思う binfmtはqemuをqemu-armエミュレーションで適切にインストールすると可能になりますが、qemu-system-armが必要なARMエミュレーション環境(Raspberry Piなど)に参入したいと考えています。
0xAF

0xAFしかし@ binfmt/のqemu-userソリューション、OPを説明し、正確に何であるアームchroot環境内にchroot環境にできることとなど専用にrootfsを構築することなく、コマンドを実行します
ウルリッヒ・Dangel

1
@UlrichDangel、しかし今すぐに、私はあなたが正しいと信じています。qemu-armを使用して、エミュレートされたchrootを入力することができます(またはする必要があります)。コメントを編集します。
-0xAF

33

私は時々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

これは動作しますが、chrootの後、すべてのコマンドはそのようなファイルまたはディレクトリを提供しません。Fedora 24を使用していますが、selinuxの問題ですか?助けてください
Superbiji

@Superbiji実行/bin/ls中ですか?その場合、$PATH変数は設定されていないか文字化けしています。試してくださいexport PATH=/sbin:/usr/sbin:/usr/bin:/bin。追加する必要がある他のパスがあるかもしれませんが、これはおそらく良い出発点です。それでもうまくいかない場合は、おそらくバイナリをchroot環境にコピーするのを忘れていたでしょう。echo /*ほぼに相当するように、bashを使用してファイルシステム内をブラウズすることもできますls /*。SELinuxが邪魔になるかどうかはわかりませんが、経験はありません。
リュック

1
lsでさえも/bin/ls: no such file or directory。エクスポートは良好なパスを示しています。ただし、echo / *は機能しています。echo/ usr / bin / qemu-arm *はファイルをリストします。sys、proc、devもマウントしています
-Superbiji

1
助けてくれてありがとう..原因が無効なパスを指すbinfmtのインタープリターである問題を発見した
-Superbiji

1
わかりました、どういうわけかqemu-arm-staticをのbla/usr/bin代わりににコピーすることで解決しましたbla/bin。実行するwhich qemu-arm-staticとそれが私に与える/bin/usrので、私はそれが一貫しているべきだと思いますか?
ダフナハクタナ

10

問題はコピーするべきではないと思うqemu-armqemu-arm-static。これは、ライブラリなしでchroot内から実行できる静的コンパイル済み実行可能ファイルです。

/proc/sys/fs/binfmt_miscファイルが存在するかどうかを調べることもできますqemu-arm。サービスを再起動しない場合binfmt_support


手動で実行する必要がありました:update-binfmts --importdir / var / lib / binfmts / --importその後、すべてが/ proc / sys / fs / binfmt_miscに表示され、chrootが機能します。
マリアーノアルビラ

7

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

のコメントを読んでくださいqemu-user-static。私は更新しなければならなかったPKGBUILD仕上がりにmakepkgの最新のダウンロードURLとハッシュと。

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

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

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

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

その後、必ずchrootしたいものqemu-*-staticusr/bin/ディレクトリにをコピーしてchrootください。そうすれば動作するはずです。


6

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

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

QEMUのユーザーモードエミュレーターを使用すると、設定は完了です。

通常、「フル」ブート(つまり、initおよびサービスの開始)を実行することはできませんが、「自然な」場所からいくつかのバイナリを実行し、すべての設定ファイル(バインドマウントされたものを含む) 「ホスト」システムなど



1

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内で「見つかりません」エラーが発生する可能性があります。


0

Ubuntuで同じ問題に遭遇しました。私が持っていたbinfmtように構成し、qemu-arm-staticホストシステム上の同じのchroot-EDのパスにコピー。

1時間後、set|grep bashホストマシンで実行しました。/bin/bash2つのenv変数にあることがわかりました:SHELLSUDO_COMMAND。変数を置き換えた後、ARMへのchrootが機能しました:

SHELL=/bin/sh SUDO_COMMAND=/bin/sh chroot hd

0

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

update-binfmts --enable qemu-arm

これを実行すると、armファイルシステムへのchrootが可能になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.