]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
mkosi-initrd: perform basic checks on the kernel dir before calling mkosi
authorAntonio Alvarez Feijoo <antonio.feijoo@suse.com>
Wed, 23 Apr 2025 11:37:09 +0000 (13:37 +0200)
committerAntonio Alvarez Feijoo <antonio.feijoo@suse.com>
Wed, 23 Apr 2025 11:37:09 +0000 (13:37 +0200)
openSUSE ships Kernel Module Packages (KMPs), e.g.:

```
$ rpm -ql nvidia-open-driver-G06-signed-kmp-default
/usr/lib/modules/6.14.0-1-default
/usr/lib/modules/6.14.0-1-default/updates
/usr/lib/modules/6.14.0-1-default/updates/nvidia-open-driver-G06-signed-570.133.07
/usr/lib/modules/6.14.0-1-default/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia-drm.ko.zst
/usr/lib/modules/6.14.0-1-default/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia-modeset.ko.zst
/usr/lib/modules/6.14.0-1-default/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia-uvm.ko.zst
/usr/lib/modules/6.14.0-1-default/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia.ko.zst
```

These KMPs install their kernel modules under the updates folder of a certain
kernel directory, even with that kernel directory without any other content:

```
$ tree /usr/lib/modules/6.14.0-1-default
/usr/lib/modules/6.14.0-1-default
└── updates
    ├── hdaps.ko
    ├── nvidia-open-driver-G06-signed-570.133.07
    │   ├── nvidia-drm.ko.zst
    │   ├── nvidia.ko.zst
    │   ├── nvidia-modeset.ko.zst
    │   └── nvidia-uvm.ko.zst
    ├── thinkpad_ec.ko
    └── tp_smapi.ko
```

That of course will make mkosi fail:

```
$ mkosi-initrd -k 6.14.0-1-default
‣ Validating certificates and keys
‣ Copying repository metadata
‣ Building main image
‣  Copying in sandbox trees…
‣  Installing openSUSE
...
‣  Applying kernel module filters
‣   Running modinfo to fetch kernel module dependencies
modinfo: ERROR: Module nvidia not found.
modinfo: ERROR: Module thinkpad-ec not found.
modinfo: ERROR: Module nvidia-modeset not found.
modinfo: ERROR: Module tp-smapi not found.
modinfo: ERROR: Module hdaps not found.
modinfo: ERROR: Module nvidia-uvm not found.
modinfo: ERROR: Module nvidia-drm not found.
‣ "modinfo --set-version 6.14.0-1-default --null nvidia thinkpad-ec nvidia-modeset tp-smapi hdaps nvidia-uvm nvidia-drm" returned non-zero exit code 1.
```

But, there is no need fail so far (after calling the package manager within
mkosi), some basic checks can be performed before spawning other processes.

mkosi/initrd.py

index c7302733a5643774f25016b8e2c22550109c15a3..3be08f9aa1d1ee0c8cb272958d0b4e13c1e0866c 100644 (file)
@@ -16,7 +16,7 @@ from typing import Optional, cast
 import mkosi.resources
 from mkosi.config import DocFormat, InitrdProfile, OutputFormat
 from mkosi.documentation import show_docs
-from mkosi.log import ARG_DEBUG, ARG_DEBUG_SHELL, log_notice, log_setup
+from mkosi.log import ARG_DEBUG, ARG_DEBUG_SHELL, die, log_notice, log_setup
 from mkosi.run import find_binary, run, uncaught_exception_handler
 from mkosi.sandbox import __version__, umask
 from mkosi.tree import copy_tree, move_tree, rmtree
@@ -145,6 +145,13 @@ def create_parser() -> argparse.ArgumentParser:
     return parser
 
 
+def is_valid_modulesd(modulesd: Path) -> bool:
+    # Check whether a provided kernel modules directory is valid
+    return modulesd.is_dir() and (
+        (modulesd / "modules.dep").exists() or (modulesd / "modules.dep.bin").exists()
+    )
+
+
 def process_crypttab(staging_dir: Path) -> list[str]:
     cmdline = []
 
@@ -289,6 +296,10 @@ def main() -> None:
             show_docs("mkosi-initrd", DocFormat.all(), resources=r)
         return
 
+    modulesd = Path("/usr/lib/modules") / args.kernel_version
+    if not is_valid_modulesd(modulesd):
+        die(f"Invalid kernel directory: {modulesd}")
+
     with (
         tempfile.TemporaryDirectory() as staging_dir,
         tempfile.TemporaryDirectory() as sandbox_tree,
@@ -300,7 +311,7 @@ def main() -> None:
             f"--format={args.format}",
             f"--output={args.output}",
             f"--output-directory={staging_dir}",
-            f"--extra-tree=/usr/lib/modules/{args.kernel_version}:/usr/lib/modules/{args.kernel_version}",
+            f"--extra-tree={modulesd}:{modulesd}",
             "--extra-tree=/usr/lib/firmware:/usr/lib/firmware",
             "--remove-files=/usr/lib/firmware/*-ucode",
             "--build-sources=",
@@ -317,7 +328,7 @@ def main() -> None:
 
         if args.kernel_image:
             cmdline += [
-                f"--extra-tree={args.kernel_image}:/usr/lib/modules/{args.kernel_version}/vmlinuz",
+                f"--extra-tree={args.kernel_image}:{modulesd}/vmlinuz",
             ]
 
         if args.debug: