From 18d5de0d0ceb5db146c7a868b4b06afd4ca637c9 Mon Sep 17 00:00:00 2001 From: Daniel Zatovic Date: Thu, 29 May 2025 15:57:12 +0200 Subject: [PATCH] build_library: Fix depmod issues with sysext kmods OS-dependent sysexts that ship kernel modules, usually also ship the files in /usr/lib/modules/*-flatcar/modules.XXX When multiple such sysexts get activated, depmod files from just one sysext win and other kernel modules cannot be loaded using modprobe. We get around this by removing the depmod files from every sysext with kernel modules. Instead, we set up modprobe hook, which dynamically runs depmod in a temporary directory on every sysext kernel module activation. Signed-off-by: Daniel Zatovic --- .../sysext_mangle_flatcar-nvidia-drivers-535 | 14 ++++++ ...ext_mangle_flatcar-nvidia-drivers-535-open | 1 + .../sysext_mangle_flatcar-nvidia-drivers-550 | 1 + ...ext_mangle_flatcar-nvidia-drivers-550-open | 1 + .../sysext_mangle_flatcar-nvidia-drivers-570 | 1 + ...ext_mangle_flatcar-nvidia-drivers-570-open | 1 + build_library/sysext_mangle_flatcar-zfs | 4 ++ build_library/sysext_mangle_kmod | 48 +++++++++++++++++++ 8 files changed, 71 insertions(+) create mode 100755 build_library/sysext_mangle_flatcar-nvidia-drivers-535 create mode 120000 build_library/sysext_mangle_flatcar-nvidia-drivers-535-open create mode 120000 build_library/sysext_mangle_flatcar-nvidia-drivers-550 create mode 120000 build_library/sysext_mangle_flatcar-nvidia-drivers-550-open create mode 120000 build_library/sysext_mangle_flatcar-nvidia-drivers-570 create mode 120000 build_library/sysext_mangle_flatcar-nvidia-drivers-570-open create mode 100644 build_library/sysext_mangle_kmod diff --git a/build_library/sysext_mangle_flatcar-nvidia-drivers-535 b/build_library/sysext_mangle_flatcar-nvidia-drivers-535 new file mode 100755 index 00000000000..40cb56d05c6 --- /dev/null +++ b/build_library/sysext_mangle_flatcar-nvidia-drivers-535 @@ -0,0 +1,14 @@ +#!/bin/bash + +set -euo pipefail + +SCRIPT_NAME=$(basename "$(realpath "${BASH_SOURCE[0]}")") +SYSEXT_NAME=${SCRIPT_NAME#sysext_mangle_} +SYSEXT_NAME=${SYSEXT_NAME%.sh} +DIR=$(dirname "$(realpath "${BASH_SOURCE[0]}")") +. "$DIR/sysext_mangle_kmod" + +rootfs="${1}" + +cd "${rootfs}" +configure_modprobe "$SYSEXT_NAME" diff --git a/build_library/sysext_mangle_flatcar-nvidia-drivers-535-open b/build_library/sysext_mangle_flatcar-nvidia-drivers-535-open new file mode 120000 index 00000000000..25e899f70a6 --- /dev/null +++ b/build_library/sysext_mangle_flatcar-nvidia-drivers-535-open @@ -0,0 +1 @@ +sysext_mangle_flatcar-nvidia-drivers-535 \ No newline at end of file diff --git a/build_library/sysext_mangle_flatcar-nvidia-drivers-550 b/build_library/sysext_mangle_flatcar-nvidia-drivers-550 new file mode 120000 index 00000000000..25e899f70a6 --- /dev/null +++ b/build_library/sysext_mangle_flatcar-nvidia-drivers-550 @@ -0,0 +1 @@ +sysext_mangle_flatcar-nvidia-drivers-535 \ No newline at end of file diff --git a/build_library/sysext_mangle_flatcar-nvidia-drivers-550-open b/build_library/sysext_mangle_flatcar-nvidia-drivers-550-open new file mode 120000 index 00000000000..25e899f70a6 --- /dev/null +++ b/build_library/sysext_mangle_flatcar-nvidia-drivers-550-open @@ -0,0 +1 @@ +sysext_mangle_flatcar-nvidia-drivers-535 \ No newline at end of file diff --git a/build_library/sysext_mangle_flatcar-nvidia-drivers-570 b/build_library/sysext_mangle_flatcar-nvidia-drivers-570 new file mode 120000 index 00000000000..25e899f70a6 --- /dev/null +++ b/build_library/sysext_mangle_flatcar-nvidia-drivers-570 @@ -0,0 +1 @@ +sysext_mangle_flatcar-nvidia-drivers-535 \ No newline at end of file diff --git a/build_library/sysext_mangle_flatcar-nvidia-drivers-570-open b/build_library/sysext_mangle_flatcar-nvidia-drivers-570-open new file mode 120000 index 00000000000..25e899f70a6 --- /dev/null +++ b/build_library/sysext_mangle_flatcar-nvidia-drivers-570-open @@ -0,0 +1 @@ +sysext_mangle_flatcar-nvidia-drivers-535 \ No newline at end of file diff --git a/build_library/sysext_mangle_flatcar-zfs b/build_library/sysext_mangle_flatcar-zfs index 13e9135b3c7..e9ffdb11861 100755 --- a/build_library/sysext_mangle_flatcar-zfs +++ b/build_library/sysext_mangle_flatcar-zfs @@ -3,6 +3,9 @@ set -euo pipefail rootfs="${1}" +DIR="$(dirname "$(realpath "${BASH_SOURCE[0]}")")" +. "$DIR/sysext_mangle_kmod" + pushd "${rootfs}" rm -rf ./usr/{lib/debug/,lib64/cmake/,include/} @@ -40,4 +43,5 @@ cat <./usr/lib/systemd/system/systemd-udevd.service.d/10-zfs.conf [Unit] After=systemd-sysext.service EOF +configure_modprobe flatcar-zfs popd diff --git a/build_library/sysext_mangle_kmod b/build_library/sysext_mangle_kmod new file mode 100644 index 00000000000..b00d48914a6 --- /dev/null +++ b/build_library/sysext_mangle_kmod @@ -0,0 +1,48 @@ +#!/bin/bash + +configure_modprobe() { + local sysext_name="${1}" + shift + + local module_directories=(./usr/lib/modules/*-flatcar/) + + mkdir -p ./usr/lib/modprobe.d/ + for module_name in $(find "${module_directories[@]}" -type f \( -name "*.ko" -o -name "*.ko.*" \) -printf "%f\n" | sed -E 's/\.ko(\.\w+)?$//'); do + cat <> "./usr/lib/modprobe.d/10-${sysext_name}-kmod-sysext.conf" +install $module_name /usr/local/bin/_${sysext_name}_modprobe_helper $module_name +remove $module_name /usr/local/bin/_${sysext_name}_modprobe_helper -r $module_name +EOF + done + + mkdir -p ./usr/local/bin/ + install -m0755 -D /dev/stdin "./usr/local/bin/_${sysext_name}_modprobe_helper" <<'EOF' +#!/bin/bash + +set -euo pipefail + +action="Loading" +for arg in "$@"; do + if [[ $arg == "-r" ]]; then + action="Unloading" + fi +done +echo "$action kernel module from a sysext..." + +KMOD_PATH=/usr/lib/modules/$(uname -r) +TMP_DIR=$(mktemp -d) +trap "rm -rf -- '${TMP_DIR}'" EXIT +mkdir "${TMP_DIR}"/{upper,work} + +unshare -m bash -s -- "${@}" <