penguin/monok8s

k8s image for Mono Gateway Dev Kit

commit e324969a949fce8cc744d1d1f4d3b000b4efdade8d5d69aa8fee26db4b7cabb3

author斟酌 鵬兄 <tgckpg@gmail.com>
date2026-03-22T15:47:55Z
subject"make release" draft
commit e324969a949fce8cc744d1d1f4d3b000b4efdade8d5d69aa8fee26db4b7cabb3
Author: 斟酌 鵬兄 <tgckpg@gmail.com>
Date:   2026-03-22T15:47:55Z

    "make release" draft
---
 alpine/build-rootfs.sh                             | 36 +++++++++++++++++-
 alpine/install-packages.sh                         |  2 +-
 alpine/sync-loop.sh                                | 21 +++++++++++
 docker/alpine.Dockerfile                           |  4 +-
 docker/build-base.Dockerfile                       |  6 ++-
 .../{fit-build.Dockerfile => initramfs.Dockerfile} |  7 +++-
 docker/itb.Dockerfile                              |  2 +-
 docker/kernel-build.Dockerfile                     |  2 +-
 docker/release.Dockerfile                          |  4 ++
 makefile                                           | 43 +++++++++++++++-------
 10 files changed, 104 insertions(+), 23 deletions(-)

diff --git a/alpine/build-rootfs.sh b/alpine/build-rootfs.sh
index f58c92f..c4ed860 100755
--- a/alpine/build-rootfs.sh
+++ b/alpine/build-rootfs.sh
@@ -16,7 +16,7 @@ chroot "$ROOTFS" /bin/sh -c "ln -s /var/cache/apk /etc/apk/cache"
 # chroot "$ROOTFS" /bin/sh -c "apk update"
 chroot "$ROOTFS" /bin/sh -c "apk add bash curl"
 cp "/install-packages.sh" "$ROOTFS/install-packages.sh"
-chroot "$ROOTFS" /bin/bash /install-packages.sh
+chroot "$ROOTFS" /bin/bash /install-packages.sh || exit 1
 
 umount "$ROOTFS/var/cache/apk"
 umount "$ROOTFS/dev"
@@ -26,4 +26,36 @@ umount "$ROOTFS/run"
 
 rm -r "$ROOTFS/build"
 
-# Begin making full disk image for the device
+### Begin making full disk image for the device
+echo "=========================== RootFS "$( du -sh "$ROOTFS/" )
+
+IMG=output.img
+SIZE=512MB
+
+dd if=/dev/zero of="$IMG" bs=1 count=0 seek=$SIZE
+
+sgdisk -o "$IMG" \
+  -n 1:2048:+64M -t 1:0700 \
+  -n 2:0:-1M     -t 2:8300
+
+losetup -D
+LOOP=$(losetup --find --show -P "$IMG")
+
+/sync-loop.sh "$LOOP"
+
+TMP_LOOP="/tmp$LOOP"
+mkfs.vfat "${TMP_LOOP}p1"
+mkfs.ext4 "${TMP_LOOP}p2"
+
+mkdir -p /mnt/img-root /mnt/img-boot
+
+mount ${TMP_LOOP}p1 /mnt/img-boot
+mount ${TMP_LOOP}p2 /mnt/img-root
+
+cp -a "$ROOTFS"/. /mnt/img-root/
+cp /build/board.itb /mnt/img-boot
+
+umount /mnt/img-root
+umount /mnt/img-boot
+
+losetup -d "$LOOP"
diff --git a/alpine/install-packages.sh b/alpine/install-packages.sh
index 500fa11..30f4c55 100755
--- a/alpine/install-packages.sh
+++ b/alpine/install-packages.sh
@@ -18,7 +18,7 @@ fi
 
 echo "--------------"
 sed -i "s/default_runtime = \"crun\"/\0\ncgroup_manager = \"cgroupfs\"/g" /etc/crio/crio.conf.d/10-crio.conf
-cat /etc/crio/crio.conf.d/10-crio.conf
+grep cgroup_manager /etc/crio/crio.conf.d/10-crio.conf || exit 1
 
 mkdir -p /var/run/crio
 mkdir -p /var/lib/containers/storage
