Add a target for building kernel with buildx (#3792)

* Use latest kernel in linuxkit

Signed-off-by: Frédéric Dalleau <frederic.dalleau@docker.com>

* Parallelize kernel source compression

This surpringly saves a lot of time:
M1: from 340 to 90 seconds
Intel: from 527 to 222 seconds (2 cores 4 threads)

Signed-off-by: Frédéric Dalleau <frederic.dalleau@docker.com>

* Add buildx target

buildx can use remote builders and automatically generate the multiarch manifest.
A properly configured builder is required :

First create docker context for the remote builders :
$ docker context create node-<arch> --docker "host=ssh://<user>@<host>"

Then create a buildx configuration using the remote builders:
$ docker buildx create --name kernel_builder --platform linux/amd64
$ docker buildx create --name kernel_builder --node node-arm64 --platform linux/arm64 --append
$ docker buildx use kernel_builder
$ docker buildx ls

Signed-off-by: Frédéric Dalleau <frederic.dalleau@docker.com>

* Add a PLATFORMS variable to declare platforms needed for buildx

Signed-off-by: Frédéric Dalleau <frederic.dalleau@docker.com>

* Make image name customizable

Signed-off-by: Frédéric Dalleau <frederic.dalleau@docker.com>

* Do not tag use the architecture suffix for images built with buildx

Signed-off-by: Frédéric Dalleau <frederic.dalleau@docker.com>

* Add make kconfigx to upgrade configs using buildx

To update configuration for 5.10 kernels use :
make -C kernel KERNEL_VERSIONS=5.10.104 kconfigx

Signed-off-by: Frédéric Dalleau <frederic.dalleau@docker.com>

---------

Signed-off-by: Frédéric Dalleau <frederic.dalleau@docker.com>
This commit is contained in:
Frédéric Dalleau
2023-04-28 10:49:08 +02:00
committed by GitHub
parent eb81457111
commit c2df261e01
4 changed files with 106 additions and 3 deletions

View File

@@ -0,0 +1,71 @@
# syntax=docker/dockerfile:1.3-labs
ARG BUILD_IMAGE
FROM ${BUILD_IMAGE} AS kernel-build
ARG KERNEL_VERSIONS
ARG TARGETARCH
RUN apk add \
argp-standalone \
bison \
build-base \
curl \
diffutils \
flex \
gmp-dev \
libarchive-tools \
mpc1-dev \
mpfr-dev \
ncurses-dev \
patch \
xz
COPY / /
# Unpack kernels (download if not present)
RUN <<EOF
set -e
for VERSION in ${KERNEL_VERSIONS}; do
MAJOR=$(echo ${VERSION} | cut -d . -f 1)
MAJOR=v${MAJOR}.x
echo "Downloading/Unpacking $VERSION"
KERNEL_SOURCE=https://www.kernel.org/pub/linux/kernel/${MAJOR}/linux-${VERSION}.tar.xz
if [ ! -f sources/linux-${VERSION}.tar.xz ] ; then
curl -fSLo sources/linux-${VERSION}.tar.xz --create-dirs ${KERNEL_SOURCE}
fi
bsdtar xf sources/linux-${VERSION}.tar.xz
done
EOF
# Apply patches to all kernels and move config files into place
RUN <<EOF
set -e
for VERSION in ${KERNEL_VERSIONS}; do
SERIES=${VERSION%.*}.x
echo "Patching $VERSION $SERIES"
cd /linux-${VERSION}
if [ -d /patches-${SERIES} ]; then
for patch in /patches-${SERIES}/*.patch; do
echo "Applying $patch"
patch -t -F0 -N -u -p1 < "$patch"
done
fi
if [ ${TARGETARCH} = "amd64" ] ; then
cp /config-${SERIES}-x86_64 .config
ARCH=x86 make oldconfig
ls
elif [ ${TARGETARCH} = "arm64" ] ; then
cp /config-${SERIES}-aarch64 .config
ARCH=arm64 make oldconfig
fi
done
EOF
ENTRYPOINT ["/bin/sh"]
FROM scratch
ARG KERNEL_VERSIONS
ARG TARGETARCH
WORKDIR /
COPY --from=kernel-build /linux-${KERNEL_VERSIONS}/.config config-${KERNEL_VERSIONS}-$TARGETARCH