From 565b905aa12e3e97b784e75c0b8fe8a2c722ce6a Mon Sep 17 00:00:00 2001 From: Antonio Alvarez Feijoo Date: Wed, 23 Apr 2025 16:50:28 +0200 Subject: [PATCH] mkosi-initrd: handle symlinks under weak-updates MIME-Version: 1.0 Content-Type: text/plain; charset=utf8 Content-Transfer-Encoding: 8bit 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 | 6 ++++-- mkosi/initrd.py | 10 ++++++++++ mkosi/kmod.py | 4 ++++ 3 files changed, 18 insertions(+), 2 deletions(-) diff --git a/mkosi/__init__.py b/mkosi/__init__.py index 3af07f005..c0b6dc444 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -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 ( diff --git a/mkosi/initrd.py b/mkosi/initrd.py index 3be08f9aa..42e00546e 100644 --- a/mkosi/initrd.py +++ b/mkosi/initrd.py @@ -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": diff --git a/mkosi/kmod.py b/mkosi/kmod.py index 096297797..1d75b3f3c 100644 --- a/mkosi/kmod.py +++ b/mkosi/kmod.py @@ -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() -- 2.47.2