From a7236ed3b06aceb9ba74fb96ac6e80a0b8ad435ab1ef96c132c9a41c7f9d27a0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=96=9F=E9=85=8C=20=E9=B5=AC=E5=85=84?= Date: Sat, 21 Mar 2026 02:26:13 +0800 Subject: [PATCH] Added kernel-extra.config for customization --- .gitignore | 1 + README.md | 30 +++++++++ docker/build-base.Dockerfile | 1 + docker/fit-build.Dockerfile | 14 ++++- docker/kernel-build.Dockerfile | 10 ++- initramfs/init | 27 ++++----- initramfs/selective-mods.sh | 107 +++++++++++++++++++++++++++++++++ kernel-extra.config | 3 + makefile | 4 +- 9 files changed, 177 insertions(+), 20 deletions(-) create mode 100755 initramfs/selective-mods.sh create mode 100644 kernel-extra.config diff --git a/.gitignore b/.gitignore index 8c0964c..f723986 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ dev/ out/ +.swp diff --git a/README.md b/README.md index a1e7acd..cc90094 100644 --- a/README.md +++ b/README.md @@ -6,6 +6,35 @@ https://docs.mono.si/gateway-development-kit/getting-started ## Build ``` make itb # for out/board.itb +make release # WORK IN PROGRESS +``` + +## Architecture + - A/B deployment + - Read-only OS + +## Upgrade process +Rough idea + +``` +./configure +# - join cluster config + +make release + + +# Copy the new image to the upgrade-scheduler +kubectl cp -n kube-system upgrade-scheduler:/tmp/upgrade.img + +# Upgrade scheduler reads the file that issue a self-reboot +reboot + +# uboot to boot into partition B + +``` + +```yaml +PENDING ``` ## tftp (network is required) @@ -18,6 +47,7 @@ usb start usb tree fatls usb 0:1 # For fat ext4ls usb 0:1 # For ext4 +fatload usb 0 0x80000000 board.itb setenv bootargs "console=ttyS0,115200 earlycon=uart8250,mmio,0x21c0500 root=/dev/ram0 rootwait rw" bootm 0x80000000 diff --git a/docker/build-base.Dockerfile b/docker/build-base.Dockerfile index 1aba290..e9d1fb9 100644 --- a/docker/build-base.Dockerfile +++ b/docker/build-base.Dockerfile @@ -14,6 +14,7 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ file \ flex \ git \ + kmod \ libelf-dev \ libssl-dev \ make \ diff --git a/docker/fit-build.Dockerfile b/docker/fit-build.Dockerfile index e5f831b..681e237 100644 --- a/docker/fit-build.Dockerfile +++ b/docker/fit-build.Dockerfile @@ -1,5 +1,12 @@ ARG TAG=dev ARG DOCKER_IMAGE_ROOT=monok8s +FROM --platform=linux/amd64 ${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 ARG BUSYBOX_VERSION @@ -21,7 +28,7 @@ RUN tar -xf busybox.tar.gz && mv "busybox-${BUSYBOX_VERSION}" busybox WORKDIR /build/busybox -RUN make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} defconfig \ +RUN make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} defconfig\ && sed -i 's/^# CONFIG_STATIC is not set/CONFIG_STATIC=y/' .config RUN make CROSS_COMPILE=${CROSS_COMPILE} -j"$(nproc)" RUN make CROSS_COMPILE=${CROSS_COMPILE} CONFIG_PREFIX=/out/initramfs install @@ -30,5 +37,8 @@ WORKDIR /out/initramfs COPY initramfs/init init RUN chmod +x init -RUN mkdir -p bin sbin etc proc sys dev usr/bin usr/sbin +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 diff --git a/docker/kernel-build.Dockerfile b/docker/kernel-build.Dockerfile index c281237..8119c4b 100644 --- a/docker/kernel-build.Dockerfile +++ b/docker/kernel-build.Dockerfile @@ -26,9 +26,13 @@ RUN tar -xf nxplinux.tar.gz \ WORKDIR /build/nxplinux +COPY kernel-extra.config /tmp/kernel-extra.config + # NXP tree: use the LSDK defconfig target -RUN make ARCH="${ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" defconfig lsdk.config -RUN make ARCH="${ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" -j"$(nproc)" +RUN make ARCH="${ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" defconfig lsdk.config \ + && ./scripts/kconfig/merge_config.sh -m .config /tmp/kernel-extra.config \ + && make ARCH="${ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" olddefconfig \ + && make ARCH="${ARCH}" CROSS_COMPILE="${CROSS_COMPILE}" -j"$(nproc)" # artifact collection RUN mkdir -p /out/kernel /out/rootfs \ @@ -37,6 +41,8 @@ RUN mkdir -p /out/kernel /out/rootfs \ && cp -av System.map .config /out/kernel/ \ && make ARCH=${ARCH} CROSS_COMPILE=${CROSS_COMPILE} modules_install INSTALL_MOD_PATH=/out/rootfs +RUN depmod -b /out/rootfs $(ls /out/rootfs/lib/modules/) + ARG DTB_TARGET RUN find /out/kernel -name "${DTB_TARGET}" -exec cp {} /out/ \; diff --git a/initramfs/init b/initramfs/init index f0ba2f1..0a2924d 100755 --- a/initramfs/init +++ b/initramfs/init @@ -1,20 +1,19 @@ #!/bin/sh -mount -t proc none /proc -mount -t sysfs none /sys +mount -t devtmpfs devtmpfs /dev +mount -t proc proc /proc +mount -t sysfs sysfs /sys -cat < " + echo "Example: $0 /out/rootfs/lib/modules/6.18.2 /out/initramfs" + exit 1 +fi + +SRC_MODDIR="$1" # e.g. /out/rootfs/lib/modules/6.18.2 +DEST_ROOT="$2" # e.g. /out/initramfs + +if [[ ! -d "$SRC_MODDIR" ]]; then + echo "Source module dir does not exist: $SRC_MODDIR" >&2 + exit 1 +fi + +KVER="$(basename "$SRC_MODDIR")" +DEST_MODDIR="$DEST_ROOT/lib/modules/$KVER" + +mkdir -p "$DEST_MODDIR" + +echo "==> Source: $SRC_MODDIR" +echo "==> Dest: $DEST_MODDIR" +echo + +# Relative paths under /lib/modules/ +PATHS=( + # Metadata files used by modprobe/depmod. + "modules.builtin" + "modules.builtin.modinfo" + "modules.order" + + "modules.dep" + "modules.dep.bin" + "modules.alias" + "modules.alias.bin" + "modules.symbols" + "modules.symbols.bin" + "modules.softdep" + + # Core module dirs we may need. + "kernel/drivers/pwm" + "kernel/drivers/hwmon" + "kernel/drivers/thermal" + + # Optional + # "kernel/drivers/i2c" + # "kernel/drivers/gpio" + # "kernel/drivers/base" + # "kernel/drivers/power" + # "kernel/drivers/platform" +) + +copy_one() { + local rel="$1" + local src="$SRC_MODDIR/$rel" + local dst="$DEST_MODDIR/$rel" + + if [[ -d "$src" ]]; then + echo "[DIR ] $rel" + mkdir -p "$(dirname "$dst")" + cp -a "$src" "$dst" + elif [[ -f "$src" ]]; then + echo "[FILE] $rel" + mkdir -p "$(dirname "$dst")" + cp -a "$src" "$dst" + else + echo "[MISS] $rel" + fi +} + +for rel in "${PATHS[@]}"; do + copy_one "$rel" +done + +echo +echo "==> Done staging selected modules." + +# Optional: show what got copied +echo +echo "==> Staged files summary:" +find "$DEST_MODDIR" -type f | sed "s#^$DEST_ROOT/##" | sort + +# Optional: if depmod exists INSIDE the build environment and you want to +# regenerate metadata for the destination tree, uncomment this block. +# +# if command -v depmod >/dev/null 2>&1; then +# echo +# echo "==> Running depmod for destination tree..." +# depmod -b "$DEST_ROOT" "$KVER" +# fi diff --git a/kernel-extra.config b/kernel-extra.config new file mode 100644 index 0000000..c571753 --- /dev/null +++ b/kernel-extra.config @@ -0,0 +1,3 @@ +CONFIG_HWMON=y +CONFIG_I2C=y +CONFIG_SENSORS_EMC2305=y diff --git a/makefile b/makefile index 1c77107..912a880 100644 --- a/makefile +++ b/makefile @@ -20,7 +20,7 @@ kernel-build: build-base --build-arg DTB_TARGET=$(DTB_TARGET) \ -t $(DOCKER_IMAGE_ROOT)/kernel-build:$(TAG) . -fit-build: build-base +fit-build: kernel-build docker build \ -f docker/fit-build.Dockerfile \ --build-arg DOCKER_IMAGE_ROOT=$(DOCKER_IMAGE_ROOT) \ @@ -30,7 +30,7 @@ fit-build: build-base --build-arg BUSYBOX_VERSION=$(BUSYBOX_VERSION) \ -t $(DOCKER_IMAGE_ROOT)/fit-build:$(TAG) . -itb: fit-build kernel-build +itb: fit-build docker build \ -f docker/itb.Dockerfile \ --build-arg DOCKER_IMAGE_ROOT=$(DOCKER_IMAGE_ROOT) \