From: Daan De Meyer Date: Mon, 22 Jul 2024 05:46:13 +0000 (+0200) Subject: Stop mounting build sources when running package managers X-Git-Tag: v24~21^2~1 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=e9d66c37e6c7db5b4230c81b9f5bb46ab47c7dcf;p=thirdparty%2Fmkosi.git Stop mounting build sources when running package managers We now have PackageDirectories= to make local packages available for installation so let's stop mounting build sources when running package managers and tell users to use PackageDirectories= instead. --- diff --git a/NEWS.md b/NEWS.md index fa8274d48..01efe912d 100644 --- a/NEWS.md +++ b/NEWS.md @@ -6,6 +6,9 @@ other architectures) has been removed. The required `console=` argument to have the kernel output to the serial console has to be added manually from `v24` onwards. +- Support for installing local packages located in directories in + `BuildSources=` was dropped. Instead, the packages can be made + available for installation via `PackageManagerTrees=`. ## v23.1 diff --git a/mkosi/installer/apt.py b/mkosi/installer/apt.py index 2dd816d1f..772257557 100644 --- a/mkosi/installer/apt.py +++ b/mkosi/installer/apt.py @@ -1,7 +1,6 @@ # SPDX-License-Identifier: LGPL-2.1-or-later import dataclasses -import os import textwrap from collections.abc import Iterable, Sequence from pathlib import Path @@ -11,7 +10,6 @@ from mkosi.config import PACKAGE_GLOBS, Config, ConfigFeature from mkosi.context import Context from mkosi.installer import PackageManager from mkosi.log import die -from mkosi.mounts import finalize_source_mounts from mkosi.run import run from mkosi.sandbox import Mount, apivfs_cmd from mkosi.types import _FILE, CompletedProcess, PathString @@ -213,25 +211,20 @@ class Apt(PackageManager): mounts: Sequence[Mount] = (), stdout: _FILE = None, ) -> CompletedProcess: - with finalize_source_mounts( - context.config, - ephemeral=os.getuid() == 0 and context.config.build_sources_ephemeral, - ) as sources: - return run( - cls.cmd(context, "apt-get") + [operation, *arguments], - sandbox=( - context.sandbox( - binary="apt-get", - network=True, - vartmp=True, - mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *sources, *mounts], - options=["--dir", "/work/src", "--chdir", "/work/src"], - extra=apivfs_cmd() if apivfs else [] - ) - ), - env=context.config.environment | cls.finalize_environment(context), - stdout=stdout, - ) + return run( + cls.cmd(context, "apt-get") + [operation, *arguments], + sandbox=( + context.sandbox( + binary="apt-get", + network=True, + vartmp=True, + mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *mounts], + extra=apivfs_cmd() if apivfs else [] + ) + ), + env=context.config.environment | cls.finalize_environment(context), + stdout=stdout, + ) @classmethod def sync(cls, context: Context, force: bool) -> None: diff --git a/mkosi/installer/dnf.py b/mkosi/installer/dnf.py index 12b77b889..10e230f3a 100644 --- a/mkosi/installer/dnf.py +++ b/mkosi/installer/dnf.py @@ -1,5 +1,4 @@ # SPDX-License-Identifier: LGPL-2.1-or-later -import os import textwrap from collections.abc import Iterable, Sequence from pathlib import Path @@ -9,7 +8,6 @@ from mkosi.context import Context from mkosi.installer import PackageManager from mkosi.installer.rpm import RpmRepository, rpm_cmd from mkosi.log import ARG_DEBUG -from mkosi.mounts import finalize_source_mounts from mkosi.run import run from mkosi.sandbox import Mount, apivfs_cmd from mkosi.types import _FILE, CompletedProcess, PathString @@ -194,25 +192,20 @@ class Dnf(PackageManager): cached_metadata: bool = True, ) -> CompletedProcess: try: - with finalize_source_mounts( - context.config, - ephemeral=os.getuid() == 0 and context.config.build_sources_ephemeral, - ) as sources: - return run( - cls.cmd(context, cached_metadata=cached_metadata) + [operation, *arguments], - sandbox=( - context.sandbox( - binary=cls.executable(context.config), - network=True, - vartmp=True, - mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *sources], - options=["--dir", "/work/src", "--chdir", "/work/src"], - extra=apivfs_cmd() if apivfs else [], - ) - ), - env=context.config.environment | cls.finalize_environment(context), - stdout=stdout, - ) + return run( + cls.cmd(context, cached_metadata=cached_metadata) + [operation, *arguments], + sandbox=( + context.sandbox( + binary=cls.executable(context.config), + network=True, + vartmp=True, + mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context)], + extra=apivfs_cmd() if apivfs else [], + ) + ), + env=context.config.environment | cls.finalize_environment(context), + stdout=stdout, + ) finally: # dnf interprets the log directory relative to the install root so there's nothing we can do but to remove # the log files from the install root afterwards. diff --git a/mkosi/installer/pacman.py b/mkosi/installer/pacman.py index cc17987c2..b3219a917 100644 --- a/mkosi/installer/pacman.py +++ b/mkosi/installer/pacman.py @@ -1,7 +1,6 @@ # SPDX-License-Identifier: LGPL-2.1-or-later import dataclasses -import os import shutil import textwrap from collections.abc import Iterable, Sequence @@ -10,7 +9,6 @@ from pathlib import Path from mkosi.config import Config from mkosi.context import Context from mkosi.installer import PackageManager -from mkosi.mounts import finalize_source_mounts from mkosi.run import run from mkosi.sandbox import Mount, apivfs_cmd from mkosi.types import _FILE, CompletedProcess, PathString @@ -162,25 +160,20 @@ class Pacman(PackageManager): apivfs: bool = False, stdout: _FILE = None, ) -> CompletedProcess: - with finalize_source_mounts( - context.config, - ephemeral=os.getuid() == 0 and context.config.build_sources_ephemeral, - ) as sources: - return run( - cls.cmd(context) + [operation, *arguments], - sandbox=( - context.sandbox( - binary="pacman", - network=True, - vartmp=True, - mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *sources], - options=["--dir", "/work/src", "--chdir", "/work/src"], - extra=apivfs_cmd() if apivfs else [], - ) - ), - env=context.config.environment | cls.finalize_environment(context), - stdout=stdout, - ) + return run( + cls.cmd(context) + [operation, *arguments], + sandbox=( + context.sandbox( + binary="pacman", + network=True, + vartmp=True, + mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context)], + extra=apivfs_cmd() if apivfs else [], + ) + ), + env=context.config.environment | cls.finalize_environment(context), + stdout=stdout, + ) @classmethod def sync(cls, context: Context, force: bool) -> None: diff --git a/mkosi/installer/zypper.py b/mkosi/installer/zypper.py index b93c27096..d58c6a6b8 100644 --- a/mkosi/installer/zypper.py +++ b/mkosi/installer/zypper.py @@ -1,6 +1,5 @@ # SPDX-License-Identifier: LGPL-2.1-or-later import hashlib -import os import textwrap from collections.abc import Iterable, Sequence from pathlib import Path @@ -9,7 +8,6 @@ from mkosi.config import Config, yes_no from mkosi.context import Context from mkosi.installer import PackageManager from mkosi.installer.rpm import RpmRepository, rpm_cmd -from mkosi.mounts import finalize_source_mounts from mkosi.run import run from mkosi.sandbox import Mount, apivfs_cmd from mkosi.types import _FILE, CompletedProcess, PathString @@ -127,25 +125,20 @@ class Zypper(PackageManager): apivfs: bool = False, stdout: _FILE = None, ) -> CompletedProcess: - with finalize_source_mounts( - context.config, - ephemeral=os.getuid() == 0 and context.config.build_sources_ephemeral, - ) as sources: - return run( - cls.cmd(context) + [operation, *arguments], - sandbox=( - context.sandbox( - binary="zypper", - network=True, - vartmp=True, - mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context), *sources], - options=["--dir", "/work/src", "--chdir", "/work/src"], - extra=apivfs_cmd() if apivfs else [], - ) - ), - env=context.config.environment | cls.finalize_environment(context), - stdout=stdout, - ) + return run( + cls.cmd(context) + [operation, *arguments], + sandbox=( + context.sandbox( + binary="zypper", + network=True, + vartmp=True, + mounts=[Mount(context.root, "/buildroot"), *cls.mounts(context)], + extra=apivfs_cmd() if apivfs else [], + ) + ), + env=context.config.environment | cls.finalize_environment(context), + stdout=stdout, + ) @classmethod def sync(cls, context: Context, force: bool, arguments: Sequence[str] = ()) -> None: diff --git a/mkosi/resources/mkosi.md b/mkosi/resources/mkosi.md index bf34a42b1..3438ec66b 100644 --- a/mkosi/resources/mkosi.md +++ b/mkosi/resources/mkosi.md @@ -736,17 +736,6 @@ boolean argument: either `1`, `yes`, or `true` to enable, or `0`, `no`, python3dist(mypy) ``` - Note that since mkosi runs in a sandbox with most of the host files - unavailable, any local packages have to be mounted into the sandbox - explicitly using `BuildSources=`. For example, let's say we have a - local package located at `../my-packages/abc.rpm` relative to the mkosi - working directory, then we'd be able to install it as follows: - - ```ini - BuildSources=../my-packages:my-packages-in-sandbox - Packages=my-packages-in-sandbox/abc.rpm - ``` - `BuildPackages=`, `--build-package=` : Similar to `Packages=`, but configures packages to install only in an overlay that is made available on top of the image to the prepare