如何在arm64架构的Rasberry PI 4上启动docker容器X86?

如何在arm64架构的Rasberry PI 4上启动docker容器X86?

我有 8 GB 内存的 Raspberry PI 4。我有 x86 容器。它可以在 x86/amd64 服务器上正常工作。我想把它移植到树莓派上。它有 Raspberry 团队发布的 ubuntu 22。我读到有 qemu-user-static、kvm ,看起来像 arm64 上的 x86 docker 容器受支持,但我无法得到任何结果。我可以看到我的 Raspberry 支持 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 容器”运行podman(甚至具有相对兼容的 CLI),并且podman支持开箱即用地在虚拟机中运行容器;你所需要的只是一个 x86_64coreOS虚拟机镜像;您将不得不手动调整虚拟机配置,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_machine;这在 Rpi 上可能需要一段时间!

启动成功后,就可以运行自己喜欢的docker容器了;podman run --rm -it fedora:39 uname -a应该拉取一个 Fedora 39 容器(x86_64!),并uname -a在其中运行;完成后,容器将--rm再次被移除( )。

答案2

你就是不能,因为架构不同,这是不可能的。

实现这一目标的两种方法是:

相关内容