From 5871c450cca31efaf587b0ec227719d84ab1ce5c Mon Sep 17 00:00:00 2001 From: Daan De Meyer Date: Thu, 22 Aug 2024 13:42:20 +0200 Subject: [PATCH] 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. --- mkosi/__init__.py | 18 +++++++++++++++++- mkosi/context.py | 16 +--------------- 2 files changed, 18 insertions(+), 16 deletions(-) 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() -- 2.47.2