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_machine
Rpi에서는 시간이 좀 걸릴 수 있습니다!
성공적으로 시작되면 선호하는 도커 컨테이너를 실행할 수 있습니다. 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/ 컨테이너가 "실제 서버"에서 가져온 경우에도 쉽게 재구축할 수 있습니다. 도커가 탄생한 이유다.
x86/amd64 에뮬레이션을 사용하여 가상 머신에서 docker를 실행합니다. 하지만 유감스럽게도 이 작업을 쉽게 수행할 수 있는 방법이 전혀 없습니다. 암 머신에서도 전혀 수행할 수 없습니다.