diff --git a/mkosi/kmod.py b/mkosi/kmod.py index 91368f5f0..92caa4bf1 100644 --- a/mkosi/kmod.py +++ b/mkosi/kmod.py @@ -10,6 +10,7 @@ from mkosi.log import complete_step, log_step from mkosi.run import chroot_cmd, run +from mkosi.sandbox import chase from mkosi.util import chdir, parents_below @@ -180,6 +181,15 @@ def gen_required_kernel_modules( mods = set(modulesd.rglob("*.ko*")) firmware = set() + # Some firmware dependencies are symbolic links, so the targets for those must be included in the list + # of required firmware files too. Intermediate symlinks are not included, and so links pointing to links + # results in dangling symlinks in the final image. + for fw in firmware.copy(): + if (root / fw).is_symlink(): + target = Path(chase(os.fspath(root), os.fspath(fw))) + if target.exists(): + firmware.add(target.relative_to(root)) + yield from sorted( itertools.chain( { diff --git a/tests/test_initrd.py b/tests/test_initrd.py index f7aa0ba25..5971d6387 100644 --- a/tests/test_initrd.py +++ b/tests/test_initrd.py @@ -225,9 +225,9 @@ def test_initrd_size(config: ImageConfig) -> None: maxsize = 1024**2 * { Distribution.fedora: 63, Distribution.debian: 61, - Distribution.ubuntu: 56, + Distribution.ubuntu: 57, Distribution.arch: 83, Distribution.opensuse: 64, - }.get(config.distribution, 57) + }.get(config.distribution, 58) assert (Path(image.output_dir) / "image.initrd").stat().st_size <= maxsize