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 컨테이너용 런타임입니다.너무 많은, 그것은 나에게 필요하지 않은 많은 일을 수행합니다). 동일한 "도커 컨테이너"를 사용하여 실행할 수 있으며 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

아키텍처가 다르고 불가능하기 때문에 할 수 없습니다.

이를 달성하는 두 가지 방법은 다음과 같습니다.

관련 정보