From 5605056c8219ddb99e79d143636492d6c0d5c52a Mon Sep 17 00:00:00 2001 From: Alex Zenla Date: Wed, 26 Nov 2025 23:05:01 -0800 Subject: [PATCH] chore(dev): make alpine boot fully clean with kernel module infra --- hack/dev/boot.sh | 12 ++++++------ hack/dev/build.sh | 7 ++++++- hack/dev/kernel/Dockerfile | 3 +++ hack/dev/kernel/docker-build.sh | 9 ++++++++- hack/dev/kernel/docker-install.sh | 11 +++++++++++ hack/dev/vm/Dockerfile.initramfs | 3 ++- 6 files changed, 36 insertions(+), 9 deletions(-) create mode 100755 hack/dev/kernel/docker-install.sh diff --git a/hack/dev/boot.sh b/hack/dev/boot.sh index 229fb77..40f3984 100755 --- a/hack/dev/boot.sh +++ b/hack/dev/boot.sh @@ -40,9 +40,9 @@ else set -- "${@}" -serial stdio else set -- "${@}" \ - -device virtio-serial-pci,id=vs0 \ - -chardev stdio,id=stdio0,signal=off \ - -device virtconsole,chardev=stdio0,id=console0 + -device 'virtio-serial-pci,id=vs0' \ + -chardev 'stdio,id=stdio0,signal=off' \ + -device 'virtconsole,chardev=stdio0,id=console0,name=alpine' fi fi @@ -64,8 +64,8 @@ fi if [ "${NO_NETWORK}" != "1" ]; then set -- "${@}" \ - -netdev user,id=network0 \ - -device virtio-net-pci,netdev=network0 + -netdev 'user,id=network0' \ + -device 'virtio-net-pci,netdev=network0' fi rm -f "${FINAL_DIR}/ovmf-boot.fd" @@ -76,7 +76,7 @@ fi # shellcheck disable=SC2086 set -- "${@}" \ -drive "if=pflash,file=${FINAL_DIR}/ovmf-boot.fd,format=raw,readonly=on" \ - -device nvme,drive=disk1,serial=cafebabe + -device 'nvme,drive=disk1,serial=cafebabe' set -- "${@}" \ -drive "if=none,file=${FINAL_DIR}/sprout.img,format=raw,id=disk1,readonly=on" diff --git a/hack/dev/build.sh b/hack/dev/build.sh index 75726c1..38f1bcd 100755 --- a/hack/dev/build.sh +++ b/hack/dev/build.sh @@ -72,6 +72,7 @@ if [ "${SKIP_KERNEL_BUILD}" != "1" ]; then fi copy_from_image "${DOCKER_PREFIX}/sprout-kernel-${TARGET_ARCH}" "kernel.efi" "${FINAL_DIR}/kernel.efi" + copy_from_image "${DOCKER_PREFIX}/sprout-kernel-${TARGET_ARCH}" "kernel.modules.tgz" "${FINAL_DIR}/kernel.modules.tgz" fi if [ "${SKIP_VM_BUILD}" != "1" ]; then @@ -80,8 +81,12 @@ if [ "${SKIP_VM_BUILD}" != "1" ]; then -f hack/dev/vm/Dockerfile.ovmf "${FINAL_DIR}" copy_from_image "${DOCKER_PREFIX}/sprout-ovmf-${TARGET_ARCH}" "ovmf.fd" "${FINAL_DIR}/ovmf.fd" copy_from_image "${DOCKER_PREFIX}/sprout-ovmf-${TARGET_ARCH}" "shell.efi" "${FINAL_DIR}/shell.efi" + rm -rf "${FINAL_DIR}/initramfs.build" + mkdir -p "${FINAL_DIR}/initramfs.build" + cp -r "hack/dev/vm/files" "${FINAL_DIR}/initramfs.build/files" + cp "${FINAL_DIR}/kernel.modules.tgz" "${FINAL_DIR}/initramfs.build/kernel.modules.tgz" docker build --platform="${DOCKER_TARGET}" -t "${DOCKER_PREFIX}/sprout-initramfs-${TARGET_ARCH}:${DOCKER_TAG}" \ - -f hack/dev/vm/Dockerfile.initramfs "hack/dev/vm" + -f hack/dev/vm/Dockerfile.initramfs "${FINAL_DIR}/initramfs.build" copy_from_image "${DOCKER_PREFIX}/sprout-initramfs-${TARGET_ARCH}" "initramfs" "${FINAL_DIR}/initramfs" if [ -n "${SPROUT_XEN_EFI_OVERRIDE}" ]; then diff --git a/hack/dev/kernel/Dockerfile b/hack/dev/kernel/Dockerfile index 151bf16..05529ab 100644 --- a/hack/dev/kernel/Dockerfile +++ b/hack/dev/kernel/Dockerfile @@ -32,6 +32,9 @@ ENV BUILDPLATFORM=${BUILDPLATFORM} ENV TARGETPLATFORM=${TARGETPLATFORM} WORKDIR /build/src RUN /build/docker-build.sh +COPY --chown=build:build docker-install.sh /build/docker-install.sh +RUN /build/docker-install.sh FROM scratch AS final COPY --from=build /build/src/kernel.image /kernel.efi +COPY --from=build /build/src/kernel.modules.tgz /kernel.modules.tgz diff --git a/hack/dev/kernel/docker-build.sh b/hack/dev/kernel/docker-build.sh index de4b3e6..f88f568 100755 --- a/hack/dev/kernel/docker-build.sh +++ b/hack/dev/kernel/docker-build.sh @@ -28,13 +28,17 @@ else exit 1 fi +echo "CROSS_COMPILE=${MAYBE_CROSS_COMPILE}" > kernel.buildenv +echo "TARGET_KARCH=${TARGET_KARCH}" >> kernel.buildenv + make CROSS_COMPILE="${MAYBE_CROSS_COMPILE}" ARCH="${TARGET_KARCH}" defconfig if [ "${TARGET_KARCH}" = "x86_64" ]; then make CROSS_COMPILE="${MAYBE_CROSS_COMPILE}" ARCH="${TARGET_KARCH}" xen.config ./scripts/config -e XEN_PV ./scripts/config -e XEN_PV_DOM0 fi -make CROSS_COMPILE="${MAYBE_CROSS_COMPILE}" ARCH="${TARGET_KARCH}" mod2yesconfig + +./scripts/config -e BPF_SYSCALL ./scripts/config -e UEVENT_HELPER ./scripts/config --set-str UEVENT_HELPER_PATH "/sbin/hotplug" @@ -46,8 +50,11 @@ make CROSS_COMPILE="${MAYBE_CROSS_COMPILE}" ARCH="${TARGET_KARCH}" mod2yesconfig ./scripts/config -e XEN_DOM0 +make CROSS_COMPILE="${MAYBE_CROSS_COMPILE}" ARCH="${TARGET_KARCH}" mod2noconfig + make "-j$(nproc)" CROSS_COMPILE="${MAYBE_CROSS_COMPILE}" ARCH="${TARGET_KARCH}" [ -f "arch/x86/boot/bzImage" ] && cp "arch/x86/boot/bzImage" kernel.image [ -f "arch/arm64/boot/Image.gz" ] && gzip -d <"arch/arm64/boot/Image.gz" >kernel.image + exit 0 diff --git a/hack/dev/kernel/docker-install.sh b/hack/dev/kernel/docker-install.sh new file mode 100755 index 0000000..49d6a31 --- /dev/null +++ b/hack/dev/kernel/docker-install.sh @@ -0,0 +1,11 @@ +#!/bin/sh +set -e + +. /build/src/kernel.buildenv + +[ -f "arch/x86/boot/bzImage" ] && cp "arch/x86/boot/bzImage" kernel.image +[ -f "arch/arm64/boot/Image.gz" ] && gzip -d <"arch/arm64/boot/Image.gz" >kernel.image + +make CROSS_COMPILE="${MAYBE_CROSS_COMPILE}" ARCH="${TARGET_KARCH}" INSTALL_MOD_PATH="/build/install" modules_install +cd /build/install +tar czpf /build/src/kernel.modules.tgz . diff --git a/hack/dev/vm/Dockerfile.initramfs b/hack/dev/vm/Dockerfile.initramfs index 1bb29a0..baa34e4 100644 --- a/hack/dev/vm/Dockerfile.initramfs +++ b/hack/dev/vm/Dockerfile.initramfs @@ -1,5 +1,5 @@ FROM alpine:3.22@sha256:4b7ce07002c69e8f3d704a9c5d6fd3053be500b7f1c69fc0d80990c2ad8dd412 AS rootfs -RUN apk --no-cache add alpine-base tzdata ifupdown-ng agetty +RUN apk --no-cache add alpine-base tzdata wireless-regdb ifupdown-ng agetty RUN rc-update add devfs sysinit && \ rc-update add dmesg sysinit && \ rc-update add mdev sysinit && \ @@ -18,6 +18,7 @@ RUN rc-update add devfs sysinit && \ rm /etc/motd && \ ln -s /usr/share/zoneinfo/UTC /etc/localtime && \ echo 'hvc0::respawn:/sbin/agetty --autologin root -L hvc0 115200 vt100' >> /etc/inittab +ADD kernel.modules.tgz / COPY files/interfaces /etc/network/interfaces FROM alpine:3.22@sha256:4b7ce07002c69e8f3d704a9c5d6fd3053be500b7f1c69fc0d80990c2ad8dd412 AS build