我有 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
你就是不能,因为架构不同,这是不可能的。
实现这一目标的两种方法是:
如评论中所述重建容器。 https://www.padok.fr/en/blog/docker-arm-architectures https://www.docker.com/blog/faster-multi-platform-builds-dockerfile-cross-compilation-guide/ 即使您的容器来自“真实服务器”,重建它也应该很容易。这就是 docker 诞生的原因。
从具有 x86/amd64 模拟的虚拟机运行 docker。但恐怕没有办法轻松做到这一点,甚至根本无法从手臂机器上做到这一点