arm64アーキテクチャを使用してRasberry PI 4でDockerコンテナX86を起動するには?

arm64アーキテクチャを使用してRasberry PI 4でDockerコンテナX86を起動するには?

8GBのRAMを搭載したRaspberry PI 4があります。 x86コンテナがあります。 x86/amd64サーバーではうまく機能します。ラズベリーパイに移植したいです。 Raspberryチームがリリースしたubuntu 22があります。 qemu-user-static、kvmがあることを読んで、arm64のx86 dockerコンテナがサポートされているようですが、結果は得られません.私のラズベリーがkvmをサポートしているのを見ることができます。

    root@ubuntu:/home/ubuntu# virt-host-validate
  QEMU: Checking if device /dev/kvm exists                                   : PASS
  QEMU: Checking if device /dev/kvm is accessible                            : PASS
  QEMU: Checking if device /dev/vhost-net exists                             : PASS
  QEMU: Checking if device /dev/net/tun exists                               : PASS
  QEMU: Checking for cgroup 'cpu' controller support                         : PASS
  QEMU: Checking for cgroup 'cpuacct' controller support                     : PASS
  QEMU: Checking for cgroup 'cpuset' controller support                      : PASS
  QEMU: Checking for cgroup 'memory' controller support                      : PASS
  QEMU: Checking for cgroup 'devices' controller support                     : PASS
  QEMU: Checking for cgroup 'blkio' controller support                       : PASS
  QEMU: Checking for device assignment IOMMU support                         : WARN (Unknown if this platform has IOMMU support)
  QEMU: Checking for secure guest support                                    : WARN (Unknown if this platform has Secure Guest support)
   LXC: Checking for Linux >= 2.6.26                                         : PASS
   LXC: Checking for namespace ipc                                           : PASS
   LXC: Checking for namespace mnt                                           : PASS
   LXC: Checking for namespace pid                                           : PASS
   LXC: Checking for namespace uts                                           : PASS
   LXC: Checking for namespace net                                           : PASS
   LXC: Checking for namespace user                                          : PASS
   LXC: Checking for cgroup 'cpu' controller support                         : PASS
   LXC: Checking for cgroup 'cpuacct' controller support                     : PASS
   LXC: Checking for cgroup 'cpuset' controller support                      : PASS
   LXC: Checking for cgroup 'memory' controller support                      : PASS
   LXC: Checking for cgroup 'devices' controller support                     : PASS
   LXC: Checking for cgroup 'freezer' controller support                     : FAIL (Enable 'freezer' in kernel Kconfig file or mount/enable cgroup controller in your system)
   LXC: Checking for cgroup 'blkio' controller support                       : PASS
   LXC: Checking if device /sys/fs/fuse/connections exists                   : PASS

何か間違っているようですが、この技術は明らかに簡単ではなく、すぐに理解する方法もありません。インターネットには多くの情報がありませんが、他の仕事に関する情報があります。たぶん誰かがこの道を行き、私を正しい方向に押してくれるかもしれません。

だから、通常、コンテナを次のように起動します。

docker run -d --privileged --restart unless-stopped --hostname mycontainer --net=host --name=mycontainer -it mycontainer:v1 /bin/bash /entrypoint.sh

そして、qemu-user-static、qemu-system、および他のすべてのqemuライブラリをインストールした後に起動しますが、機能しません。

次の内容を読みました。次のようにqemuコンテナ内で実行する必要があります。

docker run --rm -it --device=/dev/kvm:/dev/kvm --device=/dev/net/tun:/dev/net/tun     --cap-add NET_ADMIN -v /home/ubuntu/mycontainer_v1.xz:/image jkz0/qemu:latest

次のエラーが発生します。

root@ubuntu:/home/ubuntu# docker run --rm -it     --device=/dev/kvm:/dev/kvm --device=/dev/net/tun:/dev/net/tun     --cap-add NET_ADMIN -v /home/ubuntu/readyImages/adapter2_2.xz:/image     jkz0/qemu:latest
WARNING: The requested image's platform (linux/amd64) does not match the detected host platform (linux/arm64/v8) and no specific platform was requested
udhcpd: started, v1.30.1
udhcpd: max_leases=235 is too big, setting to 1
udhcpd: can't open '/var/lib/misc/udhcpd.leases': No such file or directory
kvm version too old
qemu-system-x86_64: failed to initialize KVM: Function not implemented

以前この問題に対処した人はいますか?新鮮なアイデアが必要です。ありがとう、ドミトリー

答え1

だから私はdockerについてよく知りません。しかし、dockerは「ちょうど」OCIコンテナ用のランタイムです。多すぎる、それは私に必要ではない多くのことを行います)。同じ「Docker Container」を使用して実行することができpodman(相対的に互換性のあるCLIを使用しても)、podmanすぐに仮想マシンでのコンテナの実行をサポートします。必要なのはx86_64だけです。coreOS 仮想マシンイメージ;仮想マシン構成を手動で調整する必要があり、podmanコマンドラインオプションはありません(まだ?)。

必要な小さな準備:qemuがどのマシンをサポートしているかわからないので、実行してニーズにqemu-system-x86_64 -cpu help | grep -v 'alias '合ったマシンを選択してください。ただ使用しますNehalem-v2。以下に示す合理的なマシンに置き換えることができます。

podman machine init \
      --image-path YOUR_DOWNLOADED_FEDORA_COREOS-qemu.x86_64.qcow2.xz_IMAGE \
      x86_64_machine

編集$XDG_CONFIG_HOME/containers/podman/machine/qemu/x86_64_machine.json"CmdLine"プロパティが見つかりました。そのリストの"-cpu"次の行は次のとおりです"host"いいえ欲しいものはここにあります。必要なqemu CPUモデルと交換してください(Nehalem-v2私の場合)。"-accel"それがあることを確かめなさい"kvm"

これで正しく設定されているので、デフォルトで常に使用するようにpodmanを設定します。podman system connection default x86_64_machineこの方法。

仮想マシンを起動します。podman machine start x86_64_machineRpiでは時間がかかることがあります!

正常に起動すると、好みのドッカーコンテナを実行できます。podman run --rm -it fedora:39 uname -aFedora 39コンテナ(x86_64!)をインポートしてuname -a実行する必要があります。完了すると、コンテナは--rm再び削除されます。

答え2

アーキテクチャが異なっていて不可能なのでできません。

これを達成する2つの方法は次のとおりです。

関連情報