LXDを使用して、ubuntu 16.04を実行しているAMD64ホストからのbootstrapシステムに展開するためのルートファイルシステムをARMします。以前は、スクリプトとchroot
コマンドを使用してこれを実行しましたが、使用していたスクリプトはエラーが発生しやすく、/ devエントリを削除するという悪い癖がありました。
lxc image copy images:ubuntu/16.04/arm64 --alias=ubuntu-server-arm64
を使用してイメージをローカルにコピーし、qemu-user-staticをインストールしましたが、このイメージからコンテナーを実際に起動することはできません。次のエラーが表示されます。
$ lxc launch ubuntu-server-arm64 bootstrap
Creating bootstrap
error: Requested architecture isn't supported by this Host
Lxdにアーキテクチャの不一致を無視させ、qemu-user-static
を使用して子コンテナを実行させる方法はありますか?
LXC/LXDプロジェクトを担当しているStephane Graber氏( discussions site についての私からの問い合わせに応じて):
qemu-user-staticは、アーキテクチャ間のオンザフライ変換を可能にするbinfmtヘルパーです。これにより、現在のアーキテクチャ以外のアーキテクチャのバイナリを効果的に実行できます。
qemu-user-static自体はコンテナ内で正常に動作するはずであり、コンテナ内で外部アーキテクチャのバイナリを実行できます。
Qemu-user-staticを使用してコンテナ全体を実行しようとすると、qemu-user-staticの大きな制限があるため、たとえばptrace(初期システムとデバッグツール)、netlink(すべてのネットワークツール、一部のinitシステム)またはスレッド(より多くのソフトウェア)は通常、惨めに失敗します。
LXCに戻って実装したアプローチは、ほとんどのパッケージが外部アーキテクチャで、initシステム、ネットワークツールなどがネイティブアーキテクチャである混合コンテナを作成することでした。これはちょっとした作業でしたが、非常に遅いことは言うまでもなく、特に有用でもありませんでした。
これは実質的にサポートできないため、LXDの外部アーキテクチャイメージは提供していません。ただし、外部アーキテクチャのrootfsをアセンブルし、必要なqemu-user-staticバイナリを含めて独自のビルドを行い、エミュレーションで動作しないバイナリを置き換えて、これをLXDイメージとして生成します(意図したアーキテクチャでマークします)含まれているアーキテクチャではなく実行する)。
したがって、事実上、LXDで外部アーキテクチャを実行しようとすることはサポートされておらず、LXCメソッドは多かれ少なかれ「混合環境」タイプのハックでした。
それもできるように思えますが、外国のアーキテクチャのrootfsを作成し、これをすべて実行する「イメージ」を基本的に作成する必要があります。これはさまざまな理由で頭痛と達成するための多くの作業になる可能性があります。