From 82c7118de9e56f908cdd0f1974de2d8ff80d64ec Mon Sep 17 00:00:00 2001 From: Rolf Neugebauer Date: Mon, 24 Apr 2017 14:50:12 +0100 Subject: [PATCH] kernels: Create LinuKit kernel images from Ubuntu mainline The Ubuntu mainline PPA has kernel.org based kernels for many kernel releaseis. This commit adds suport for downloading and converting the 3.16.x long long term support kernel as well as the current 4.x series. The "mainline.sh" script only downloads/processes kernels which have not yet been put on Hub. The kernels are stored under "linuxkit/kernel-mainline" and are tagged with the kernel version. Signed-off-by: Rolf Neugebauer --- scripts/kernels/Dockerfile.deb | 24 +++++++++++++++++ scripts/kernels/mainline.sh | 49 ++++++++++++++++++++++++++++++++++ 2 files changed, 73 insertions(+) create mode 100644 scripts/kernels/Dockerfile.deb create mode 100755 scripts/kernels/mainline.sh diff --git a/scripts/kernels/Dockerfile.deb b/scripts/kernels/Dockerfile.deb new file mode 100644 index 000000000..e5ba75a67 --- /dev/null +++ b/scripts/kernels/Dockerfile.deb @@ -0,0 +1,24 @@ +FROM alpine:3.5 AS extract + +ARG DEB_URLS + +RUN apk add --no-cache curl dpkg tar && true +WORKDIR /deb +RUN mkdir extract +RUN for url in ${DEB_URLS}; do \ + echo "Extracting: $url"; \ + curl -fsSL -o dl.deb $url && \ + dpkg-deb -x dl.deb . ;\ + done + +RUN mkdir /out +RUN cp -a boot/vmlinuz-* /out/kernel +RUN cp -a boot/config-* /out/kernel_config +RUN tar cf /out/kernel.tar lib +RUN tar cf /out/kernel-dev.tar usr + +FROM linuxkit/toybox-media:d7e82a7d19ccc84c9071fa7a88ecaa58ae958f7c@sha256:4c7d25f2be2429cd08417c36e04161cb924e46f3e419ee33a0aa9ff3a0942e02 +WORKDIR / +ENTRYPOINT [] +CMD [] +COPY --from=extract /out/* / diff --git a/scripts/kernels/mainline.sh b/scripts/kernels/mainline.sh new file mode 100755 index 000000000..d93d9d55a --- /dev/null +++ b/scripts/kernels/mainline.sh @@ -0,0 +1,49 @@ +#! /bin/sh + +REPO="linuxkit/kernel-mainline" +BASE_URL=http://kernel.ubuntu.com/~kernel-ppa/mainline + +build_image() { + VERSION=$1 + KDIR=$2 + ARCH=amd64 + + LINKS=$(curl -s ${BASE_URL}/${KDIR}/ | \ + sed -n 's/.*href="\([^"]*\).*/\1/p') + + IMAGE=$(echo $LINKS | \ + grep -o "linux-image[^ ]\+-generic[^ ]\+${ARCH}.deb" | head -1) + [ -z "${IMAGE}" ] && return 1 + HDR_GEN=$(echo $LINKS | grep -o "linux-headers[^ ]\+_all.deb" | head -1) + [ -z "${HDR_GEN}" ] && return 1 + HDR_ARCH=$(echo $LINKS | \ + grep -o "linux-headers[^ ]\+-generic[^ ]\+${ARCH}.deb" | head -1) + [ -z "${HDR_ARCH}" ] && return 1 + + DEB_URL=${BASE_URL}/${KDIR}/${IMAGE} + HDR_GEN_URL=${BASE_URL}/${KDIR}/${HDR_GEN} + HDR_ARCH_URL=${BASE_URL}/${KDIR}/${HDR_ARCH} + echo "Trying to fetch ${VERSION} from ${DEB_URL}" + + docker build -t ${REPO}:${VERSION} -f Dockerfile.deb --no-cache \ + --build-arg DEB_URLS="${DEB_URL} ${HDR_GEN_URL} ${HDR_ARCH_URL}" . +} + +LINKS=$(curl -s ${BASE_URL}/ | sed -n 's/.*href="\([^"]*\).*/\1/p') +# Extract all kernel versions (drop RCs, ckt(?) and other links) +VERSIONS=$(echo $LINKS | grep -o "v[0-9]\+\.[0-9]\+\.[0-9]\+[^ ]*" | \ + grep -ve '-rc' | grep -ve '-ckt' | uniq) + +# Extract 3.16.x and 4.x.x +THREES=$(echo $VERSIONS | grep -o "v3\.16\.[0-9]\+[^ ]*") +FOURS=$(echo $VERSIONS | grep -o "v4\.[0-9]\+\.[0-9]\+[^ ]*") +KDIRS="${THREES} ${FOURS}" + +for KDIR in $KDIRS; do + # Strip the Ubuntu release name for the tag and also the 'v' like with + # the other kernel packages + VERSION=$(echo $KDIR | grep -o "[0-9]\+\.[0-9]\+\.[0-9]\+") + DOCKER_CONTENT_TRUST=1 docker pull ${REPO}:${VERSION} && continue + build_image ${VERSION} ${KDIR} && \ + DOCKER_CONTENT_TRUST=1 docker push ${REPO}:${VERSION} +done