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
これは、アーキテクチャが異なることを意味します。私は何か間違ったことをしていますか?
別のアーキテクチャに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用にコンパイルされた)を実行できます。
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
問題はコピーしてはいけないことだと思いますqemu-arm
だが qemu-arm-static
。これは、ライブラリなしでchroot内から実行できる静的にコンパイルされた実行可能ファイルです。
/proc/sys/fs/binfmt_misc
ファイルが存在する場合qemu-arm
。サービスを再起動しない場合binfmt_support
。
これを機能させるために、AURから qemu-static-arm
および binfmt-support
をインストールしました。
qemu-user-static
のコメントを読んでください。 makepkgを完了するには、PKGBUILD
を最新のダウンロードURLとハッシュで更新する必要がありました。
(AURからインストールするには、tarballをダウンロードし、untar
、cd
を実行し、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
が機能するはずです。
間違いなく、異なるアーキテクチャ向けの(マウントされた)ファイルシステムに「chroot」して、意味のある作業を行うことができます。適切なツールが必要です。
Chroot、mount --bind、およびbinfmt_miscのユーザー空間実装であるPRootを見てください。 https://proot-me.github.io/
QEMUのユーザーモードエミュレーターと一緒に、すべての準備が整いました。
通常、「フル」ブート(つまり、initとサービスの開始)を実行することはできませんが、「自然」な場所からいくつかのバイナリを実行し、すべての構成ファイルにアクセスして、 「ホスト」システムなど.
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
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内で「見つかりません」エラーが発生する可能性があります。
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
このOPで彼がする必要があるのは、単に次のコマンドを実行してbinfmtsを構成することだけだと思います。
update-binfmts --enable qemu-arm
これを実行した後、chrootをarmファイルシステムに入れることが可能でした。