diff --git a/alpine/sync-loop.sh b/alpine/sync-loop.sh
new file mode 100755
index 0000000..c7baeaa
--- /dev/null
+++ b/alpine/sync-loop.sh
@@ -0,0 +1,21 @@
+#!/bin/bash
+DEVICE="$1"
+FAKE_DEV="/tmp/dev"
+
+mkdir -p "$FAKE_DEV"
+
+echo "Refreshing partition table..."
+partx -u "$DEVICE" 2>/dev/null || partx -a "$DEVICE"
+
+# Find partitions and their Major:Minor numbers
+lsblk -rn -o NAME,MAJ:MIN "$DEVICE" | while read -r NAME MAJMIN; do
+    # Skip the parent loop0
+    if [[ "$NAME" == "loop0" ]]; then continue; fi
+
+    PART_PATH="$FAKE_DEV/$NAME"
+    MAJOR=$(echo $MAJMIN | cut -d: -f1)
+    MINOR=$(echo $MAJMIN | cut -d: -f2)
+
+    echo "Creating node: $PART_PATH (b $MAJOR $MINOR)"
+    mknod "$PART_PATH" b "$MAJOR" "$MINOR"
+done
diff --git a/docker/alpine.Dockerfile b/docker/alpine.Dockerfile
index 5206969..42c326a 100644
--- a/docker/alpine.Dockerfile
+++ b/docker/alpine.Dockerfile
@@ -1,6 +1,7 @@
 ARG TAG=dev
 ARG DOCKER_IMAGE_ROOT=monok8s
-FROM --platform=linux/amd64 ${DOCKER_IMAGE_ROOT}/build-base:${TAG} AS build-base
+
+FROM --platform=$BUILDPLATFORM ${DOCKER_IMAGE_ROOT}/build-base:${TAG} AS build-base
 
 ARG ALPINE_ARCH
 ARG ALPINE_VER
@@ -10,6 +11,7 @@ RUN mkdir -p "/out/rootfs"
 
 COPY packages/alpine-minirootfs-${ALPINE_VER}-${ALPINE_ARCH}.tar.gz ./alpine.tar.gz
 COPY packages/${CRIO_VERSION}.tar.gz ./crio.tar.gz
+COPY out/board.itb ./
 
 RUN tar -xf alpine.tar.gz -C "/out/rootfs"
 
diff --git a/docker/build-base.Dockerfile b/docker/build-base.Dockerfile
index 945994e..9a2119c 100644
--- a/docker/build-base.Dockerfile
+++ b/docker/build-base.Dockerfile
@@ -1,4 +1,4 @@
-FROM --platform=linux/amd64 debian:bookworm-slim AS kernel-build
+FROM --platform=$BUILDPLATFORM debian:bookworm-slim AS kernel-build
 
 ENV DEBIAN_FRONTEND=noninteractive
 
@@ -11,8 +11,10 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
     build-essential \
     cpio \
     curl \
+    dosfstools \
     file \
 	fdisk \
+	gdisk \
     flex \
     git \
     gettext-base \
@@ -21,11 +23,13 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
     libssl-dev \
     make \
     pahole \
+	parted \
     perl \
     python3 \
 	qemu-user-static \
     rsync \
     tar \
+	udev \
     xz-utils \
     dwarves \
     gcc-aarch64-linux-gnu \
diff --git a/docker/fit-build.Dockerfile b/docker/initramfs.Dockerfile
similarity index 83%
rename from docker/fit-build.Dockerfile
rename to docker/initramfs.Dockerfile
index 27663f4..e1f47d9 100644
--- a/docker/fit-build.Dockerfile
+++ b/docker/initramfs.Dockerfile
@@ -1,13 +1,13 @@
 ARG TAG=dev
 ARG DOCKER_IMAGE_ROOT=monok8s
