From: Daan De Meyer Date: Thu, 22 Aug 2024 11:42:20 +0000 (+0200) Subject: Move creation of context.root out of Context() X-Git-Tag: v25~348^2 X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=refs%2Fpull%2F2967%2Fhead;p=thirdparty%2Fmkosi.git Move creation of context.root out of Context() On btrfs systems, we're unnecessarily creating a subvolume only to remove it again immediately afterwards if we're building from a cached image. So let's move the creation of root outside of Context() so we can only create it as a subvolume after we've potentially checked caches first. --- diff --git a/mkosi/__init__.py b/mkosi/__init__.py index 68917f5d2..9cc374e7a 100644 --- a/mkosi/__init__.py +++ b/mkosi/__init__.py @@ -89,7 +89,7 @@ from mkosi.sandbox import ( unshare, userns_has_single_user, ) -from mkosi.tree import copy_tree, move_tree, rmtree +from mkosi.tree import copy_tree, make_tree, move_tree, rmtree from mkosi.types import PathString from mkosi.user import INVOKING_USER from mkosi.util import ( @@ -3877,6 +3877,19 @@ def createrepo(context: Context) -> Iterator[None]: context.config.distribution.createrepo(context) +def make_rootdir(context: Context) -> None: + if context.root.exists(): + return + + with umask(~0o755): + # Using a btrfs subvolume as the upperdir in an overlayfs results in EXDEV so make sure we create + # the root directory as a regular directory if the Overlay= option is enabled. + if context.config.overlay: + context.root.mkdir() + else: + make_tree(context.root, use_subvolumes=context.config.use_subvolumes, sandbox=context.sandbox) + + def build_image(context: Context) -> None: manifest = Manifest(context) if context.config.manifest_format else None @@ -3885,6 +3898,8 @@ def build_image(context: Context) -> None: with mount_base_trees(context): install_base_trees(context) cached = reuse_cache(context) + make_rootdir(context) + wantrepo = ( ( not cached @@ -4618,6 +4633,7 @@ def run_sync(args: Args, config: Config, *, resources: Path) -> None: resources=resources, package_cache_dir=config.package_cache_dir_or_default(), ) + context.root.mkdir(mode=0o755) install_package_manager_trees(context) context.config.distribution.setup(context) diff --git a/mkosi/context.py b/mkosi/context.py index 852fe756f..dd575e521 100644 --- a/mkosi/context.py +++ b/mkosi/context.py @@ -6,8 +6,6 @@ from pathlib import Path from typing import Optional from mkosi.config import Args, Config -from mkosi.sandbox import umask -from mkosi.tree import make_tree from mkosi.types import PathString @@ -30,20 +28,8 @@ class Context: self.resources = resources self.package_cache_dir = package_cache_dir or (self.root / "var") self.package_dir = package_dir or (self.workspace / "packages") - self.package_dir.mkdir(exist_ok=True) - - with umask(~0o755): - # Using a btrfs subvolume as the upperdir in an overlayfs results in EXDEV so make sure we create - # the root directory as a regular directory if the Overlay= option is enabled. - if config.overlay: - self.root.mkdir() - else: - make_tree( - self.root, - use_subvolumes=self.config.use_subvolumes, - sandbox=config.sandbox, - ) + self.package_dir.mkdir(exist_ok=True) self.staging.mkdir() self.pkgmngr.mkdir() self.repository.mkdir()