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.
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(
)
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 (
)
+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 = []
if not args.generic:
cmdline += ["--kernel-modules=host"]
+ cmdline += weak_modules(modulesd)
+
for p in args.profile:
cmdline += ["--profile", p]
if p == "raid":
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()