]> git.ipfire.org Git - thirdparty/mkosi.git/commitdiff
mkosi-initrd: handle symlinks under weak-updates 3702/head
authorAntonio Alvarez Feijoo <antonio.feijoo@suse.com>
Wed, 23 Apr 2025 14:50:28 +0000 (16:50 +0200)
committerAntonio Alvarez Feijoo <antonio.feijoo@suse.com>
Wed, 23 Apr 2025 14:50:28 +0000 (16:50 +0200)
The weak-updates folder of the current kernel directory may contain symlinks to
an old kernel:

```
$ tree /usr/lib/modules/6.14.1-1-default/weak-updates/
/usr/lib/modules/6.14.1-1-default/weak-updates/
└── updates
    ├── hdaps.ko -> /usr/lib/modules/6.14.0-1-default/updates/hdaps.ko
    ├── 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-drm.ko.zst
    │   ├── nvidia.ko.zst -> /usr/lib/modules/6.14.0-1-default/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia.ko.zst
    │   ├── nvidia-modeset.ko.zst -> /usr/lib/modules/6.14.0-1-default/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia-modeset.ko.zst
    │   └── nvidia-uvm.ko.zst -> /usr/lib/modules/6.14.0-1-default/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia-uvm.ko.zst
    ├── thinkpad_ec.ko -> /usr/lib/modules/6.14.0-1-default/updates/thinkpad_ec.ko
    └── tp_smapi.ko -> /usr/lib/modules/6.14.0-1-default/updates/tp_smapi.ko
```

These symlinks to a different kernel directory make mkosi to fail:

```
‣  Applying kernel module filters
‣   Running modinfo to fetch kernel module dependencies
modinfo: ERROR: could not get modinfo from 'nvidia': No such file or directory
libkmod: ERROR: kmod_module_parse_depline: ctx=0x55cda95602a0 path=/usr/lib/modules/6.14.1-1-default/weak-updates/updates/thinkpad_ec.ko error=No such file or directory
modinfo: ERROR: could not get modinfo from 'hdaps': No such file or directory
libkmod: ERROR: kmod_module_parse_depline: ctx=0x55cda95602a0 path=/usr/lib/modules/6.14.1-1-default/weak-updates/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia-modeset.ko.zst error=No such file or directory
modinfo: ERROR: could not get modinfo from 'nvidia_drm': No such file or directory
libkmod: ERROR: kmod_module_parse_depline: ctx=0x55cda95602a0 path=/usr/lib/modules/6.14.1-1-default/weak-updates/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia.ko.zst error=No such file or directory
modinfo: ERROR: could not get modinfo from 'nvidia_uvm': No such file or directory
modinfo: ERROR: could not get modinfo from 'thinkpad_ec': No such file or directory
libkmod: ERROR: kmod_module_parse_depline: ctx=0x55cda95602a0 path=/usr/lib/modules/6.14.1-1-default/weak-updates/updates/nvidia-open-driver-G06-signed-570.133.07/nvidia.ko.zst error=No such file or directory
modinfo: ERROR: could not get modinfo from 'nvidia_modeset': No such file or directory
libkmod: ERROR: kmod_module_parse_depline: ctx=0x55cda95602a0 path=/usr/lib/modules/6.14.1-1-default/weak-updates/updates/thinkpad_ec.ko error=No such file or directory
modinfo: ERROR: could not get modinfo from 'tp_smapi': No such file or directory
```

Also, do not run `depmod` for this old kernel directory that contains only the
`update` directory.

mkosi/__init__.py
mkosi/initrd.py
mkosi/kmod.py

index 3af07f00506da6d7346b493b83ea72a1b855d560..c0b6dc4445253802dfca7a70c52915710ad13ab3 100644 (file)
@@ -2981,7 +2981,9 @@ def run_depmod(context: Context, *, cache: bool = False) -> None:
 
     if not cache:
         for modulesd in (context.root / "usr/lib/modules").glob("*"):
-            if not modulesd.is_dir():
+            if not modulesd.is_dir() or (
+                (modulesd / "updates").exists() and len(list(modulesd.glob("*"))) == 1
+            ):
                 continue
 
             process_kernel_modules(
@@ -3008,7 +3010,7 @@ def run_depmod(context: Context, *, cache: bool = False) -> None:
     )
 
     for modulesd in (context.root / "usr/lib/modules").glob("*"):
-        if not modulesd.is_dir():
+        if not modulesd.is_dir() or ((modulesd / "updates").exists() and len(list(modulesd.glob("*"))) == 1):
             continue
 
         if (
index 3be08f9aa1d1ee0c8cb272958d0b4e13c1e0866c..42e00546eba9b81f447660d0dfd59ee1bddc2fa8 100644 (file)
@@ -152,6 +152,14 @@ def is_valid_modulesd(modulesd: Path) -> bool:
     )
 
 
+def weak_modules(modulesd: Path) -> list[str]:
+    return [
+        f"--extra-tree={m.resolve()}:{m.resolve()}"
+        for m in (modulesd / "weak-updates").rglob("*.ko*")
+        if m.is_symlink()
+    ]
+
+
 def process_crypttab(staging_dir: Path) -> list[str]:
     cmdline = []
 
@@ -321,6 +329,8 @@ def main() -> None:
         if not args.generic:
             cmdline += ["--kernel-modules=host"]
 
+        cmdline += weak_modules(modulesd)
+
         for p in args.profile:
             cmdline += ["--profile", p]
             if p == "raid":
index 0962977973e2505aa0a96d674385d6eab5b5bfd9..1d75b3f3c8f4cdfb8f54d654b1a347090a9f6ec7 100644 (file)
@@ -419,6 +419,10 @@ def process_kernel_modules(
 
             p = context.root / m
             if p.is_file() or p.is_symlink():
+                if p.is_symlink():
+                    p_target = Path(chase(os.fspath(context.root), os.fspath(m)))
+                    if p_target.exists():
+                        p_target.unlink()
                 p.unlink()
             elif p.exists():
                 p.rmdir()