pkg/firmware: Add a package with firmware required by enabled device drivers

This new 'firmware' package contains the firmware blobs required
by the device drivers in a LinuxKit kernel. The list of required
blobs is determined by calling 'modinfo' on each module.

We also unconditionally include the AMD CPU microcode and the
licence files.

Signed-off-by: Rolf Neugebauer <rolf.neugebauer@docker.com>
This commit is contained in:
Rolf Neugebauer 2018-01-16 15:16:24 +00:00
parent f09d0227bc
commit 1d9c4361c0
3 changed files with 58 additions and 0 deletions

44
pkg/firmware/Dockerfile Normal file
View File

@ -0,0 +1,44 @@
# Make modules from a recentish kernel available
FROM linuxkit/kernel:4.14.12 AS kernel
FROM linuxkit/alpine:34518265c6cb63ff02074549cc5b64bef40c336f AS build
RUN apk add --no-cache git kmod
# Clone the firmware repository
# Make sure you also update the FW_COMMIT in ../firmware-all/Dockerfile
ENV FW_URL=git://git.kernel.org/pub/scm/linux/kernel/git/firmware/linux-firmware.git
ENV FW_COMMIT=65b1c68c63f974d72610db38dfae49861117cae2
WORKDIR /
RUN git clone ${FW_URL} && \
cd /linux-firmware && \
git checkout ${FW_COMMIT}
# Copy files we always need/want: Licenses, docs and AMD CPU microcode
WORKDIR /linux-firmware
RUN set -e && \
mkdir -p /out/lib/firmware && \
cp README WHENCE /out/lib/firmware && \
cp GPL-? LICENSE.* LICENCE.* /out/lib/firmware && \
case $(uname -m) in \
x86_64) \
cp -r amd-ucode /out/lib/firmware; \
;; \
esac
# Extract kernel modules for
WORKDIR /
COPY --from=kernel /kernel.tar /kernel.tar
RUN tar xf /kernel.tar
# Copy files required by the modules
RUN set -e && \
for fw in $(find /lib/modules -name \*.ko -exec modinfo --field=firmware {} \;); do \
mkdir -p "/out/lib/firmware/$fw" && \
cp "/linux-firmware/$fw" "/out/lib/firmware/$fw"; \
done
FROM scratch
WORKDIR /
ENTRYPOINT []
COPY --from=build /out/lib/ /lib/

12
pkg/firmware/README.md Normal file
View File

@ -0,0 +1,12 @@
The `firmware` package contains updated firmware files required by any
driver compiled as a module. Based on the modules included in a recent
LinuxKit kernel, copy the required firmware binaries as reported by
'modinfo'. We deliberately do *not* pick the latest version here to
prevent it being updated on kernel updates. Firmware revisions do not
change very often and we expect older and newer kernels to work with a
range of firmware binaries.
Note: The current mechanism only handles firmware blobs required by
modules and ignores firmware blobs required by drivers compiled into
the kernel. However, with the LinuxKit kernels we typically compile
all hardware drivers as modules.

2
pkg/firmware/build.yml Normal file
View File

@ -0,0 +1,2 @@
image: firmware
network: true