-FROM --platform=linux/amd64 ${DOCKER_IMAGE_ROOT}/kernel-build:${TAG} AS kernel
+FROM --platform=$BUILDPLATFORM ${DOCKER_IMAGE_ROOT}/kernel-build:${TAG} AS kernel
 
 # Selective mods
 RUN mkdir /out/selected-mods
 COPY initramfs/selective-mods.sh /
 RUN /selective-mods.sh /out/rootfs/lib/modules/$(ls /out/rootfs/lib/modules/) /out/selected-mods
 
-FROM --platform=linux/amd64 ${DOCKER_IMAGE_ROOT}/build-base:${TAG} AS build
+FROM --platform=$BUILDPLATFORM ${DOCKER_IMAGE_ROOT}/build-base:${TAG} AS build
 
 ARG BUSYBOX_VERSION
 ARG ARCH
@@ -38,3 +38,6 @@ RUN mkdir -p bin sbin etc proc sys dev lib usr/bin usr/sbin
 COPY --from=kernel /out/selected-mods/* ./lib/
 
 RUN find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../initramfs.cpio.gz
+
+FROM scratch
+COPY --from=build /out/initramfs.cpio.gz /initramfs.cpio.gz
diff --git a/docker/itb.Dockerfile b/docker/itb.Dockerfile
index 912f6bc..a04dce0 100644
--- a/docker/itb.Dockerfile
+++ b/docker/itb.Dockerfile
@@ -3,7 +3,7 @@ ARG DOCKER_IMAGE_ROOT=monok8s
 FROM ${DOCKER_IMAGE_ROOT}/kernel-build:${TAG} AS kernel
 FROM ${DOCKER_IMAGE_ROOT}/fit-build:${TAG} AS fit
 
-FROM --platform=linux/amd64 ${DOCKER_IMAGE_ROOT}/build-base:${TAG} AS build
+FROM --platform=$BUILDPLATFORM ${DOCKER_IMAGE_ROOT}/build-base:${TAG} AS build
 
 ARG DEVICE_TREE_TARGET
 
diff --git a/docker/kernel-build.Dockerfile b/docker/kernel-build.Dockerfile
index 43be2b9..b48ae37 100644
--- a/docker/kernel-build.Dockerfile
+++ b/docker/kernel-build.Dockerfile
@@ -1,6 +1,6 @@
 ARG TAG=dev
 ARG DOCKER_IMAGE_ROOT=monok8s
-FROM --platform=linux/amd64 ${DOCKER_IMAGE_ROOT}/build-base:${TAG}
+FROM --platform=$BUILDPLATFORM ${DOCKER_IMAGE_ROOT}/build-base:${TAG}
 
 ARG NXP_VERSION
 ARG ARCH
diff --git a/docker/release.Dockerfile b/docker/release.Dockerfile
new file mode 100644
index 0000000..810a462
--- /dev/null
+++ b/docker/release.Dockerfile
@@ -0,0 +1,4 @@
+ARG RELEASE_IMAGE
+FROM scratch
+
+COPY --from artifacts $RELEASE_IMAGE /$RELEASE_IMAGE
diff --git a/makefile b/makefile
index a482495..6fc1ea4 100644
--- a/makefile
+++ b/makefile
@@ -10,6 +10,12 @@ ALPINE_TAR  := $(PACKAGES_DIR)/alpine-minirootfs-$(ALPINE_VER)-$(ALPINE_ARCH).ta
 NXP_TAR     := $(PACKAGES_DIR)/$(NXP_VERSION).tar.gz
 CRIO_TAR    := $(PACKAGES_DIR)/$(CRIO_VERSION).tar.gz
 
+BOARD_ITB     := out/board.itb
+INITRAMFS     := out/initramfs.cpio.gz
+RELEASE_IMAGE := out/monok8s-$(TAG).img
+
+ALPINE_SERIES := $(word 1,$(subst ., ,${ALPINE_VER})).$(word 2,$(subst ., ,${ALPINE_VER}))
+
 $(BUSYBOX_TAR):
 	@mkdir -p $(PACKAGES_DIR)
 	curl -L -o $@ "https://github.com/mirror/busybox/archive/refs/tags/$(BUSYBOX_VERSION).tar.gz"
@@ -32,7 +38,7 @@ build-base:
 	--build-arg TAG=$(TAG) \
 	-t $(DOCKER_IMAGE_ROOT)/build-base:$(TAG) .
 
-kernel-build: build-base $(NXP_TAR)
+$(KERNEL_IMAGE): build-base $(NXP_TAR)
 	docker build \
 	-f docker/kernel-build.Dockerfile \
 		--build-arg DOCKER_IMAGE_ROOT=$(DOCKER_IMAGE_ROOT) \
@@ -41,29 +47,34 @@ kernel-build: build-base $(NXP_TAR)
 		--build-arg CROSS_COMPILE=$(CROSS_COMPILE) \
 		--build-arg NXP_VERSION=$(NXP_VERSION) \
 		--build-arg DEVICE_TREE_TARGET=$(DEVICE_TREE_TARGET) \
-	-t $(DOCKER_IMAGE_ROOT)/kernel-build:$(TAG) .
+		--output type=local,dest=./out .
 
-fit-build: kernel-build $(BUSYBOX_TAR)
+	@test -f $(KERNEL_IMAGE)
+
+$(INITRAMFS): $(KERNEL_IMAGE) $(BUSYBOX_TAR)
 	docker build \
-	-f docker/fit-build.Dockerfile \
+	-f docker/initramfs.Dockerfile \
 		--build-arg DOCKER_IMAGE_ROOT=$(DOCKER_IMAGE_ROOT) \
 		--build-arg TAG=$(TAG) \
 		--build-arg ARCH=$(ARCH) \
 		--build-arg CROSS_COMPILE=$(CROSS_COMPILE) \
 		--build-arg BUSYBOX_VERSION=$(BUSYBOX_VERSION) \
-	-t $(DOCKER_IMAGE_ROOT)/fit-build:$(TAG) .
+		--output type=local,dest=./out .
+
+	@test -f $(INITRAMFS)
 
-itb: fit-build
+$(BOARD_ITB): $(INITRAMFS)
 	docker build \
 	-f docker/itb.Dockerfile \
 		--build-arg DOCKER_IMAGE_ROOT=$(DOCKER_IMAGE_ROOT) \
 		--build-arg TAG=$(TAG) \
 		--build-arg ARCH=$(ARCH) \
 		--build-arg DEVICE_TREE_TARGET=$(DEVICE_TREE_TARGET) \
-		--output type=local,dest=./out \
-	-t $(DOCKER_IMAGE_ROOT)/itb:$(TAG) .
+		--output type=local,dest=./out .
 
-buildenv-alpine: build-base $(ALPINE_TAR) $(CRIO_TAR)
+	@test -f $(BOARD_ITB)
+
+release: $(BOARD_ITB) build-base
 	docker build \
 	-f docker/alpine.Dockerfile \
 		--build-arg DOCKER_IMAGE_ROOT=$(DOCKER_IMAGE_ROOT) \
@@ -72,13 +83,17 @@ buildenv-alpine: build-base $(ALPINE_TAR) $(CRIO_TAR)
 		--build-arg ALPINE_VER=$(ALPINE_VER) \
 		--build-arg CRIO_VERSION=$(CRIO_VERSION) \
 	-t $(DOCKER_IMAGE_ROOT)/buildenv-alpine:$(TAG) .
-
-alpine-rootfs: buildenv-alpine kernel-build
-	docker run --rm -it \
+	@cid=$$(docker create \
 		--privileged \
 		-v /cache/apk:/var/cache/apk \
-		-v /cache/artifacts:/artifacts \
+		--device=/dev/loop0:/dev/loop0 \
 		-e ROOTFS=/out/rootfs \
 		-e ARTIFACT_DIR=/artifacts \
+		-e RELEASE_IMAGE=$(RELEASE_IMAGE) \
 		$(DOCKER_IMAGE_ROOT)/buildenv-alpine:$(TAG) \
-		bash -lc '/build-rootfs.sh'
+		bash -lc '/build-rootfs.sh'); \
+	docker start -a $$cid; \
+	docker cp $$cid:/build/output.img $(RELEASE_IMAGE); \
+	docker rm $$cid
+
+	@test -f $(RELEASE_IMAGE)