diff --git a/Makefile b/Makefile index f49d789b..5c5fe521 100644 --- a/Makefile +++ b/Makefile @@ -6,6 +6,8 @@ DOCKER_PREFIX := ${LIB_NAME} DOCKER_TAG := ${DOCKER_PREFIX}-yocto-builder DOCKER_SUSE_TAG := ${DOCKER_PREFIX}-open-suse-env DOCKER_PYTHON_TAG := ${DOCKER_PREFIX}-analyzer +DOCKER_YOCTO_VM_TAG := ${DOCKER_PREFIX}-yocto-vm +DOCKER_SUSE_VM_TAG := ${DOCKER_PREFIX}-suse-vm DOCKER_BUILD_VOLUME := ${DOCKER_PREFIX}-yocto-build DOCKER_DOWNLOADS_VOLUME := ${DOCKER_PREFIX}-yocto-downloads DOCKER_SSTATE_VOLUME := ${DOCKER_PREFIX}-yocto-sstate diff --git a/docker/compose.yml b/docker/compose.yml index a7f1a374..9f5e06f8 100644 --- a/docker/compose.yml +++ b/docker/compose.yml @@ -23,7 +23,34 @@ services: BUILD_DIR: ${BUILD_DIR} POKY_DIR: ${POKY_DIR} OS_IMAGE: ${OS_IMAGE} - VM_RAM: ${QEMU_VM_RAM} + USER: ${USER} + GROUP: ${GROUP} + + imgtests-yocto-vm: + build: + dockerfile: docker/vm-yocto.dockerfile + args: + USER: ${USER} + GROUP: ${GROUP} + PASSWORD: ${PASSWORD} + POKY_DIR: ${POKY_DIR} + image: ${DOCKER_YOCTO_VM_TAG} + privileged: true + devices: + - /dev/kvm + volumes: + - ${DOCKER_BUILD_VOLUME}:${BUILD_DIR} + - ${DOCKER_DOWNLOADS_VOLUME}:${POKY_DIR}/downloads + - ${DOCKER_SSTATE_VOLUME}:${POKY_DIR}/sstate-cache + - ${HOST_CONF_PATH}/local.conf:${BUILD_DIR}/conf/local.conf + - ${HOST_CONF_PATH}/packages.conf:${BUILD_DIR}/conf/packages.conf + - ${HOST_CONF_PATH}/added_packages.conf:${BUILD_DIR}/conf/added_packages.conf + - ${HOST_LAYERS_PATH}/meta-image-tests:${POKY_DIR}/meta-image-tests + - ${HOST_SCRIPTS_PATH}/add-layers.sh:${POKY_DIR}/add-layers.sh + environment: + BUILD_DIR: ${BUILD_DIR} + POKY_DIR: ${POKY_DIR} + OS_IMAGE: ${OS_IMAGE} CPUS: ${CPUS} USER: ${USER} GROUP: ${GROUP} @@ -37,6 +64,9 @@ services: networks: yocto-network: ipv4_address: ${YOCTO_ADDRESS} + depends_on: + imgtests-yocto: + condition: service_completed_successfully imgtests-suse-156: build: @@ -51,13 +81,28 @@ services: environment: S_USER: ${S_USER} PASSWORD: ${PASSWORD} - VM_RAM: ${QEMU_VM_RAM} - CPUS: ${CPUS} + networks: + - yocto-network + + imgtests-suse-vm: + build: + dockerfile: docker/vm-suse.dockerfile + args: + USER: ${USER} + image: ${DOCKER_SUSE_VM_TAG} + privileged: true + devices: + - /dev/kvm + volumes: + - ${DOCKER_OPENSUSE_VOLUME}:${SUSE_DIR} + environment: SSH_QEMU_PORT: ${SSH_TO_QEMU_PORT} SSH_SUSE_PORT: ${SSH_SUSE_PORT_156} SUSE_NE_PORT: ${SUSE_156_NE_PORT} DEFAULT_NE_PORT: ${DEFAULT_NE_PORT} IPERF3_PORT: ${IPERF3_PORT} + VM_RAM: ${QEMU_VM_RAM} + CPUS: ${CPUS} ports: - ${SSH_SUSE_PORT_156}:${SSH_SUSE_PORT_156} networks: diff --git a/docker/image_builder.dockerfile b/docker/image_builder.dockerfile index e4df2346..dee15e62 100644 --- a/docker/image_builder.dockerfile +++ b/docker/image_builder.dockerfile @@ -30,12 +30,14 @@ RUN groupadd -g 510 ${GROUP} && \ echo "${USER}:${PASSWORD}" | chpasswd USER ${USER} + RUN mkdir --parents ${POKY_DIR} && \ git clone --depth 1 -b walnascar --recurse-submodules https://git.yoctoproject.org/poky ${POKY_DIR} + WORKDIR ${POKY_DIR} COPY --chown=${USER}:${GROUP} layers ${POKY_DIR} -COPY --chown=${USER}:${GROUP} scripts/entrypoint.sh ${POKY_DIR}/ -COPY --chown=${USER}:${GROUP} scripts/cmd_yocto.sh ${POKY_DIR}/ +COPY --chown=${USER}:${GROUP} scripts/entrypoint.sh ${POKY_DIR} +COPY --chown=${USER}:${GROUP} scripts/cmd_yocto.sh ${POKY_DIR} ENTRYPOINT ["/home/user/poky/entrypoint.sh"] diff --git a/docker/open-suse.dockerfile b/docker/open-suse.dockerfile index 189d9519..ac93fdac 100644 --- a/docker/open-suse.dockerfile +++ b/docker/open-suse.dockerfile @@ -7,9 +7,6 @@ ENV DEBIAN_FRONTEND=noninteractive \ RUN apt-get update && \ apt-get install -y --no-install-recommends \ - qemu-system \ - qemu-utils \ - qemu-user-static \ cloud-init \ cloud-image-utils \ wget \ diff --git a/docker/vm-suse.dockerfile b/docker/vm-suse.dockerfile new file mode 100644 index 00000000..d6843278 --- /dev/null +++ b/docker/vm-suse.dockerfile @@ -0,0 +1,19 @@ +FROM ubuntu:24.04 + +ARG USER + +ENV DEBIAN_FRONTEND=noninteractive \ + SUSE_DIR=/home/${USER}/suse + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + qemu-system \ + qemu-utils \ + qemu-user-static + +WORKDIR ${SUSE_DIR} + +COPY scripts/opensuse/start-vm.sh /start-vm.sh +RUN chmod +x /start-vm.sh + +ENTRYPOINT ["/start-vm.sh"] diff --git a/docker/vm-yocto.dockerfile b/docker/vm-yocto.dockerfile new file mode 100644 index 00000000..5fd0be70 --- /dev/null +++ b/docker/vm-yocto.dockerfile @@ -0,0 +1,38 @@ +FROM ubuntu:22.04 + +ARG USER +ARG GROUP +ARG PASSWORD +ARG POKY_DIR + +ENV DEBIAN_FRONTEND=noninteractive \ + LANG=en_US.UTF-8 + +RUN apt-get update && \ + apt-get install -y --no-install-recommends \ + sudo wget git locales chrpath cpio diffstat gawk \ + zstd liblz4-tool python3 python3-pip tar gcc make \ + bzip2 file g++ patch python3-pexpect python3-git \ + python3-jinja2 python3-subunit screen \ + libtirpc-dev libtirpc3 pkg-config \ + qemu qemu-system-x86 qemu-utils \ + openssh-server && \ + rm -rf /var/lib/apt/lists/* && \ + locale-gen en_US.UTF-8 + +RUN groupadd -g 510 ${GROUP} && \ + groupadd -g 993 kvm && \ + useradd -rm -d /home/${USER} -s /bin/bash -g ${GROUP} -u 1010 -G sudo,kvm ${USER} && \ + echo "${USER} ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/${USER} && \ + echo "${USER}:${PASSWORD}" | chpasswd + +USER ${USER} + +RUN git clone --depth 1 -b walnascar --recurse-submodules https://git.yoctoproject.org/poky ${POKY_DIR} + +WORKDIR ${POKY_DIR} + +COPY --chown=${USER}:${GROUP} layers ${POKY_DIR} +COPY --chown=${USER}:${GROUP} scripts/start-vm-yocto.sh ${POKY_DIR} + +ENTRYPOINT ["/home/user/poky/start-vm-yocto.sh"] diff --git a/scripts/cmd_yocto.sh b/scripts/cmd_yocto.sh index 970e2dff..767e454c 100755 --- a/scripts/cmd_yocto.sh +++ b/scripts/cmd_yocto.sh @@ -5,7 +5,3 @@ set -e cd "${POKY_DIR}" ./add-layers.sh bitbake "${OS_IMAGE}" -ROOTFS_IMAGE="${POKY_DIR}/build/tmp/deploy/images/qemux86-64/${OS_IMAGE}-qemux86-64.rootfs.ext4.qcow2" - -QB_SLIRP_OPT="-netdev user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::${SSH_QEMU_PORT}-:${SSH_TO_QEMU_PORT},hostfwd=tcp::${YOCTO_NE_PORT}-:${DEFAULT_NE_PORT},hostfwd=tcp:0.0.0.0:${IPERF3_PORT}-:${IPERF3_PORT},hostfwd=udp:0.0.0.0:${IPERF3_PORT}-:${IPERF3_PORT}" \ - runqemu qemux86-64 slirp nographic "${ROOTFS_IMAGE}" qemuparams="-monitor tcp:0.0.0.0:4444,server,nowait -smp ${CPUS}" diff --git a/scripts/opensuse/start-vm.sh b/scripts/opensuse/start-vm.sh new file mode 100755 index 00000000..5e942a22 --- /dev/null +++ b/scripts/opensuse/start-vm.sh @@ -0,0 +1,20 @@ +#!/bin/bash + +set -e + +cd "${SUSE_DIR}" + +echo "Waiting for OpenSUSE image to be ready..." +while true; do + for img in open-suse-*.ready.qcow2; do + [ -f "$img" ] && IMAGE="$img" && break 2 + done + sleep 10 +done + +exec qemu-system-x86_64 -enable-kvm -m "${VM_RAM}" -smp "${CPUS}" -nographic \ + -monitor tcp:0.0.0.0:4444,server,nowait \ + -drive file="$IMAGE",index=0,media=disk \ + -cdrom cloud-init.iso \ + -net user,hostfwd=tcp::"${SSH_SUSE_PORT}"-:"${SSH_QEMU_PORT}",hostfwd=tcp::"${SUSE_NE_PORT}"-:"${DEFAULT_NE_PORT}",hostfwd=tcp:0.0.0.0:"${IPERF3_PORT}"-:"${IPERF3_PORT}",hostfwd=udp:0.0.0.0:"${IPERF3_PORT}"-:"${IPERF3_PORT}" \ + -net nic diff --git a/scripts/opensuse/suse-compose.sh b/scripts/opensuse/suse-compose.sh index 60959d06..9e3d2877 100755 --- a/scripts/opensuse/suse-compose.sh +++ b/scripts/opensuse/suse-compose.sh @@ -4,6 +4,4 @@ set -e ./scripts/download_images.py "$1" ./scripts/cloud-setup.sh "${S_USER}" "${PASSWORD}" -CPUS=4 -qemu-system-x86_64 -m "${VM_RAM}" -smp "${CPUS}" -nographic -monitor tcp:0.0.0.0:4444,server,nowait -drive file=open-suse-"$1".ready.qcow2,index=0,media=disk \ - -cdrom cloud-init.iso -net user,hostfwd=tcp::"${SSH_SUSE_PORT}"-:"${SSH_QEMU_PORT}",hostfwd=tcp::"${SUSE_NE_PORT}"-:"${DEFAULT_NE_PORT}",hostfwd=tcp:0.0.0.0:"${IPERF3_PORT}"-:"${IPERF3_PORT}",hostfwd=udp:0.0.0.0:"${IPERF3_PORT}"-:"${IPERF3_PORT}" -net nic +echo "Image is ready. VM will be started by imgtests-suse-vm container." diff --git a/scripts/start-vm-yocto.sh b/scripts/start-vm-yocto.sh new file mode 100755 index 00000000..cd649b92 --- /dev/null +++ b/scripts/start-vm-yocto.sh @@ -0,0 +1,11 @@ +#!/bin/bash + +rm -rf /home/user/poky/meta-openjdk-temurin/recipes-java/helloworld-java + +# shellcheck disable=SC1091 +source "/home/user/poky/oe-init-build-env" "/home/user/poky/build" + +ROOTFS_IMAGE="${POKY_DIR}/build/tmp/deploy/images/qemux86-64/${OS_IMAGE}-qemux86-64.rootfs.ext4.qcow2" + +QB_SLIRP_OPT="-netdev user,id=net0,hostfwd=tcp::8080-:80,hostfwd=tcp::${SSH_QEMU_PORT}-:${SSH_TO_QEMU_PORT},hostfwd=tcp::${YOCTO_NE_PORT}-:${DEFAULT_NE_PORT},hostfwd=tcp:0.0.0.0:${IPERF3_PORT}-:${IPERF3_PORT},hostfwd=udp:0.0.0.0:${IPERF3_PORT}-:${IPERF3_PORT}" \ + runqemu qemux86-64 kvm slirp nographic "${ROOTFS_IMAGE}" qemuparams="-monitor tcp:0.0.0.0:4444,server,nowait -smp ${CPUS}"