From 2548d57e8af02be0e5f969e28fd04ec6b5088258 Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Mon, 15 Jan 2024 21:29:10 +0100 Subject: [PATCH] Mount package manager cache directories when running scripts When running package managers in host scripts we want the cache to be available as well; --- mkosi/__init__.py | 20 +++++++++---------- mkosi/installer/__init__.py | 39 +++++++++++++++++++++++++++++++------ mkosi/installer/apt.py | 9 +++------ mkosi/installer/dnf.py | 12 +++--------- mkosi/installer/pacman.py | 7 +++---- mkosi/installer/zypper.py | 7 +++---- 6 files changed, 55 insertions(+), 39 deletions(-) diff --git a/mkosi/__init__.py b/mkosi/__init__.py index 7503a77a7..723a05dff 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -48,7 +48,11 @@ from mkosi.config import ( ) from mkosi.context import Context from mkosi.distributions import Distribution -from mkosi.installer import clean_package_manager_metadata, package_manager_scripts +from mkosi.installer import ( + clean_package_manager_metadata, + finalize_package_manager_mounts, + package_manager_scripts, +) from mkosi.kmod import gen_required_kernel_modules, process_kernel_modules from mkosi.log import ARG_DEBUG, complete_step, die, log_notice, log_step from mkosi.manifest import Manifest @@ -65,7 +69,7 @@ from mkosi.run import ( run, unshare, ) -from mkosi.sandbox import chroot_cmd, finalize_crypto_mounts, finalize_passwd_mounts +from mkosi.sandbox import chroot_cmd, finalize_passwd_mounts from mkosi.tree import copy_tree, move_tree, rmtree from mkosi.types import PathString from mkosi.util import ( @@ -458,14 +462,10 @@ def run_prepare_scripts(context: Context, build: bool) -> None: sandbox=context.sandbox( network=True, options=sources + [ - # If the cache dir is /var and the workspace directory is /var/tmp (e.g. in mkosi-initrd), - # then all the files we mount here might be located in the configured cache directory, so - # we have to mount the cache directory first to not override all the other mounts. - "--bind", context.cache_dir, context.cache_dir, "--ro-bind", script, "/work/prepare", "--ro-bind", cd, "/work/scripts", "--bind", context.root, context.root, - *finalize_crypto_mounts(tools=context.config.tools()), + *finalize_package_manager_mounts(context), "--chdir", "/work/src", ], scripts=hd, @@ -546,7 +546,7 @@ def run_build_scripts(context: Context) -> None: if context.config.build_dir else [] ), - *finalize_crypto_mounts(tools=context.config.tools()), + *finalize_package_manager_mounts(context), "--chdir", "/work/src", ], scripts=hd, @@ -606,7 +606,7 @@ def run_postinst_scripts(context: Context) -> None: "--ro-bind", cd, "/work/scripts", "--bind", context.root, context.root, "--bind", context.staging, "/work/out", - *finalize_crypto_mounts(tools=context.config.tools()), + *finalize_package_manager_mounts(context), "--chdir", "/work/src", ], scripts=hd, @@ -666,7 +666,7 @@ def run_finalize_scripts(context: Context) -> None: "--ro-bind", cd, "/work/scripts", "--bind", context.root, context.root, "--bind", context.staging, "/work/out", - *finalize_crypto_mounts(tools=context.config.tools()), + *finalize_package_manager_mounts(context), "--chdir", "/work/src", ], scripts=hd, diff --git a/mkosi/installer/__init__.py b/mkosi/installer/__init__.py index 6135e03e0..e4b99722b 100644 --- a/mkosi/installer/__init__.py +++ b/mkosi/installer/__init__.py @@ -4,14 +4,10 @@ import os from mkosi.config import ConfigFeature from mkosi.context import Context -from mkosi.installer.apt import apt_cmd -from mkosi.installer.dnf import dnf_cmd -from mkosi.installer.pacman import pacman_cmd -from mkosi.installer.rpm import rpm_cmd -from mkosi.installer.zypper import zypper_cmd -from mkosi.sandbox import apivfs_cmd +from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts from mkosi.tree import rmtree from mkosi.types import PathString +from mkosi.util import flatten def clean_package_manager_metadata(context: Context) -> None: @@ -40,6 +36,12 @@ def clean_package_manager_metadata(context: Context) -> None: def package_manager_scripts(context: Context) -> dict[str, list[PathString]]: + from mkosi.installer.apt import apt_cmd + from mkosi.installer.dnf import dnf_cmd + from mkosi.installer.pacman import pacman_cmd + from mkosi.installer.rpm import rpm_cmd + from mkosi.installer.zypper import zypper_cmd + return { "pacman": apivfs_cmd(context.root) + pacman_cmd(context), "zypper": apivfs_cmd(context.root) + zypper_cmd(context), @@ -58,3 +60,28 @@ def package_manager_scripts(context: Context) -> dict[str, list[PathString]]: "apt-sortpkgs", ) } + + +def finalize_package_manager_mounts(context: Context) -> list[PathString]: + from mkosi.installer.dnf import dnf_subdir + + mounts: list[PathString] = [ + *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []), + *(["--ro-bind", os.fspath(p), os.fspath(p)] if (p := context.workspace / "apt.conf").exists() else []), + *finalize_crypto_mounts(tools=context.config.tools()), + ] + + mounts += flatten( + ["--bind", d, d] + for d in ( + context.cache_dir / "lib/apt", + context.cache_dir / "cache/apt", + context.cache_dir / "cache" / dnf_subdir(context), + context.cache_dir / "lib" / dnf_subdir(context), + context.cache_dir / "cache/pacman/pkg", + context.cache_dir / "cache/zypp", + ) + if d.exists() + ) + + return mounts diff --git a/mkosi/installer/apt.py b/mkosi/installer/apt.py index 3ef991cad..0996039fd 100644 --- a/mkosi/installer/apt.py +++ b/mkosi/installer/apt.py @@ -3,9 +3,10 @@ import textwrap from collections.abc import Sequence from mkosi.context import Context +from mkosi.installer import finalize_package_manager_mounts from mkosi.mounts import finalize_ephemeral_source_mounts from mkosi.run import find_binary, run -from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts +from mkosi.sandbox import apivfs_cmd from mkosi.types import PathString from mkosi.util import sort_packages, umask @@ -109,11 +110,7 @@ def invoke_apt( network=True, options=[ "--bind", context.root, context.root, - "--bind", context.cache_dir / "lib/apt", context.cache_dir / "lib/apt", - "--bind", context.cache_dir / "cache/apt", context.cache_dir / "cache/apt", - "--ro-bind", context.workspace / "apt.conf", context.workspace / "apt.conf", - *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []), - *finalize_crypto_mounts(tools=context.config.tools()), + *finalize_package_manager_mounts(context), *sources, *mounts, "--chdir", "/work/src", diff --git a/mkosi/installer/dnf.py b/mkosi/installer/dnf.py index 7c7278257..74d743411 100644 --- a/mkosi/installer/dnf.py +++ b/mkosi/installer/dnf.py @@ -4,10 +4,11 @@ from collections.abc import Iterable from pathlib import Path from mkosi.context import Context +from mkosi.installer import finalize_package_manager_mounts from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, setup_rpm from mkosi.mounts import finalize_ephemeral_source_mounts from mkosi.run import find_binary, run -from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts +from mkosi.sandbox import apivfs_cmd from mkosi.types import PathString from mkosi.util import sort_packages @@ -133,14 +134,7 @@ def invoke_dnf(context: Context, command: str, packages: Iterable[str], apivfs: network=True, options=[ "--bind", context.root, context.root, - "--bind", - context.cache_dir / "cache" / dnf_subdir(context), - context.cache_dir / "cache" / dnf_subdir(context), - "--bind", - context.cache_dir / "lib" / dnf_subdir(context), - context.cache_dir / "lib" / dnf_subdir(context), - *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []), - *finalize_crypto_mounts(tools=context.config.tools()), + *finalize_package_manager_mounts(context), *sources, "--chdir", "/work/src", ], diff --git a/mkosi/installer/pacman.py b/mkosi/installer/pacman.py index e43d0d0bd..08fa7e200 100644 --- a/mkosi/installer/pacman.py +++ b/mkosi/installer/pacman.py @@ -4,9 +4,10 @@ from collections.abc import Iterable, Sequence from typing import NamedTuple from mkosi.context import Context +from mkosi.installer import finalize_package_manager_mounts from mkosi.mounts import finalize_ephemeral_source_mounts from mkosi.run import run -from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts +from mkosi.sandbox import apivfs_cmd from mkosi.types import PathString from mkosi.util import sort_packages, umask @@ -98,9 +99,7 @@ def invoke_pacman( network=True, options=[ "--bind", context.root, context.root, - "--bind", context.cache_dir / "cache/pacman/pkg", context.cache_dir / "cache/pacman/pkg", - *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []), - *finalize_crypto_mounts(tools=context.config.tools()), + *finalize_package_manager_mounts(context), *sources, "--chdir", "/work/src", ], diff --git a/mkosi/installer/zypper.py b/mkosi/installer/zypper.py index a710e0e11..5af2a6977 100644 --- a/mkosi/installer/zypper.py +++ b/mkosi/installer/zypper.py @@ -4,10 +4,11 @@ from collections.abc import Sequence from mkosi.config import yes_no from mkosi.context import Context +from mkosi.installer import finalize_package_manager_mounts from mkosi.installer.rpm import RpmRepository, fixup_rpmdb_location, setup_rpm from mkosi.mounts import finalize_ephemeral_source_mounts from mkosi.run import run -from mkosi.sandbox import apivfs_cmd, finalize_crypto_mounts +from mkosi.sandbox import apivfs_cmd from mkosi.types import PathString from mkosi.util import sort_packages @@ -86,9 +87,7 @@ def invoke_zypper( network=True, options=[ "--bind", context.root, context.root, - "--bind", context.cache_dir / "cache/zypp", context.cache_dir / "cache/zypp", - *(["--ro-bind", m, m] if (m := context.config.local_mirror) else []), - *finalize_crypto_mounts(tools=context.config.tools()), + *finalize_package_manager_mounts(context), *sources, "--chdir", "/work/src", ], -- 2.47.3