diff --git a/tools/docker/Makefile b/tools/docker/Makefile index 5a00e96678d..7eb80bbae10 100644 --- a/tools/docker/Makefile +++ b/tools/docker/Makefile @@ -101,7 +101,13 @@ LINUX_KERNEL_VERSIONS := 4.14.304 \ 5.18.19 \ 5.19.17 \ 6.0.19 \ - 6.1.8 + 6.1.8 \ + 6.2.16 \ + 6.3.13 \ + 6.6.53 \ + 6.8.12 \ + 6.10.12 \ + 6.11.1 LINUX_HEADER_X86_64_TEMPLATE := linux-headers-x86_64-%.tar.gz LINUX_HEADER_ARM64_TEMPLATE := linux-headers-arm64-%.tar.gz @@ -210,8 +216,19 @@ ifndef LINUX_HEADERS_REV $(error set LINUX_HEADERS_REV to a valid value) endif @mkdir -p $(@D) + # Linux 6.3 and later has differences in the build process. + # We need to use a different Dockerfile for these versions. + KERN_MAJ=$$(echo $* | cut -d. -f1); \ + KERN_MIN=$$(echo $* | cut -d. -f2); \ + HEADERS_DOCKERFILE_SUFFIX=""; \ + if [ $${KERN_MAJ} -lt 6 ] || { [ $${KERN_MAJ} -le 6 ] && [ $${KERN_MIN} -lt 3 ]; }; then \ + HEADERS_DOCKERFILE_SUFFIX=".bionic"; \ + fi; \ linux_headers_image_tag="gcr.io/pixie-oss/pixie-dev-public:$*-$(LINUX_HEADERS_REV)"; \ - $(DOCKER) build --build-arg KERN_VERSION=$* --build-arg ARCH=x86_64 linux_headers_image -t "$${linux_headers_image_tag}" && \ + $(DOCKER) build --build-arg KERN_VERSION=$* \ + --build-arg ARCH=x86_64 linux_headers_image \ + -t "$${linux_headers_image_tag}" \ + -f linux_headers_image/Dockerfile$${HEADERS_DOCKERFILE_SUFFIX} && \ $(DOCKER) run --rm -v $(PWD)/$(LINUX_HEADER_ASSETS_BUILD_DIR):/output "$${linux_headers_image_tag}" $(LINUX_HEADER_ASSETS_BUILD_DIR)/linux-headers-arm64-%.tar.gz: linux_headers_image/Dockerfile linux_headers_image/arm64_config @@ -219,10 +236,19 @@ ifndef LINUX_HEADERS_REV $(error set LINUX_HEADERS_REV to a valid value) endif @mkdir -p $(@D) + # Linux 6.3 and later has differences in the build process. + # We need to use a different Dockerfile for these versions. + KERN_MAJ=$$(echo $* | cut -d. -f1); \ + KERN_MIN=$$(echo $* | cut -d. -f2); \ + HEADERS_DOCKERFILE_SUFFIX=""; \ + if [ $${KERN_MAJ} -lt 6 ] || { [ $${KERN_MAJ} -le 6 ] && [ $${KERN_MIN} -lt 3 ]; }; then \ + HEADERS_DOCKERFILE_SUFFIX=".bionic"; \ + fi; \ linux_headers_image_tag="gcr.io/pixie-oss/pixie-dev-public:$*-$(LINUX_HEADERS_REV)"; \ $(DOCKER) build --build-arg KERN_VERSION=$* \ --build-arg ARCH=arm64 \ --build-arg CROSS_COMPILE=aarch64-linux-gnu- \ + -f linux_headers_image/Dockerfile$${HEADERS_DOCKERFILE_SUFFIX} \ linux_headers_image -t "$${linux_headers_image_tag}" && \ $(DOCKER) run --rm -v $(PWD)/$(LINUX_HEADER_ASSETS_BUILD_DIR):/output "$${linux_headers_image_tag}" diff --git a/tools/docker/linux_headers_image/Dockerfile b/tools/docker/linux_headers_image/Dockerfile index 3088821d1f6..1b50ab28ce6 100644 --- a/tools/docker/linux_headers_image/Dockerfile +++ b/tools/docker/linux_headers_image/Dockerfile @@ -14,12 +14,13 @@ # # SPDX-License-Identifier: Apache-2.0 -FROM ubuntu:18.04@sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005931b +# debhelper-compat (= 12) needed for kernels >= 6.3 +FROM ubuntu:20.04@sha256:6d8d9799fe6ab3221965efac00b4c34a2bcc102c086a58dff9e19a08b913c7ef # Install required packages RUN apt-get update RUN apt-get upgrade -y -q -RUN apt-get install -y -q build-essential \ +RUN DEBIAN_FRONTEND=noninteractive apt-get install -y -q build-essential \ bc \ libelf-dev \ libssl-dev \ @@ -32,6 +33,7 @@ RUN apt-get install -y -q build-essential \ binutils-aarch64-linux-gnu \ gcc-aarch64-linux-gnu \ dwarves \ + debhelper \ python3 ARG KERN_VERSION @@ -54,11 +56,12 @@ WORKDIR /px/src/linux-${KERN_VERSION} RUN cp /configs/${ARCH} .config RUN make ARCH=${ARCH} olddefconfig RUN make ARCH=${ARCH} clean -RUN make ARCH=${ARCH} -j $(nproc) deb-pkg LOCALVERSION=-pl +RUN make ARCH=${ARCH} -j $(nproc) bindeb-pkg LOCALVERSION=-pl # Extract headers into a tarball WORKDIR /px -RUN DEB_ARCH=$(echo ${ARCH} | sed 's/x86_64/amd64/g'); dpkg -x src/linux-headers-${KERN_VERSION}-pl_${KERN_VERSION}-pl-1_${DEB_ARCH}.deb . +# Linux 6.3 and later name the resulting package differently (there is no additional -pl suffix) +RUN DEB_ARCH=$(echo ${ARCH} | sed 's/x86_64/amd64/g'); dpkg -x src/linux-headers-${KERN_VERSION}-pl_${KERN_VERSION}-1_${DEB_ARCH}.deb . # Remove broken symlinks RUN find usr/src/linux-headers-${KERN_VERSION}-pl -xtype l -exec rm {} + diff --git a/tools/docker/linux_headers_image/Dockerfile.bionic b/tools/docker/linux_headers_image/Dockerfile.bionic new file mode 100644 index 00000000000..3088821d1f6 --- /dev/null +++ b/tools/docker/linux_headers_image/Dockerfile.bionic @@ -0,0 +1,78 @@ +# Copyright 2018- The Pixie Authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# http://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# +# SPDX-License-Identifier: Apache-2.0 + +FROM ubuntu:18.04@sha256:8aa9c2798215f99544d1ce7439ea9c3a6dfd82de607da1cec3a8a2fae005931b + +# Install required packages +RUN apt-get update +RUN apt-get upgrade -y -q +RUN apt-get install -y -q build-essential \ + bc \ + libelf-dev \ + libssl-dev \ + flex \ + bison \ + kmod \ + cpio \ + rsync \ + wget \ + binutils-aarch64-linux-gnu \ + gcc-aarch64-linux-gnu \ + dwarves \ + python3 + +ARG KERN_VERSION + +# Download Linux sources +WORKDIR /px/src +RUN KERN_MAJ="$(echo "${KERN_VERSION}" | cut -d'.' -f1)"; \ + wget -nv http://mirrors.edge.kernel.org/pub/linux/kernel/v${KERN_MAJ}.x/linux-${KERN_VERSION}.tar.gz +RUN tar zxf linux-${KERN_VERSION}.tar.gz + +WORKDIR /configs +ADD x86_64_config /configs/x86_64 +ADD arm64_config /configs/arm64 + +ARG ARCH +ARG CROSS_COMPILE + +# Build Linux kernel +WORKDIR /px/src/linux-${KERN_VERSION} +RUN cp /configs/${ARCH} .config +RUN make ARCH=${ARCH} olddefconfig +RUN make ARCH=${ARCH} clean +RUN make ARCH=${ARCH} -j $(nproc) deb-pkg LOCALVERSION=-pl + +# Extract headers into a tarball +WORKDIR /px +RUN DEB_ARCH=$(echo ${ARCH} | sed 's/x86_64/amd64/g'); dpkg -x src/linux-headers-${KERN_VERSION}-pl_${KERN_VERSION}-pl-1_${DEB_ARCH}.deb . + +# Remove broken symlinks +RUN find usr/src/linux-headers-${KERN_VERSION}-pl -xtype l -exec rm {} + + +# Remove uneeded files to reduce size +# Keep only: +# - usr/src/linux-headers-x.x.x-pl/include +# - usr/src/linux-headers-x.x.x-pl/arch/${ARCH} +# This reduces the size by a little over 2x. +RUN rm -rf usr/share +RUN find usr/src/linux-headers-${KERN_VERSION}-pl -maxdepth 1 -mindepth 1 ! -name include ! -name arch -type d \ + -exec rm -rf {} + +RUN find usr/src/linux-headers-${KERN_VERSION}-pl/arch -maxdepth 1 -mindepth 1 ! -name $(echo ${ARCH} | sed 's/x86_64/x86/g') -type d -exec rm -rf {} + +RUN tar zcf linux-headers-${ARCH}-${KERN_VERSION}.tar.gz usr + +VOLUME /output +CMD ["sh", "-c", "cp linux-headers-*.tar.gz /output/"]